文章来自:PHP开源社区
如何快速定位消耗 CPU 最高的 sql 语句,怎么做?看看下面的介绍。
如果是Oracle
数据库我们可以很容易通过sql来定位到当前数据库中哪些消耗CPU高的语句,而mysql数据库可以怎么定位呢?这里用一个简单例子说明下...
主要是了解如何定位的思路,具体看官网介绍..
参考:https://www.percona.com/blog/2020/04/23/a-simple-approach-to-troubleshooting-high-cpu-in-mysql/
主要意思是针对定位CPU的问题,Percona
增加了对通过信息的TID列将processlist ID
映射到OS
线程ID的支持,而MySQL在5.7版本后在PERFORMANCE_SCHEMA.THREADS
表加了一个THREAD_OS_ID
新列来实现,以下方法适用于在其他内核正常运行时,某个特定CPU的查询过载的情况。
find out which session is using the most CPU resources in my database?
pidstat -t -p <mysqld_pid> 1 5
参数解释:
pidstat:命令本身,用于显示系统中各进程的统计信息。
-t:显示线程级别的统计信息。默认情况下,pidstat 只显示进程级别的信息,使用 -t 参数可以查看更详细的每个线程的信息。
-p
1:采样间隔时间,单位为秒。表示每 1 秒采集一次统计信息。
5:采样次数。表示总共采集 5 次统计信息。
输出字段解释:
通过该命令我们可以定位到802、4445等线程消耗了大量的CPU,这里尽量确保在pidstat
的多个样本中验证消耗是恒定的。根据这些信息,我们可以登录到数据库,并使用以下查询找出哪个MySQL线程是罪魁祸首。
select * from performance_schema.threads where thread_os_id = xx ;
select * from information_schema.`PROCESSLIST` where id=threads.processlist_id
关于select * from performance_schema.threads where thread_os_id = xx ;
performance_schema.threads
表performance_schema.threads
是 MySQLPerformance Schema
中的一个表。Performance Schema
是一个用于监控 MySQL 服务器性能的工具,提供了对数据库服务器内部运行情况的详细监控和分析。threads
表包含有关 MySQL 服务器中每个线程的详细信息。thread_os_id
列thread_os_id
:这是threads
表中的一个列,表示与操作系统相关的线程 ID。这通常是操作系统分配给 MySQL 线程的 ID,用于将 MySQL 线程与操作系统级别的线程对应起来。
输出字段解释:
THREAD_ID:MySQL 线程 ID。
NAME:线程的名称。
TYPE:线程的类型。
PROCESSLIST_ID:与 SHOW PROCESSLIST 中的 ID 对应。
PROCESSLIST_USER:执行线程的用户。
PROCESSLIST_HOST:执行线程的主机。
PROCESSLIST_DB:执行线程的数据库。
THREAD_OS_ID:操作系统线程 ID(即 thread_os_id)。
PROCESSLIST_COMMAND:线程正在执行的命令。
PROCESSLIST_TIME:线程已执行的时间。
PROCESSLIST_STATE:线程当前的状态。
PARENT_THREAD_ID:父线程 ID。
ROLE:线程的角色。关于select * from information_schema.
PROCESSLIST
where id=threads.processlist_id ;threads.processlist_id
为上一条语句结果中得出information_schema.PROCESSLIST
表:包含当前所有连接到 MySQL 服务器的会话信息。id
列:唯一标识每个会话的 ID,等同SHOW PROCESSLIST
命令中的 ID。threads.processlist_id
:在performance_schema.threads
表中,每个线程processlist_id
用于将线程与PROCESSLIST
表中的会话关联起来。
根据操作系统id可以到processlist
表找到对应的会话,如下:
这里对应看一下执行计划基本就可以判断当前数据库CPU为什么消耗这么高了...
至于优化的点只需要在dock建一个索引即可,这里就不介绍了。