mysqlcpu占用过高 排查
以下是一些排查 MySQL CPU 占用过高问题的方法:
查看系统资源使用情况
- 使用
top命令查看系统中各个进程的 CPU 占用率,确定是否是 mysqld 进程导致 CPU 占用过高。如果 mysqld 进程的 CPU 使用率持续较高,说明问题可能出现在 MySQL 中. - 也可以使用
vmstat 1命令查看 CPU 使用率的动态变化情况,以便更准确地判断是否存在 CPU 占用过高的问题.
检查 MySQL 进程占用情况
- 通过
SHOW PROCESSLIST;命令查看当前 MySQL 服务器上的所有连接和执行的查询,重点关注 Time 列和 State 列,以判断是否存在执行时间较长的查询语句 。如果存在 State 为 Sending data 且 Time 值较大的查询,通常表示该查询较慢,可能是导致 CPU 占用过高的原因之一. - 还可以使用
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO IS NOT NULL;语句来获取更详细的进程信息.
分析慢查询日志
- 首先,通过
SHOW VARIABLES LIKE "slow_query_log";命令查看慢查询日志是否开启. - 如果未开启,可以使用
SET GLOBAL slow_query_log = "ON";命令开启慢查询日志,并使用SHOW VARIABLES LIKE "slow_query_log_file";命令查看慢查询日志的位置. - 然后,分析慢查询日志中的查询语句,找出执行时间较长的 SQL,再使用
EXPLAIN命令分析这些查询语句的执行计划,查看是否存在全表扫描、索引失效等问题,进而对查询语句进行优化.
检查数据库连接情况
- 查看是否存在大量空闲连接占用资源。通过
SHOW FULL PROCESSLIST;命令查看 Command 列是否有大量的 Sleep 状态的连接,如果这些连接的 Time 值很长,说明存在大量长时间睡眠的线程占用数据库连接,可能会导致数据库的吞吐量下降,进而引发 CPU 飘高的现象. - 可以修改
mysql配置文件中的wait_timeout空闲等待时间,或者通过SET GLOBAL wait_timeout=xx;方式热修改该参数,减少空闲连接的数量.
检查数据库参数设置
- 通过
SHOW VARIABLES LIKE "key_buffer_size";等命令查看数据库参数的设置情况,如max_connections、innodb_buffer_pool_size、query_cache_size等参数,判断是否因为参数设置不当导致 CPU 使用率过高. - 根据数据库的实际情况,合理调整这些参数的值,例如,如果连接数过高,可以适当降低
max_connections的值;如果缓冲池过小,可以适当增大innodb_buffer_pool_size的值.
检查查询语句和索引
- 检查是否存在复杂的查询语句或没有正确创建索引导致查询效率低下的情况。通过
EXPLAIN SELECT * FROM table_name WHERE condition;语句分析查询计划,查看是否存在全表扫描等问题,如果有则需要添加适当的索引来优化查询性能. - 避免使用
SELECT *,而是只选择需要的列;使用LIMIT限制结果集的大小;合理使用JOIN等方式优化查询语句,以减少 CPU 的使用.
检查数据库版本
- 确认当前使用的 MySQL 版本是否存在已知的性能问题。如果是,可以考虑及时升级 MySQL 版本至最新稳定版本,以获得更好的性能和稳定性.
检查是否存在锁等待和死锁
- 通过
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;语句查看当前运行的所有事务,检查是否有表锁等待或者死锁的情况。如果存在死锁,可以通过KILL trx_mysql_thread_id;命令杀掉当前运行的事务. - 还可以通过
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;语句查看当前出现的锁,以及通过特定的查询语句查看死锁的详细信息.

