MySQL 故障诊断:MySQL 占用 CPU 过高问题定位及优化

这篇具有很好参考价值的文章主要介绍了MySQL 故障诊断:MySQL 占用 CPU 过高问题定位及优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CPU 占用过高常见现象
在使用 MySQL 的过程中会遇到各种瓶颈问题,常见的是 IO 瓶颈,但是有时候会出现服务器 CPU 使用率超过 100%,应用页面访问慢,登录服务器负载很高。而导致这个问题竟然是 MySQL 进程,按理说如果 MySQL 运行稳定,服务器的 CPU 资源并不会跑满,如果出现这个问题,初步可以断定,是 MySQL 实例中出现了问题 SQL。

CPU 占用过高常见原因:
服务器硬件问题
内存溢出
业务高并发
如果是业务高并发引起,可以理解为一种业务繁忙的状态,有可能业务猛增,有可能是定期或者临时的并发窗口:

数据库对象设计不合理
触发器导致
表索引设计不合理
数据库锁导致,如行锁冲突、行锁等待、锁超时、死锁等
系统架构没有缓存中间件
读写分离配置不合理
OLTP 系统承载了 OLAP 的业务需求
未合理升级改造为集群环境
未配置异构数据分析系统
MySQL 系统参数设置不合理
问题 SQL 导致
SQL 问题导致 CPU 使用率过高是最常见的现象,比如 group by、order by、join 等,这些很大程度影响 SQL 执行效率,从而占用大量的系统资源。

说了这么多常见原因,其实总结一句话来说就是现有系统的现有配置下的现有环境提供不了所需要的数据查询、分析、执行能力,针对这个问题,首先我们要发现问题的所在,就是说我们要准确的定位问题,然后针对问题进行优化,再考虑其他升级改造的事情。

定位分析问题 SQL
光说不练假把式,接下来我们比划比划。

首先,搭建一套模拟环境,这里我让我的得力助手 DBdeployer 来帮我搭建一套模拟环境。

DBdeployer 是用 Go 语言实现的一款非常强大与高效的部署数据库环境的开源工具,我们完全可以用它来部署开发、测试环境。

使用 DBdeployer 来部署一个单点 5.7.27 版本的 MySQL,并配置一个模拟 CPU 占比高的测试环境。

复制
[root@localhost ~]# dbdeployer deploy single 5.7.27
Database installed in /dbdata/sandboxes/msb_5_7_27
run ‘dbdeployer usage single’ for basic instructions’
… sandbox server started
1.
2.
3.
4.
创建测试表:

复制
[root@localhost ~]# cd /dbdata/sandboxes/msb_5_7_27/
[root@localhost msb_5_7_27]# ./use
mysql [localhost:5727] {msandbox} ((none)) > use test
Database changed
mysql [localhost:5727] {msandbox} (test) > create table t_cpu(id int primary key auto_increment);
Query OK, 0 rows affected (0.39 sec)
1.
2.
3.
4.
5.
6.
插入大量模拟测试数据:

复制
mysql [localhost:5727] {msandbox} (test) > insert into t_cpu values(),(),(),(),();
Query OK, 5 rows affected (0.06 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql [localhost:5727] {msandbox} (test) > insert into t_cpu select id+(select count(*) from t_cpu) from t_cpu;
Query OK, 5 rows affected (0.05 sec)
Records: 5 Duplicates: 0 Warnings: 0


mysql [localhost:5727] {msandbox} (test) > insert into t_cpu select id+(select count(*) from t_cpu) from t_cpu;
Query OK, 5242880 rows affected (1 min 8.84 sec)
Records: 5242880 Duplicates: 0 Warnings: 0

mysql [localhost:5727] {msandbox} (test) > select count() from t_cpu;
±---------+
| count(
) |
±---------+
| 10485760 |
±---------+
1 row in set (2.22 sec)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
至此我们已经造了 10485760 条数据。

有 1000W+ 的数据量了,我们模拟一个业务场景,让 CPU 嗨(high)起来。

执行一个慢查询:

复制
mysql [localhost:5727] {msandbox} (test) > select * from t_cpu order by rand() limit 1;
1.
另外开一个会话,top 看看进程:

复制
top - 15:21:20 up 33 days, 23:10, 3 users, load average: 0.38, 0.19, 0.21
Tasks: 202 total, 2 running, 200 sleeping, 0 stopped, 0 zombie
%Cpu(s): 23.3 us, 3.6 sy, 0.0 ni, 73.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8173716 total, 2867684 free, 1059276 used, 4246756 buff/cache
KiB Swap: 2097148 total, 2097140 free, 8 used. 6761912 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32232 root 20 0 1443252 356688 11748 S 107.0 4.4 2:03.82 mysqld
296 root 20 0 67044 15588 1440 S 0.7 0.2 325:32.46 plymouthd
600 root 20 0 162032 2360 1580 R 0.3 0.0 0:04.21 top
1901 gnome-i+ 20 0 714116 22436 9168 S 0.3 0.3 98:46.20 gsd-color
1 root 20 0 191264 4192 2632 S 0.0 0.1 18:39.97 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:01.28 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.95 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:02.08 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
通过 top 我们发现有一个 32232 的进程使得 CPU 使用率已经超过了 100%。

接下来我们具体分析分析,究竟是什么导致 CPU 使用率达到 100%以上的。

检查内存使用情况
复制
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 7982 1033 2801 40 4147 6604
Swap: 2047 0 2047
1.
2.
3.
4.
内存使用率还可以,应该不是内存影响导致的问题。

检查服务器线程
方法一:
复制
top -H -p <mysqld 进程 id>
1.
先通过 top 找出占用 CPU 使用率 100% 的 MySQL 进程 32232,在具体查看该进程下的线程情况。

复制
[root@localhost ~]# top -H -p 32232
top - 15:30:32 up 33 days, 23:20, 3 users, load average: 0.18, 0.15, 0.18
Threads: 28 total, 1 running, 27 sleeping, 0 stopped, 0 zombie
%Cpu(s): 24.4 us, 3.2 sy, 0.0 ni, 72.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8173716 total, 2867420 free, 1059520 used, 4246776 buff/cache
KiB Swap: 2097148 total, 2097140 free, 8 used. 6761668 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32272 root 20 0 1443252 356688 11748 R 99.7 4.4 2:25.74 mysqld
32244 root 0 -20 1443252 356688 11748 S 3.7文章来源地址https://www.toymoban.com/news/detail-857886.html

到了这里,关于MySQL 故障诊断:MySQL 占用 CPU 过高问题定位及优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java CPU或内存使用率过高问题定位教程

    Spring cloud微服务广泛应用后,服务的监控和运维压力也与日俱增,经常有服务出现CPU或者内存使用率过高的告警,那么遇到这样的问题我们该如何排查呢?我们可以借助哪些工具来定位问题呢?本文将介绍一下遇到此类问题的解决思路和方法。 1.通过应用日志定位思路 对于业

    2024年03月28日
    浏览(58)
  • mysql内存占用过高的问题

    现象:在mysql运行一天之后,发现内存占用量达到总内存的百分之77,且swap被占用百分之50 问题检查如下: 第一步:开启内存使用的监控服务 第二步: 查看正常实例的使用情况 第三步: 查看内存监控表数据 第三步: 查看事件类型下的内存量 问题解决:         当事件的

    2024年02月11日
    浏览(63)
  • Windows10 explorer资源管理器长时间CPU占用过高问题的调试解决过程————从懵到懂

    版本:windows10专业版 版本号:21H2 操作系统内部版本:19044.1586 使用微软提供的工具:ProcessExplorer 查看explorer进程的栈、使用率信息(使用方法请自行百度)。 问题测试方法: 1).为了便于观察,使用快捷键windows + E 快速 打开10个资源管理器。 2).打开ProcessExplorer 查看explorer进

    2024年02月05日
    浏览(44)
  • 使用Process Explorer和Clumsy定位软件高CPU占用问题

    目录 1、问题描述 2、使用Process Explorer初步找到CPU占用高的原因 3、使用Clumsy工

    2023年04月09日
    浏览(46)
  • 中柏 EZpad 8 Windows 平板电脑 |驱动备份|系统优化|不能调节显示器亮度|进入Bios/uefi 快捷键 |蓝牙扫描不到设备|CPU占用过高解决方案

              之前一直使用的这个平板,但是有个很严重的问题就是性能实在太差了,每次都是CPU百分百,Mem 百分之50% 这个结果真的很意外, 但是又无可奈何,后面花时间做了一些优化包括 进程限制  启动优化  内存页面优化  但结果都不尽人意,一启动程序就卡顿 ..........  中间又

    2024年02月09日
    浏览(124)
  • java 程序cpu占用过高排查

    取得cpu占用最高的PID: 27791 方式一 cgroup 如果输出中包含有类似 /docker/container_id 的字符串,就表示该进程在 Docker 容器中。 方式二 lsns   lsns命令查看程序的命名空间  ,如果显示的命名空间信息中有 ipc , mnt , net , pid , user , uts ,那么该 PID 很可能在一个 Docker 容器中。 方式三

    2024年02月07日
    浏览(52)
  • macOS mds_stores CPU占用过高

    当 macOS 的 mds_stores 进程占用过高的 CPU 使用率时,可能是由于 Spotlight 索引过程导致的。Spotlight 是 macOS 中用于搜索和索引文件的系统服务,而 mds_stores 是其索引进程之一。 以下是一些可能的解决方法: 等待一段时间:如果 mds_stores 进程正在进行大量的索引工作,可能需要一

    2024年02月16日
    浏览(43)
  • 解决antimalware service executable程序占用CPU过高(有效)

    有很多Win10的用户有时会莫名的电脑非常的卡,打开任务管理器查看进程情况,发现有一个Antimalware service executable进程CPU和内存占用率极高。 这个进程也无法关闭(妥妥的流氓): Antimalware Service Executable是win10内置杀毒软件windows defender的一个进程。对于普通用户来说,一般情

    2024年02月12日
    浏览(42)
  • 【面试】线上Java程序占用 CPU 过高请说一下排查方法?

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的。 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 这就是一个套路题,所谓套路题就是有标准的套路解法的,掌握了套路,不仅能解

    2024年02月09日
    浏览(47)
  • Vmmem进程(WSL)占用CPU或内存资源过高的解决办法

            有没有一瞬间,在开启docker或打开虚拟机时,内存瞬间飚增,进行查看进程消耗是一个Vmmem的进程在作祟,那么Vmmem是什么呢,又如何进行限制呢!         Vmmem: 是一个系统合成的虚拟进程,用于表示虚拟机小航的内存和CPU资源。换句话说,您看到的Vmmem消耗

    2024年02月13日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包