背景

线上mysql服务器经常性出现cpu使用率100%的告警, 因此整理一下排查该问题的常规流程。


1. 确认CPU占用来源

  • 检查系统进程
    使用 top htop 命令,确认是否是 mysqld 进程导致CPU满载:
    top-c-p$(pgrep mysqld)

2. 实时分析MySQL活动

  • 查看当前运行的SQL
    登录MySQL,执行以下命令,观察是否有长时间运行或高频率的查询:
    SHOWFULL PROCESSLIST;-- 或过滤非空闲连接SELECT*FROM INFORMATION_SCHEMA.PROCESSLIST 
    WHERE COMMAND !='Sleep'ANDTIME>0;

  • 终止问题查询
    若发现异常查询,可通过 KILL [PROCESS_ID] 终止。

3. 分析慢查询与执行计划

  • 启用慢查询日志
    在MySQL配置文件( my.cnf / my.ini )中启用慢查询日志:

    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 ,检查是否缺少索引或全表扫描:

    EXPLAINSELECT*FROM your_table WHERE your_condition;

4. 检查索引与表结构

  • 索引缺失
    通过 SHOW CREATE TABLE 检查表结构,确保高频查询字段有索引。
  • 冗余索引
    使用 pt-duplicate-key-checker 工具删除无效索引。
  • 统计信息过时
    执行 ANALYZE TABLE your_table; 更新统计信息。

5. 排查锁争用与事务

  • 查看当前锁状态
    SHOWENGINEINNODBSTATUS;-- 查看LATEST DETECTED DEADLOCKSELECT*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 :减少磁盘临时表。
  • 连接数监控
    SHOWSTATUSLIKE'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

快速处理步骤

  1. top 确认MySQL进程导致CPU满载。
  2. SHOW PROCESSLIST 查找异常查询。
  3. EXPLAIN 分析问题SQL,优化索引或查询逻辑。
  4. 终止阻塞进程( KILL )或重启MySQL(临时恢复)。

通过以上步骤,多数情况下可以定位到CPU过高的根本原因,如慢查询、索引缺失、配置不当或硬件瓶颈,进而针对性优化。若问题复杂,建议结合监控工具长期跟踪分析。

最后

欢迎点击关注gzh: ,不错过每一次的干货!