You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何查看MySQL中特定查询的CPU与内存占用情况?

确实,SHOW PROCESSLISTINFORMATION_SCHEMA.PROCESSLIST只能给你连接的基本信息,拿不到CPU和内存占用——这也是很多DBA日常排查时遇到的痛点。下面给你几个靠谱的方法,从MySQL内部和系统层面都能搞定:

方法1:用MySQL自带的Performance Schema(官方推荐)

Performance Schema是MySQL内置的性能监控模块,默认在5.7及以上版本是开启的(如果没开,需要在my.cnf里加performance_schema = ON然后重启服务)。它能直接追踪每个线程的CPU、内存使用情况,还能关联到PROCESSLIST的信息。

试试这个查询,把进程信息和资源占用整合到一起:

SELECT 
  p.id AS process_id,
  p.user,
  p.host,
  p.db,
  p.command,
  p.time,
  p.state,
  p.info,
  t.THREAD_OS_ID AS os_thread_id, -- 对应系统层面的线程ID
  TIMESTAMPDIFF(SECOND, t.THREAD_START_TIME, NOW()) AS thread_uptime_sec,
  es.CPU_TIME / 1000000 AS cpu_used_sec, -- 把微秒转成秒
  ms.current_allocated AS memory_allocated -- 当前分配的内存(带单位)
FROM 
  INFORMATION_SCHEMA.PROCESSLIST p
JOIN 
  performance_schema.threads t ON p.id = t.PROCESSLIST_ID
LEFT JOIN 
  performance_schema.events_statements_current es ON t.THREAD_ID = es.THREAD_ID
LEFT JOIN 
  performance_schema.memory_summary_by_thread_by_event_name ms 
  ON t.THREAD_ID = ms.THREAD_ID AND ms.EVENT_NAME = 'memory/performance_schema'
ORDER BY 
  cpu_used_sec DESC; -- 按CPU占用从高到低排序
方法2:用Sys Schema简化查询

如果你觉得Performance Schema的表结构太复杂,MySQL还自带了sys schema——它是基于Performance Schema和Information Schema做的简化视图,专门用来让普通用户快速查看监控数据。

直接查sys.processlist视图就能拿到整合后的资源信息:

SELECT 
  id,
  user,
  host,
  db,
  command,
  time,
  state,
  info,
  cpu_time, -- 累计CPU时间
  memory_usage, -- 内存占用
  os_thread_id
FROM 
  sys.processlist
WHERE 
  command != 'Sleep' -- 过滤掉休眠的连接
ORDER BY 
  cpu_time DESC;

这个视图已经帮你做好了关联和单位转换,结果一目了然。

方法3:结合系统工具(Linux层面)

如果MySQL内部的监控数据不够细,你还可以结合Linux的系统工具,因为MySQL的每个连接对应一个系统线程(注意:如果用了线程池模式,对应关系会不同,但默认是一个连接一个线程)。

步骤很简单:

  1. 先从MySQL里拿到线程对应的系统ID:
    SELECT id AS process_id, THREAD_OS_ID AS os_thread_id FROM performance_schema.threads WHERE PROCESSLIST_ID IS NOT NULL;
    
  2. pstop查这个线程的资源占用:
    • ps
      ps -L -p $(pgrep mysqld) -o tid,pcpu,pmem,cmd | grep <os_thread_id>
      
    • top实时查看:
      top -H -p $(pgrep mysqld)
      
      top界面里,找到对应TID(线程ID)的行,就能看到%CPU%MEM列的数值。

内容的提问来源于stack exchange,提问作者Ahasan Al Rabbi

火山引擎 最新活动