MYSQL CPU 使用率高,怎么查,怎么破

本文介绍了一种快速定位MYSQL CPU使用率高的方法,包括使用pidstat查看线程CPU使用率,结合查询确定问题连接,以及使用PMM监控系统查找CPU消耗点。通过实际案例测试,增加CPU数量并不能解决LOAD100%的问题。

MYSQL 的CPU 使用率高,干时间长的DB们都会遇到,其实其他的数据库也都是有类似的问题,CPU一升高。大部分DBA 的首要工作就是要看是不是有大事务,大查询,慢查询等等。实际上我们是不是有更好的快速定位的方法

下图我们可以看到系统CPU一直在 90%, 到底什么原因造成MYSQL的CPU 利用率一直高怎么分析。follow me.

我们通过pidstat 来查看当前MYSQL的线程中那个CPU的使用率比较高

可以通过上图看到0 和 1 号CPU 核心的使用率比较其他的核心要高,并且我们也看到TID ,线程的数字,然后我们拿到这些线程的ID 直接回到MYSQL 内部,我们看看到底这两个线程在做什么。

我们可以结合上面的查询

1 我们可以确定到底多核心CPU上到底那个核心的CPU的利用率比较高

2 通过查找到哪个核心的CPU的使用率多少,定位到MYSQL 中的有问题的连接。

另外也可以通过监控系统来查看CPU 消耗在哪里,例如可以使用PMM,查看CPU 的消耗点在哪里,如果是用户user的层面,那就可以确认是用户的某些线程消耗了CPU的资源。然后可以通过上面的手段来定位当前到底那些线程在大量的使用CPU

这里有一个插曲,曾经听到如果遇到这样的情况,添加CPU 暂时缓解CPU LOAD 100 percent 的情况,这里做了一个test.

将上面的有压力的MYSQL 的CPU 添加一倍从4 croe 变为 8核心,最终结果(至少在我这里),CPU的LOAD 基本上没有变化,在负载同样的情况。

另外同时可以用下面的脚本,看一下瞬时的  QPS TPS 看看是不是系统已经超负荷运行。

mysqladmin -uroot -p'password' --socket=/data/mysql/mysql.sock extended-status -i1|awk 'BEGIN{local_switch=0;print "QPS   Commit Rollback   TPS    Threads_con Threads_run \n------------------------------------------------------- "}

     $2 ~ /Queries$/            {q=$4-lq;lq=$4;}

     $2 ~ /Com_commit$/         {c=$4-lc;lc=$4;}

     $2 ~ /Com_rollback$/       {r=$4-lr;lr=$4;}

     $2 ~ /Threads_connected$/  {tc=$4;}

     $2 ~ /Threads_running$/    {tr=$4;

        if(local_switch==0) 

                {local_switch=1; count=0}

        else {

                if(count>10) 

                        {count=0;print "------------------------------------------------------- \nQPS   Commit Rollback   TPS    Threads_con Threads_run \n------------------------------------------------------- ";}

                else{ 

                        count+=1;

                        printf "%-6d %-8d %-7d %-8d %-10d %d \n", q,c,r,c+r,tc,tr;

                }

        }

}'

同时可以辅助查看当前的handler_read_rnd , handler_read_rnd_next 等参数,如果快速的增长,说明当前的查询有全表扫描或者无法有效利用索引的情况。

剩下的工作可能就要和相关的一些慢查询或者捕捉到的语句来进行相关的分析了。

<think>嗯,用户现在问的是MySQL数据库CPU使用率如何排。之前他们问过生产环境不能重启数据库的情况下如何监控内存分配,现在转向CPU的问题,可能他们正在面临性能问题,需要快速定位原因。作为技术支持,我需要提供一套系统化的排方法,确保用户能在不重启数据库的情况下找到问题根源。 首先,我得回忆一下常见的CPU的原因。通常,CPU可能是因为询效率低下,比如全表扫描、缺少索引、复杂连接操作,或者锁竞争、大量并发连接,甚至配置不当,比如缓冲区设置不合理。还有可能是硬件资源不足,比如CPU本身不够用。 接下来,我需要考虑用户可能的使用场景。用户是在生产环境,不能重启数据库,所以任何需要重启的调整都不适用。需要提供实时监控和动态调整的方法。用户可能没有root权限,或者只能通过SQL访问,所以需要分层次的解决方案,既有SQL层面的询,也有系统命令,可能还有需要管理员权限的工具。 接下来,我需要组织回答的结构。通常,排步骤应该从快速检开始,逐步深入。比如先确认当前负载,然后检询,分析当前活动会话,查看锁情况,检配置,最后系统级分析。可能还需要考虑复制延迟、存储引擎问题等。 需要确保提到的工具和命令都是可以在线执行的,不需要重启。比如使用SHOW PROCESSLIST、启用Performance Schema,使用sys schema,或者系统工具如top、perf、pt-query-digest等。还要注意权限问题,比如某些系统命令可能需要sudo,但用户可能没有权限,所以需要提供替代方案。 可能用户对某些工具不熟悉,需要给出具体的命令示例,比如如何启用Performance Schema的监控项,如何分析慢询日志,如何使用pt-query-digest工具。同时要提醒注意事项,比如开启监控对性能的影响,特别是在负载时。 还要考虑用户可能需要紧急处理,比如如何快速终止有问题的会话,或者调整某些变量来缓解问题,比如调整线程池大小或连接数限制,但要注意这些调整可能需要权限,并且临时生效还是永久生效的问题。 另外,可能需要解释一些术语,比如缓冲池命中率、锁等待,但用户之前可能已经了解过内存监控,所以可能有一定基础,可以适当使用术语,但保持解释清晰。 最后,总结一个排流程图或表格,帮助用户根据不同的场景选择合适的工具和方法,比如如果是慢询导致,就检慢日志;如果是锁竞争,就查看锁信息等。还要提醒用户长期优化的建议,比如定期分析慢询,优化索引,调整配置参数等。 需要确保回答结构清晰,分步骤,每个步骤有具体的操作和示例命令,同时给出可能的原因和解决方案。还要注意安全性,比如在终止会话前确认是否为问题会话,避免误操作影响生产环境。</think>--- ### MySQL CPU使用率指南(无需重启) --- #### 一、快速定位问题方向 **1. 确认CPU负载类型** ```bash # 查看CPU使用分布(用户态 vs 内核态) top -c -p $(pidof mysqld) ``` - **用户态CPU**:通常由SQL执行(如全表扫描、排序、复杂JOIN)导致 - **内核态CPU**:可能涉及锁竞争、I/O等待或网络问题 **2. 检当前活动线程** ```sql -- 查看正在执行的SQL(实时快照) SHOW PROCESSLIST; -- 或使用sys Schema增强版视图 SELECT * FROM sys.processlist WHERE command != 'Sleep' ORDER BY time DESC; ``` --- #### 二、核心排步骤 ##### 1. **抓取消耗SQL** **方法1:开启慢询日志(动态配置)** ```sql -- 临时开启慢日志(无需重启) SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1; -- 捕获超过1秒的询 SET GLOBAL log_queries_not_using_indexes = ON; -- 确认日志路径 SHOW VARIABLES LIKE 'slow_query_log_file'; ``` **方法2:使用Performance Schema(MySQL 5.6+)** ```sql -- 启用事件监控 UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE 'events_statements%'; -- 查看CPU时间Top10的SQL SELECT DIGEST_TEXT, SUM(CPU_TIME)/1000000 AS cpu_sec, COUNT_STAR AS exec_count FROM performance_schema.events_statements_summary_by_digest ORDER BY cpu_sec DESC LIMIT 10; ``` ##### 2. **分析锁竞争** ```sql -- 查看当前锁等待 SELECT * FROM sys.innodb_lock_waits; -- 检行锁冲突 SHOW ENGINE INNODB STATUS\G -- 关注 "TRANSACTIONS" 和 "LATEST DETECTED DEADLOCK" 部分 -- 查看表级锁 SHOW OPEN TABLES WHERE In_use > 0; ``` ##### 3. **检配置与资源** ```sql -- 关键参数检 SHOW VARIABLES LIKE 'innodb_thread_concurrency'; -- 并发线程限制 SHOW VARIABLES LIKE 'tmp_table_size'; -- 临时表内存阈值 SHOW STATUS LIKE 'Threads_running'; -- 当前活跃线程数 -- 缓冲池命中率(低于99%需警惕) SELECT (1 - (Variable_value / (Innodb_buffer_pool_read_requests + Innodb_buffer_pool_reads))) * 100 AS hit_rate FROM (SELECT VARIABLE_VALUE AS Innodb_buffer_pool_read_requests FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests') a, (SELECT VARIABLE_VALUE AS Innodb_buffer_pool_reads FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads') b; ``` --- #### 三、系统级诊断工具 ##### 1. **perf 火焰图定位热点函数** ```bash # 安装perf sudo apt-get install linux-perf # Ubuntu sudo yum install perf # CentOS # 采集MySQL进程CPU使用(采样30秒) sudo perf record -F 99 -p $(pidof mysqld) -g -- sleep 30 sudo perf script > out.stack # 使用FlameGraph生成火焰图 git clone https://github.com/brendangregg/FlameGraph ./FlameGraph/stackcollapse-perf.pl out.stack | ./FlameGraph/flamegraph.pl > cpu.svg ``` ##### 2. **pt-query-digest 分析SQL** ```bash # 分析慢询日志 pt-query-digest /var/lib/mysql/slow.log # 实时分析tcpdump流量(需权限) tcpdump -i eth0 -s 65535 -w - port 3306 | pt-query-digest --type tcpdump ``` --- #### 四、常见问题与应急处理 | 现象 | 快速验证方法 | 临时解决方案 | |-----------------------|----------------------------|--------------------------| | 全表扫描过多 | `EXPLAIN`查看执行计划 | 添加缺失索引 | | 排序操作消耗大 | 检`Sort_merge_passes`状态 | 增大`sort_buffer_size` | | 大量临时表到磁盘 | 监控`Created_tmp_disk_tables`| 增大`tmp_table_size` | | 锁等待严重 | `SHOW ENGINE INNODB STATUS`| 终止阻塞事务(`KILL [ID]`)| **紧急降负操作:** ```sql -- 限制最大连接数(动态调整) SET GLOBAL max_connections = 50; -- 关闭询缓存(如果启用) SET GLOBAL query_cache_size = 0; -- 终止消耗会话 SELECT id, time, info FROM information_schema.processlist WHERE command != 'Sleep' ORDER BY time DESC; KILL [problematic_thread_id]; ``` --- #### 五、长期优化建议 1. **索引优化** - 使用`pt-index-usage`分析索引有效性 - 定期运行`ANALYZE TABLE`更新统计信息 2. **架构调整** - 读写分离(使用MySQL Router或ProxySQL) - 热点数据拆分(分库分表) 3. **监控体系** ```bash # 推荐监控组合 Prometheus + Grafana + mysqld_exporter # 资源监控 Percona Monitoring and Management (PMM) # 专业MySQL监控 ``` --- ### 排流程图 ``` CPU负载 → 检用户态/内核态 → ├─用户态 → 分析慢询/执行计划 → 优化SQL或索引 ├─内核态 → 检锁竞争/I/O → 调整事务隔离级别/优化磁盘 └─系统级问题 → 使用perf火焰图 → 定位代码层问题 ``` 通过以上方法,可在不重启数据库的情况下精准定位CPU问题根源。对于复杂场景,建议结合多种工具交叉验证。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值