当前位置: 首页 > news >正文

mysql的cpu使用率100%问题排查

背景

线上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: 加瓦点灯,不错过每一次的干货!

http://www.lryc.cn/news/533238.html

相关文章:

  • centos虚拟机迁移没有ip的问题
  • 接入 deepseek 实现AI智能问诊
  • 用AVFrame + AVPacket 完成accede编码和直接用ffmpeg命令行实现acc编码的对比
  • 计算机网络笔记再战——理解几个经典的协议6——TCP与UDP
  • 【AI】在Ubuntu中使用docker对DeepSeek的部署与使用
  • openssl使用
  • 《语义捕捉全解析:从“我爱自然语言处理”到嵌入向量的全过程》
  • HIVE如何注册UDF函数
  • VsCode创建VUE项目
  • x64、aarch64、arm与RISC-V64:详解四种处理器架构
  • 如何使用iframe来渲染ThingsBoard仪表盘
  • 退格法记单词(类似甘特图)
  • 计算 MySQL 表行的成本是多少?
  • Pygame介绍与游戏开发
  • webpack配置方式
  • 10. k8s二进制集群之Kube Scheduler部署
  • java实现8583报文解析技术详解
  • k8s服务发现有哪些方式?
  • 【SqlServer】SQL Server Management Studio (SSMS) 下载、安装、配置使用及卸载——保姆级教程
  • [ESP32:Vscode+PlatformIO]添加第三方库 开源库 与Arduino导入第三方库的区别
  • 音频文件格式——AAC、OGG和FLAC
  • BUU26 [极客大挑战 2019]HardSQL1
  • 多光谱成像技术在华为Mate70系列的应用
  • 借助 Cursor 快速实现小程序前端开发
  • 【deepseek】ollama chatbox webui 本地部署deepseek 踩坑记录
  • 在离线的服务器上部署Python的安装库
  • 计算机网络笔记再战——理解几个经典的协议2
  • 设计高效的测试用例:从需求到验证
  • git reset 命令
  • docker被“遗忘”的那些参数该如何拯救