MySQL高负载排查方法最佳实践(15/16)

news/2024/5/2 22:03:15

高负载排查方法

CPU占用率过高问题排查
  1. 使用mpstat查看cpu使用情况。
# mpstat 是一款 CPU 性能指标实时展示工具
# 能展示每个 CPU 核的资源视情况,同时还能将资源使用情况进行汇总展示
# 如果CPU0 的 %idle 已经为 0 ,说明此核已经非常繁忙# 打印所有cpu核的情况(ALL),每隔1s打印一次,共打印5次
mpstat -P ALL 1 5

从上面可以看到,服务器有 2 个 CPU(分别为0、1),每个 CPU 核的资源使用情况,也能很清晰的展示。

当服务器有特别多的 CPU 核,有时候看 CPU 汇总信息,发现 CPU 的 idle 很高,但是上面跑的应用程序却很慢,这个时候就需要看看每个核的资源试用情况了。

重点关注指标:

* %iowait:代表在监控的时间间隔内,等待硬盘 I/O 的时间,如果此值比较高,说明 IO 非常繁忙
* %idle:代表在监控的时间间隔内,CPU 闲置时间所占用的时间百分比,此值越大,代表 CPU 越空闲
  1. 使用pidstat查看消耗cpu资源的进程。
# 参数-u表明监控cpu使用情况
# 参数2表示每隔2s输出一次,会循环输出pidstat -u 2Linux 3.10.0-957.el7.x86_64 (mysql)     12/30/2020      _x86_64_        (1 CPU)04:57:41 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
04:57:43 PM  2001     10733    0.00   91.44    0.00   91.44     0  mysqld
04:57:43 PM  2001     12635    0.00    0.53    0.00    0.53     0  pidstat

从上面的结果可以看到,导致 CPU0 资源被耗尽的元凶是 mysqld 进程,占用91.44%,需要定位具体线程。

  • pidstat 是一个非常强大的性能指标监控工具,建议一定要掌握,此工具可以用来监控全部或指定进程的 CPU、mem、线程,IO 的资源的使用情况。
# 参数-d表示监控进程对磁盘的使用情况
pidstat -d 2Linux 3.10.0-957.el7.x86_64 (mysql) 12/30/2020 _x86_64_ (1 CPU)03:57:47 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
03:57:49 PM 2001 10733 139.13 0.00 0.00 mysqld03:57:49 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
03:57:51 PM 2001 10733 34034.78 0.00 0.00 mysqld
  • 可以查看指定进程的线程 CPU 资源使用情况。
# 参数 -t,可以获取指定进程的线程的 CPU 使用情况
pidstat -t 2 -p 10733
  1. 使用 pidstat 查看消耗 CPU 资源的线程
pidstat -t 2 -p 10733Linux 3.10.0-957.el7.x86_64 (mysql)     12/30/2020      _x86_64_        (1 CPU)05:00:53 PM   UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
05:00:55 PM  2001     10733         -    0.00   91.30    0.00   91.30     0  mysqld
05:00:55 PM  2001         -     10733    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10734    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10735    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10736    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10737    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10738    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10739    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10740    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10741    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10742    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10743    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10744    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10745    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10747    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10748    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10749    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10750    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10751    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10752    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10753    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10754    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10755    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10756    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10757    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10758    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10762    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10763    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10764    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10766    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10796    0.00    0.00    0.00    0.00     0  |__mysqld
05:00:55 PM  2001         -     10850   15.22   75.54    0.00   90.76     0  |__mysqld

可以很清楚看到是 10850 线程消耗了 CPU 资源,剩下的就根据操作系统的里线程 ID,去 MySQL 数据库里排查,此线程正在执行的操作。

  1. MySQL中查询线程对应的具体SQL
-- 在 MySQL 5.7 版本,官方增加了一个视图,专门记录操作系统线程和数据库进程之间关联视图。
-- 前面定位的最消耗 IO 和 CPU 的线程 ID 为 10850:
select PROCESSLIST_ID,
THREAD_OS_ID,
PROCESSLIST_USER,
PROCESSLIST_HOST,
PROCESSLIST_DB,
PROCESSLIST_COMMAND,
PROCESSLIST_INFO 
from performance_schema.threads 
where THREAD_OS_ID=10850;
磁盘IO占用率过高排查
  1. 使用 iostat 查看磁盘 IO 的读写情况。
# 每隔1s输出一次
iostat -mxt 1# 每隔1s输出一次,共输出2次
iostat -mxt 1 2

如果看到 %util 比较高,说明磁盘设备繁忙,需要定位到底是那个操作系统进程导致的大量读操作。

  • iostat 是一款用于监控系统设备的 IO 负载情况的工具,在运维工作中会被高频使用的工具之一。
# 常用参数介绍* -m:输出结果以兆为单位显示
* -t:输出结果中显示时间戳
* -x:显示和 IO 相关的扩展数据,包括每个设备的读写、合并读、合并写、读写等待情况# 输出指标介绍* rrqm/s:每秒合并读的条目
* wrqm/s:每秒合并写的条目
* r/s:每秒 read I/O 设备次数
* w/s:每秒 write I/O 设备次数
* rMB/s: 每秒读取 M 字节数
* wMB/s:每秒写 M 字节数
* avgrq-sz:每次设备 I/O 操作平均数据大小
* avgqu-sz:I/O 队列平均长度
* await:每次设备 I/O 操作的平均等待时间,单位毫秒
* r_await:每次读 I/O 操作的平均等待时间,单位毫秒
* w_await:每次写 I/O 操作的平均等待时间,单位毫秒
* svctm:每次设备 I/O 操作的平均服务时间,单位毫秒
* %util:每秒中有百分之多少的时间用于 I/O 操作,此值越高,代表着磁盘越繁忙
  1. 使用 iotop 定位最消耗 IO 资源的元凶
iotop -p 10733

10850 线程大量读操作,导致 IO 资源被消耗殆尽。

  • iotop 是一款用于监视磁盘设备 I/O 使用状况的工具,可监测到具体的线程使用的磁盘 IO 的信息,功能也是非常强大,可惜需要 root 权限,普通用户没有执行权限,所以一般会用 pidstat 工具来替代。
参数介绍:-P:只显示进程 IO 读写情况 
-p:监控指定进程的 IO 读写情况 
-u:指定用户进程的 IO 读写情况1. 查看指定用户的的进程
iotop -u mysql -P2. 查看指定用户的进程和线程 IO 读写情况
iotop -u mysql3. 查看指定进程的线程 IO 读写情况
iotop -p 10733
  1. 根据线程定位具体SQL。
select PROCESSLIST_ID,
THREAD_OS_ID,
PROCESSLIST_USER,
PROCESSLIST_HOST,
PROCESSLIST_DB,
PROCESSLIST_COMMAND,
PROCESSLIST_INFO 
from performance_schema.threads 
where THREAD_OS_ID=10850;
其它运维工具

1. vmstat 工具(Virtual Meomory Statistics 虚拟内存统计):

可以对 Linux 操作系统的虚拟内存、进程、IO 读写情况、CPU 活动等展示概要监控信息,缺点是无法对某个进程进行深入分析。

# 不带任何参数,每秒打印一条记录,总共打印 10 次
# 缺省次数10,则会一直打印。
vmstat 1 10procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 2816 86252 0 552252 0 0 1303 3494 259 307 6 4 90 1 0
0 0 2816 86228 0 552252 0 0 0 0 53 110 0 0 100 0 0
0 0 2816 86228 0 552252 0 0 0 0 64 123 0 1 99 0 0
0 0 2816 86228 0 552252 0 0 0 0 53 106 0 0 100 0 0
0 0 2816 86228 0 552252 0 0 0 0 53 107 0 0 100 0 0
0 0 2816 86228 0 552252 0 0 0 0 58 112 0 0 100 0 0
0 0 2816 86228 0 552252 0 0 0 0 57 110 0 1 99 0 0
0 0 2816 86228 0 552252 0 0 0 0 57 115 0 0 100 0 0
0 0 2816 86228 0 552252 0 0 0 0 55 109 0 0 100 0 0
0 0 2816 86228 0 552252 0 0 0 0 58 114 0 0 100 0 0

重要指标:

* r:此指标代表正在运行的进程
* b:此指标代表被阻塞的进程,如果此指标大于 0,表示服务器非常繁忙
* swpd:此指标代表虚拟内存已使用的大小,如果大于 0,代表物理内存不足,需要排查是什么进程导致物理不足
* si:每秒从磁盘读入虚拟内存的大小,这个值大于 0,代表物理内存不足,需要排查是什么进程导致物理不足
* so:每秒虚拟内存写入磁盘的大小,这个值大于 0,代表物理内存不足,需要排查是什么进程导致物理不足
* us、sy、id:代表着服务器 CPU 的繁忙程度,如果 id 值越小,表示 CPU 越繁忙

2. top工具

top 是一款 Linux 系统下经常被用来做性能分析的工具,它可以实时动态的展示进程,线程的资源使用情况,在 top 工具展示监控指标里,运维人员最关心的是 cpu 和 mem 的使用情况。

# 使用 top 对 Linux 操作所有进程按照 CPU 使用率排序
toptop - 15:30:25 up 6:19, 4 users, load average: 0.04, 0.05, 0.05
Tasks: 122 total, 1 running, 121 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
KiB Mem : 1233464 total, 86056 free, 595080 used, 552328 buff/cache
KiB Swap: 2097148 total, 2094332 free, 2816 used. 459292 avail MemPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12404 root 20 0 162120 2268 1548 R 0.7 0.2 0:00.05 top
9777 root 20 0 161372 4952 3496 S 0.3 0.4 0:03.28 sshd
10733 mysql 20 0 1303472 488904 6652 S 0.3 39.6 62:02.58 mysqld
12397 mysql 20 0 161988 2172 1556 S 0.3 0.2 0:00.16 top
12398 root 20 0 0 0 0 S 0.3 0.0 0:00.03 kworker/0:1
1 root 20 0 125452 3472 2148 S 0.0 0.3 0:02.90 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:48.02 ksoftirqd/0

top 不带任何参数的情况下,是按照 CPU 使用来排序的,可以敲击键盘“x”来,高亮显示排序指标列:

如果要切换排序指标列,可以用“shift+<”或者“shift+>”来调整,例如按照内存使用排序:

支持查看某进程的线程情况。

# 查找mysqld的pid号
ps -ef|grep -i mysqld|egrep -v "mysqld_safe|grep"# 10733是找到的pid
top -H -p 10733

作者与版本更新计划

感谢您的阅读与支持!本文是《MySQL实战与优化》专栏中的一篇精选文章,该专栏共包含16篇文章,旨在为您提供实战中可直接应用的宝贵知识。

关注公众号【数舟】,获取作者最新动态,公众号后台回复【mysql2024】,即可免费领取这份包含16篇文章的完整的PDF专栏!

目前版本为v1.0,更新时间2024年4月10日。后续此文档更新与版本发布会同步到知识星球【数舟】中。

知识整理与创作不易,感谢大家理解与支持!

加入知识星球,您将获得更多独家内容、专栏更新以及与行业内专家和同行的互动交流机会。我们在知识星球等您,一起探索MySQL的深层次世界!

星球内目前包含300+精品文章,内容涵盖大数据、MySQL、运维、Python、调优、经验分享、数据分析等方向内容,会根据大家的学习需求更新更多方向的内容。

🔗 立即扫描下方二维码,加入知识星球,与行业精英共同成长,开启您的专属学习之旅!


http://www.mrgr.cn/p/21545156

相关文章

C++ | Leetcode C++题解之第23题合并K个升序链表

题目: 题解&#xff1a; class Solution {// 21. 合并两个有序链表ListNode *mergeTwoLists(ListNode *list1, ListNode *list2) {auto dummy new ListNode(); // 用哨兵节点简化代码逻辑auto cur dummy; // cur 指向新链表的末尾while (list1 && list2) {if (list1…

DC-1

DC-1DC-1渗透测试过程 端口扫描 nmap -sC -sV -Pn 192.168.56.119PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 111/tcp open rpcbind开了三个端口 访问web页面 发现是drupal这个cms,用droopescan进行扫描 droopescan scan drupal -u http://192.168.56.119[…

deepspeed 训练多机多卡报错 ncclSystemError Last error

最近在搞分布式训练大模型,踩了两个晚上的坑今天终于爬出来了 我们使用 2台 8*H100 遇到过 错误1 10.255.19.85: ncclSystemError: System call (e.g. socket, malloc) or external library call failed or device error. 10.255.19.85: Last error:10.255.19.85: socketStart…

ChatGPT在遥感领域中的应用

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用&#xff0c;人工智…

RC4Drop加密技术:原理、实践与安全性探究

第一章:介绍 1.1 加密技术的重要性 加密技术在当今信息社会中扮演着至关重要的角色。通过加密,我们可以保护敏感信息的机密性,防止信息被未经授权的用户访问、窃取或篡改。加密技术还可以确保数据在传输过程中的安全性,有效防止信息泄露和数据被篡改的风险。在网络通信、电…

初学python记录:力扣928. 尽量减少恶意软件的传播 II

题目&#xff1a; 给定一个由 n 个节点组成的网络&#xff0c;用 n x n 个邻接矩阵 graph 表示。在节点网络中&#xff0c;只有当 graph[i][j] 1 时&#xff0c;节点 i 能够直接连接到另一个节点 j。 一些节点 initial 最初被恶意软件感染。只要两个节点直接连接&#xff0c…

7-04. 实现数据读取开始新游戏和加载进度

修改 SaveSlotUI修改 DataSlot修改 TransitionManager修改 DataSlot修改 SaveSlotUI修改 SaveLoadManager修改 EventHandler修改 SaveSlotUI新游戏需要执行的操作 Player修改 Settings这个坐标请去 Unity 里面进行查看 NPC 的初始位置具体数值以 Unity 实际情况为准 InventoryM…

搭建Appium工具环境

1、安装Java Development Kit&#xff08;JDK&#xff09; 前往Oracle官网下载JDK。 在https://www.oracle.com/java/technologies/javase-jdk11-downloads.html 找到最新版本的JDK。根据操作系统选择适合的版本&#xff0c;并根据指示下载安装程序。 安装JDK。运行下载的安…

ES6 全详解 let 、 const 、解构赋值、剩余运算符、函数默认参数、扩展运算符、箭头函数、新增方法,promise、Set、class等等

目录 ES6概念ECMAScript6简介ECMAScript 和 JavaScript 的关系ES6 与 ECMAScript 2015 的关系 1、let 、 const 、var 区别2、变量解构赋值1、数组解构赋值2、对象解构赋值3、字符串的解构赋值 3、展开剩余运算符1、**展开运算符(...)**2、**剩余运算符(...)** 4、函数的拓展函…

python自动化之网易自动点歌

这个代码是是使用的pyautogui库和pyperclip库完成的&#xff0c;这个库是开源的地址如下&#xff1a;https://github.com/asweigart/pyautogui这里详细的用法想学习的可以到这看看 下面是代码&#xff1a; import pyautogui import subprocess import pyperclip import time i…

[03] JS-基础语法(二)

1. 判断、循环 1.1 if-elseif 语句 if else 语句 if else if else 语句e.g. 编写一个程序,获取一个用户输入的整数,然后显示这个数是奇数还是偶数。 // 编写一个程序,获取一个用户输入的整数 // let num = +prompt("请输入一个整数") let num = parseInt(prompt(&…

栈5-后缀表达式求解

栈5-后缀表达式的求解求解过程 8 3 1 - 5 * +数字:进栈 [1,3,8] 符号: - 从栈中弹出右操作数 -1 从栈中弹出左操作数 3-1 根据符号进行运算 2 将运算结果压入栈中 [2,8] 遍历结束, 栈中唯一的数字作为计算结果定义栈结构 typedef struct MYNUM{LinkNode node;int val; } MyNum;…

对一个全局变量进行多线程并发 -- 或者 ++ 操作是否是安全的??是否是原子的??

1.结论&#xff1a; 不是安全的&#xff0c;不是原子的 2.原因&#xff1a; 2.1 不是原子性的原因&#xff1a; 一个线程将一个全局变量--&#xff08;减减&#xff09;时候&#xff0c;需要以下几个步骤 第一步&#xff1a;将全局变量读到cpu的寄存器中&#xff0c; 第二步…

异常处理、接口文档、 jwt介绍、

【异常处理 详见excel的异常处理的源码总结】# APIView--->dispatch--->三大认证,视图类的方法,如果出了异常, # 会被异常捕获,捕获后统一处理 # 关键就是dispatch里面的 response = self.handle_exception(exc) 这行代码# drf 内置了一个函数,只要上面过程出了异常…

Python用于比较数据结构并生成差异报告的工具库之data-diff使用详解

概要 Python的data-diff库是一个用于比较数据结构并生成差异报告的工具。它可以处理各种数据类型,如字典、列表、集合等,使得开发者能够快速识别数据之间的差异。 安装 通过pip可以轻松安装data-diff: pip install data-diff特性 支持多种数据类型:能够比较字典、列表、…

富文本编辑器(wangEdit)+(jquery.wordexport)实现web版在线编辑导出

小插曲&#xff1a;最开始的方向是Html5的contenteditable"true"的文档可编辑属性。只能修改文档文字内容&#xff0c;不能修改样式&#xff0c;如修改字体&#xff0c;字号&#xff0c;颜色等。于是用了第一款&#xff08;quil&#xff09;富文本插件。只能说一般&a…

栈3: 括号匹配

栈3: 括号匹配自定义数据结构 typedef struct MYCHAR{LinkNode node;char* pAddres; //数据域int index; // } MyChar;判断左右括号 int IsLeft(char c){return c==(; }int IsRight(char c){return c==); }创建栈结点 MyChar* CreatMyChar(char *p){MyChar* mychar = (MyChar*)…

“百度杯”CTF比赛 九月场-123

“百度杯”CTF比赛 九月场 123 题目类型:web 题目描述:12341234,然后就解开了,打开靶机是一个会员登陆界面:解题方法:先查看一下网页源码:这里说用户信息都在user.php里面,然后我们访问一下user.php:发现并没有任何信息 扫描一下它的目录文件看一下:扫出了一个user.p…

Redis(Windows版本下载安装和使用)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…