1. 确认CPU占用来源
-
检查系统进程
使用top
或htop
命令,确认是否是mysqld
进程导致CPU满载:
1 | top -c -p $(pgrep mysqld) |
2. 实时分析MySQL活动
-
查看当前运行的SQL
登录MySQL,执行以下命令,观察是否有长时间运行或高频率的查询:
1 2 3 4 | SHOW FULL PROCESSLIST; -- 或过滤非空闲连接 SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep' AND TIME > 0; |
-
终止问题查询
若发现异常查询,可通过KILL [PROCESS_ID]
终止。
3. 分析慢查询与执行计划
-
启用慢查询日志
在MySQL配置文件(my.cnf
/my.ini
)中启用慢查询日志:
1 2 3 | slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 -- 阈值(秒) |
-
重启MySQL后,使用
mysqldumpslow
或pt-query-digest
分析日志。 -
使用
EXPLAIN
分析SQL
对可疑查询添加EXPLAIN
,检查是否缺少索引或全表扫描:
1 | EXPLAIN SELECT * FROM your_table WHERE your_condition; |
4. 检查索引与表结构
-
索引缺失通过
SHOW CREATE TABLE
检查表结构,确保高频查询字段有索引。 -
冗余索引使用
pt-duplicate-key-checker
工具删除无效索引。 -
统计信息过时执行
ANALYZE TABLE your_table;
更新统计信息。
5. 排查锁争用与事务
- 查看当前锁状态
1 2 3 | SHOW ENGINE INNODB STATUS; -- 查看LATEST DETECTED DEADLOCK SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; -- 运行中的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; -- 当前持有的锁 |
- 长事务处理终止未提交的长事务或优化事务代码。
6. 检查MySQL配置
-
关键参数调优
-
innodb_buffer_pool_size
:建议设置为物理内存的70%-80%。 -
max_connections
:避免过高导致资源争用。 -
tmp_table_size
和max_heap_table_size
:减少磁盘临时表。
-
- 连接数监控
1 2 | SHOW STATUS LIKE 'Threads_connected' ; -- 当前连接数 SHOW VARIABLES LIKE 'max_connections' ; -- 最大允许连接数 |
7. 系统资源与硬件瓶颈
-
内存与交换分区使用
free -h
或vmstat
检查内存是否不足,导致频繁Swap。 -
磁盘I/O使用
iostat
或iotop
查看磁盘负载,优化高I/O操作(如批量写入、索引重建)。 -
CPU架构确认是否因并发线程过多导致CPU争用(如
innodb_thread_concurrency
设置)。
8. 其他可能原因
-
复制问题主从复制延迟或错误可能导致从库CPU升高,检查
SHOW SLAVE STATUS
。 -
缓存失效如查询缓存(
query_cache_type
)频繁失效,考虑关闭。 -
日志写入压力关闭不必要的日志(如通用查询日志),或调整
sync_binlog
参数。
9. 使用专业工具
- 监控工具Percona Monitoring and Management (PMM)、VividCortex 或 Prometheus + Grafana。
-
性能分析工具
pt-query-digest
、mysqlsla
或 MySQL自带的Performance Schema
。
快速处理步骤
-
top
确认MySQL进程导致CPU满载。 -
SHOW PROCESSLIST
查找异常查询。 -
EXPLAIN
分析问题SQL,优化索引或查询逻辑。 - 终止阻塞进程(
KILL
)或重启MySQL(临时恢复)。
通过以上步骤,多数情况下可以定位到CPU过高的根本原因,如慢查询、索引缺失、配置不当或硬件瓶颈,进而针对性优化。若问题复杂,建议结合监控工具长期跟踪分析。
最后
以上就是MySQL的cpu使用率100%的问题排查流程的详细内容,更多关于MySQL cpu使用率100%的资料请关注IT俱乐部其它相关文章!