背景

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


1. 确认CPU占用来源

  • 检查系统进程
    使用 tophtop 命令,确认是否是 mysqld 进程导致CPU满载:

    top -c -p $(pgrep mysqld)

2. 实时分析MySQL活动

  • 查看当前运行的SQL
    登录MySQL,执行以下命令,观察是否有长时间运行或高频率的查询:

    SHOW FULL PROCESSLIST;
    -- 或过滤非空闲连接
    SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST 
    WHERE COMMAND != 'Sleep' AND TIME > 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后,使用 mysqldumpslowpt-query-digest 分析日志。

  • 使用 EXPLAIN 分析SQL
    对可疑查询添加 EXPLAIN,检查是否缺少索引或全表扫描:

    EXPLAIN SELECT * FROM your_table WHERE your_condition;

4. 检查索引与表结构

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

5. 排查锁争用与事务

  • 查看当前锁状态

    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_sizemax_heap_table_size:减少磁盘临时表。
  • 连接数监控

    SHOW STATUS LIKE 'Threads_connected';  -- 当前连接数
    SHOW VARIABLES LIKE 'max_connections';  -- 最大允许连接数

7. 系统资源与硬件瓶颈

  • 内存与交换分区
    使用 free -hvmstat 检查内存是否不足,导致频繁Swap。
  • 磁盘I/O
    使用 iostatiotop 查看磁盘负载,优化高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-digestmysqlsla 或 MySQL自带的 Performance Schema

快速处理步骤

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

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

最后

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

本文由mdnice多平台发布


加瓦点灯
0 声望0 粉丝

北漂后端程序员