Linux高负载排查最佳实践
在Linux系统中,经常会因为负载过高导致各种性能问题。那么如何进行排查,其实是有迹可循,而且模式固定。
本次就来分享一下,CPU占用过高、磁盘IO占用过高的排查方法。
还是那句话,以最佳实践入手,真传一句话,假传万卷书。这就是工作中学习和读死书的区别与真相。
CPU占用率过高问题排查方法
-
使用mpstat查看cpu使用情况。
# mpstat 是一款 CPU 性能指标实时展示工具
# 能展示每个 CPU 核的资源视情况,同时还能将资源使用情况进行汇总展示
# 如果CPU0 的 %idle 已经为 0 ,说明此核已经非常繁忙
# 打印所有cpu核的情况(ALL),每隔1s打印一次,共打印5次
mpstat -P ALL 1 5
mpstat命令执行结果
从上面可以看到,服务器有 2 个 CPU(分别为0、1),每个 CPU 核的资源使用情况,也能很清晰的展示。
当服务器有特别多的 CPU 核,有时候看 CPU 汇总信息,发现 CPU 的 idle 很高,但是上面跑的应用程序却很慢,这个时候就需要看看每个核的资源试用情况了。
重点关注指标:
* %iowait:代表在监控的时间间隔内,等待硬盘 I/O 的时间,如果此值比较高,说明 IO 非常繁忙
* %idle:代表在监控的时间间隔内,CPU 闲置时间所占用的时间百分比,此值越大,代表 CPU 越空闲
2. 使用pidstat查看消耗cpu资源的进程。
# 参数-u表明监控cpu使用情况
# 参数2表示每隔2s输出一次,会循环输出
pidstat -u 2
Linux 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 2
Linux 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 mysqld
03: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
3. 使用 pidstat 查看消耗 CPU 资源的线程
pidstat -t 2 -p 10733
Linux 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 数据库里排查,此线程正在执行的操作。
4. 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占用率过高排查方法
-
使用 iostat 查看磁盘 IO 的读写情况。
# 每隔1s输出一次
iostat -mxt 1
# 每隔1s输出一次,共输出2次
iostat -mxt 1 2
iostat命令输出
如果看到 %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 操作,此值越高,代表着磁盘越繁忙
2. 使用 iotop 定位最消耗 IO 资源的元凶
iotop -p 10733
可以看到10850 线程大量读操作,导致 IO 资源被消耗殆尽。
iotop 是一款用于监视磁盘设备 I/O 使用状况的工具,可监测到具体的线程使用的磁盘 IO 的信息,功能也是非常强大,可惜需要 root 权限,普通用户没有执行权限,所以一般会用 pidstat 工具来替代。
参数介绍:
-P:只显示进程 IO 读写情况
-p:监控指定进程的 IO 读写情况
-u:指定用户进程的 IO 读写情况
1. 查看指定用户的的进程
iotop -u mysql -P
2. 查看指定用户的进程和线程 IO 读写情况
iotop -u mysql
3. 查看指定进程的线程 IO 读写情况
iotop -p 10733
3. 根据线程定位具体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;
相关文章:

Linux高负载排查最佳实践
在Linux系统中,经常会因为负载过高导致各种性能问题。那么如何进行排查,其实是有迹可循,而且模式固定。 本次就来分享一下,CPU占用过高、磁盘IO占用过高的排查方法。 还是那句话,以最佳实践入手,真传一句话…...

【python开发】网络编程(上)
这里写目录标题 一、必备基础(一)网络架构1、交换机2、路由器3、三层交换机4、小型企业基础网络架构5、家庭网络架构6、互联网 (二)网络核心词汇1、子网掩码和IP2、DHCP3、内网和公网IP4、云服务器5、端口6、域名 一、必备基础 &…...

php源码 单色bmp图片取模工具 按任意方式取模 生成字节数组 自由编辑点阵
http://2.wjsou.com/BMP/index.html 想试试chatGPT4生成,还是要手工改 php 写一个网页界面上可以选择一张bmp图片,界面上就显示这张bmp图片, 点生成取模按钮,在图片下方会显示这张bmp图片的取模数据。 取模规则是按界面设置的&a…...
设计模式-命令模式(Command Pattern)
承接Qt/C软件开发项目,高质量交付,灵活沟通,长期维护支持。需求所寻,技术正适,共创完美,欢迎私信联系! 一、命令模式的说明 命令模式(Command Pattern)是一种行为设计模式…...

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:位置设置)
设置组件的对齐方式、布局方向和显示位置。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 align align(value: Alignment) 设置容器元素绘制区域内的子元素的对齐方式。 卡片能力: 从API…...

ShardingJdbc实战-分库分表
文章目录 基本配置分库分表的分片策略一、inline 行表达时分片策略algorithm-expression行表达式完整案例和配置如下 二、根据实时间日期 - 按照标准规则分库分表标准分片 - Standard完整案例和配置如下 基本配置 逻辑表 逻辑表是指:水平拆分的数据库或者数据表的相…...

51单片机-(定时/计数器)
51单片机-(定时/计数器) 了解CPU时序、特殊功能寄存器和定时/计数器工作原理,以定时器0实现每次间隔一秒亮灯一秒的实验为例理解定时/计数器的编程实现。 1.CPU时序 1.1.四个周期 振荡周期:为单片机提供定时信号的振荡源的周期…...

midjourney提示词语法
更高级的提示可以包括一个或多个图像URL、多个文本短语和一个或更多个参数 Image Prompts 可以将图像URL添加到提示中,以影响最终结果的样式和内容。图像URL总是位于提示的前面。 https://docs.midjourney.com/image-prompts Text Prompt 要生成的图像的文本描述。…...

【鸿蒙 HarmonyOS 4.0】路由router
一、介绍 页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS提供了Router模块,通过不同的url地址,可以方便地进行页面路由,轻松地访问不同的页面。 二、页面跳转 2.1、两种跳转模式: router.pushUrl()&…...
AT24C1024的模拟IIC驱动
AT24C1024是基于IIC的EEPROM,容量为1024/8128k bytes。它的引脚如下: 其中A1,A2为硬件地址引脚 WP为写保护引脚,一般我们需要读写,需要接低电平GND,接高的话则仅允许读 SDA和SCL则为IIC通信引脚 芯片通信采用IIC&…...
Stable Diffusion生成式扩散模型代码实现原理
Stable Diffusion可以使用PyTorch或TensorFlow等深度学习框架来实现。这些框架提供了一系列的工具和函数,使得开发者可以更方便地构建、训练和部署深度学习模型。因此可以使用PyTorch或TensorFlow来实现Stable Diffusion模型。 安装PyTorch:确保您已经安…...

解决Keepalived “脑裂”(双VIP)问题
1. 检查广播情况 yum install tcpdump -y tcpdump -i ens33 vrrp -n master 192.168.80.130 与 backup: 192.168.80.131都在广播,正常情况下backup应该是不在广播的,所以可以判断存在防火墙屏蔽vrrp问题,需要设置VRRP过掉防火墙࿰…...

cAdvisor+Prometheus+Grafana 搞定Docker容器监控平台
cAdvisorPrometheusGrafana cAdvisorPrometheusGrafana 搞定Docker容器监控平台1、先给虚拟机上传cadvisor2、What is Prometheus?2.1、架构图 3、利用docker安装普罗米修斯4、安装grafana cAdvisorPrometheusGrafana 搞定Docker容器监控平台 1、先给虚拟机上传cadvisor cAd…...
java基础知识面试题
下面是关于java基础知识的一些常见面试题 equals 与区别 在Java中,""是一个比较操作符,用于比较两个变量的值是否相等。而"equals()"是Object类中定义的方法,用于比较两个对象是否相等。 具体区别如下: &…...

科技云报道:黑马Groq单挑英伟达,AI芯片要变天?
科技云报道原创。 近一周来,大模型领域重磅产品接连推出:OpenAI发布“文字生视频”大模型Sora;Meta发布视频预测大模型 V-JEPA;谷歌发布大模型 Gemini 1.5 Pro,更毫无预兆地发布了开源模型Gemma… 难怪网友们感叹&am…...

解决i18n国际化可读性问题,傻瓜式webpack中文支持国际化插件开发
先来看最后的效果 问题 用过国际化i18n的朋友都知道,天下苦国际化久矣,尤其是中文为母语的开发者,在面对代码中一堆的$t(abc.def)这种一点也不直观毫无可读性的代码,根本不知道自己写了啥 (如上图,你看得出…...
【Django】执行查询—F()表达式
F() F()可以实现将模型字段值与同一模型中的另一字段做比较。举个例子看一下: class Entry(models.Model):...number_of_comments models.IntegerField(default0)number_of_pingbacks models.IntegerField(default0)...找到所有 number_of_pingbacks 大于 numbe…...
202112CSPT4磁盘文件操作
题意:有n个id号,m段空间,k个操作: 0 0 0:从L开始到R或遇到第一个其他非空id号为止,写入 i d id id号以及值 v a l val val;如果成功写入则输出写入成功的最右位置,否则输出-1 1 1 1:若 [ L , …...

5GC SBA架构
协议标准:Directory Listing /ftp/Specs/archive/23_series/23.501/ (3gpp.org) NF描述说明NSSFNetwork Slice Selection Function网络切片选择,根据UE的切片选择辅助信息、签约信息等确定UE允许接入的网络切片实例。NEF Network Exposure Function网络开…...

《求生之路2》服务器如何选择合适的内存和CPU核心数,以避免丢包和延迟高?
根据求生之路2服务器的实际案例分析选择合适的内存和CPU核心数以避免丢包和延迟高的问题,首先需要考虑游戏的类型和对服务器配置的具体要求。《求生之路2》作为一款多人在线射击游戏,其服务器和网络优化对于玩家体验至关重要。 首先,考虑到游…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...