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 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 Command04:57:43 PM 2001 10733 0.00 91.44 0.00 91.44 0 mysqld04: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 Command03: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 Command03: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 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 Command05:00:55 PM 2001 10733 - 0.00 91.30 0.00 91.30 0 mysqld05:00:55 PM 2001 - 10733 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10734 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10735 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10736 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10737 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10738 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10739 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10740 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10741 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10742 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10743 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10744 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10745 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10747 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10748 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10749 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10750 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10751 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10752 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10753 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10754 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10755 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10756 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10757 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10758 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10762 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10763 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10764 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10766 0.00 0.00 0.00 0.00 0 |__mysqld05:00:55 PM 2001 - 10796 0.00 0.00 0.00 0.00 0 |__mysqld05: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_INFOfrom performance_schema.threadswhere 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 -P2. 查看指定用户的进程和线程 IO 读写情况iotop -u mysql3. 查看指定进程的线程 IO 读写情况iotop -p 10733
3. 根据线程定位具体SQL。
select PROCESSLIST_ID,THREAD_OS_ID,PROCESSLIST_USER,PROCESSLIST_HOST,PROCESSLIST_DB,PROCESSLIST_COMMAND,PROCESSLIST_INFOfrom performance_schema.threadswhere 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》作为一款多人在线射击游戏,其服务器和网络优化对于玩家体验至关重要。 首先,考虑到游…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
