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

【面试题001】生产环境中如何排查MySQL CPU占用率高达100%?

1.确认CPU高占用是否由MySQL进程引起

使用系统命令(如tophtop)确认是mysqlId进程导致CPU飙高,排除系统其他进程干扰。

  • top -c-c 参数,显示完整命令行(可更清楚看到是 mysqld);默认按 %CPU 排序,看到 CPU 占用最高的进程
    • 判断方法:看是否是 mysqld 占用了大部分 CPU(比如 80%+);如果服务器是多核,CPU 总占用可以超过 100%(比如 300% 表示用了 3 核);如果不是 mysqld 占用高,而是其他进程如 javapython,说明你要调查的目标不是 MySQL

  • htop:需要提前安装。图形界面更直观,支持筛选进程、查看 CPU 核心利用情况,可以按 F6 选择排序字段(比如按 %CPU 排序)

2.查看MySQL当前线程和执行的SQL

执行 SHOW FULL PROCESSLIST;,观察当前正在执行的SQL,排查是否有大量复杂或慢查询、锁等待、阻塞线程。

  • 重点关注 CommandQueryTime 较长(大于10s)、StateSending dataLocked 的线程,判断是否存在慢查询或阻塞线程。

3.分析慢查询日志和一般查询日志

检查是否开启慢查询日志,定位执行时间长、消耗资源高的SQL语句,针对这些SQL进行优化。

  • 慢查询日志:慢查询日志 MySQL提供的一种日志机制,用于记录执行时间超过指定阈值的SQL语句。
  • 登录MySQL查看是否开启慢查询:SHOW VARIABLES LIKE '%slow_query_log%';
  • 如果没有开启,可以通过以下语句临时启用(重启失效):SET GLOBAL slow_query_log = 'ON';  

4.查看SQL执行计划

针对高耗CPU的SQL语句,使用EXPLAIN分析执行计划,判断是否存在全表扫描、缺索引、临时表等影响性能的因素。

  • EXPLAIN 是 MySQL 提供的命令,用于查看 SQL 的执行计划,包括是否使用索引、扫描方式、连接方式等,可以评估该 SQL 的性能。
  • 基本语法:EXPLAIN SELECT * FROM your_table WHERE your_column = 'xxx';执行后会得到类似这样的输出:
  • 重点关注 type 字段是否为 ALL(全表扫描)、Extra 是否包含 Using filesortUsing temporary。如果存在这些问题,我会通过添加合适索引、调整 SQL 写法(如避免 SELECT *、避免 %模糊匹配)、优化字段类型等手段提升性能。

5.检查锁和事务情况

SHOW ENGINE INNODB STATUS\G查看InnoDB锁信息,确认是否存在锁等待或死锁导致线程阻塞和CPU负载。

  • 这是 MySQL 提供的 InnoDB 存储引擎状态查看命令,输出内容很多,重点关注:
    •  死锁信息(LATEST DETECTED DEADLOCK)
    • 当前锁等待(TRANSACTIONS)
    • 阻塞线程信息
  • 登录MySQL后执行该命令。特别关注 LATEST DETECTED DEADLOCK(死锁)、TRANSACTIONS(是否存在等待锁的事务)、SEMAPHORES(是否存在严重锁竞争)。如果发现问题,结合业务逻辑优化事务提交时间、索引策略、表结构等,缓解锁争用带来的高 CPU 和延迟问题。

6.观察系统整体资源状况

通过vmstatiostatsar等( Linux/Unix 系统工具,在 Windows 系统中默认是无法直接使用的)系统工具检查磁盘IO、内存、网络等是否有瓶颈,避免CPU因等待IO造成的假高负载。

  • vmstat —— 综合查看 CPU、内存、IO 状况:vmstat 1 5 每隔 1 秒采样一次,总共采样 5 次。
  • sar —— 历史性能趋势分析(CPU、网络、磁盘)
    • sar -u 1 5      # 查看CPU状态
    • sar -r 1 5      # 查看内存
    • sar -n DEV 1 5  # 查看网络流量
  • 使用vmstatiostatsar 分析 CPU 占用是否因 IO 等待引起(即假高负载)。特别关注 wa(等待IO)指标是否高于 20%,以及磁盘 %util 是否超过 80%、await 是否较高。如果发现 IO 或内存瓶颈,进一步检查磁盘压力来源,比如慢查询、大量日志写入,或者缓存失效引发的大量磁盘访问。
http://www.lryc.cn/news/571937.html

相关文章:

  • NAT 与代理服务器 -- NAT,NAPT,正向代理,反向代理
  • 前端面试专栏-主流框架:10. React状态管理方案(Redux、Mobx、Zustand)
  • 【C语言极简自学笔记】重讲运算符
  • LVS+Keepliaved高可用群集
  • 【MySQL数据库 | 第五篇】DDL操作2
  • RabbitMQ概念
  • 深入解析线程池与队列系统设计原理
  • 【网工】华为配置专题进阶篇②
  • Oracle 创建定时任务
  • Web服务器/tmp隔离的安全性与绕过分析
  • VSCode 插件 Remote - SSH:开启高效远程开发之旅
  • SpringBoot电脑商城项目--新增收获地址
  • 系统的性能优化
  • kettle好用吗?相较于国产ETL工具有哪些优劣之处?
  • git的使用——初步认识git和基础操作
  • 【Datawhale组队学习202506】零基础学爬虫 01 初始爬虫
  • Goursat问题解的公式推导
  • TikTok 矩阵如何快速涨粉
  • html中的table标签以及相关标签
  • 微信二次开发,对接智能客服逻辑
  • 百度下拉框出词技术解密:72小时出下拉词软件原理分享
  • 5G光网络新突破:<Light: Science Applications>报道可适应环境扰动的DRC实时校准技术
  • OpenStack 入门与实践
  • 激光雷达与视频融合(DeepFusion)的多模态高精度目标定位
  • PostgreSQL的扩展bloom
  • 数学建模会议笔记
  • STM32 HAL 库串口收发完全指南:从基础配置到实战应用
  • 标杆确立!永洪科技位于IDC报告Data Analytics领域象限排头位!
  • 操作系统期末复习--操作系统初识以及进程与线程
  • 实时中值滤波 + 低通滤波 示例程序(STM32环境)