第5章:看指标练工具-CPU的进阶命令
摘要:本文介绍了Linux系统性能优化中常用的诊断工具pidstat和mpstat的使用方法。pidstat命令可监控进程上下文切换情况,包括自愿(cswch/s)和非自愿(nvcswch/s)切换,以及线程统计信息。vmstat命令用于全局系统监控,可查看CPU队列、内存、I/O等指标。文章通过案例演示如何分析CPU上下文切换问题,包括使用sysbench模拟高负载场景,结合uptime、mps
Linux性能优化诊断pidstat+mpstat

pidstat -w:进程上下文切换情况
显示各活动进程的上下文切换情况统计
-
cswch/s:每秒自愿上下文切换(voluntary context switches)的次数
-
进程获取不了所需要的资源导致的上下文切换
-
比如:出现 I/O 问题瓶颈、内存等系统资源不足,会发生自愿上下文切换
-
-
nvcswch/s:每秒非自愿上下文切换(non voluntary context switches)的次数
-
进程由于调度算法,时间片已到等原因,被系统【强制调度】发生上下文切换
-
比如:大量进程再抢夺 CPU 资源时,会发生非自愿上下文切换,CPU 出现了瓶颈
-
示例命令:
pidstat -w

| 字段 | 说明 |
| PID | 进程 ID |
| cswch/s | 每秒自愿上下文切换的次数 |
| nvcswch/s | 每秒非自愿上下文切换的次数 |
| Command | 当前进程对应的命令 |
pidstat -t:线程统计
显示进程里面的线程的统计信息
| 字段 | 说明 |
| TGID | 主线程 ID |
| TID | 线程 ID |
| %usr | 进程在用户空间占用 CPU 的百分比 |
| %system | 进程在内核空间占用 CPU 的百分比 |
| %guest | 进程在虚拟机占用 CPU 的百分比(基本很少用) |
| %CPU | 进程占用 CPU 的百分比 |
| CPU | 处理进程的 CPU 编号 |
| Command | 当前进程对应的命令 |

pidstat -wt:组合命令
查看具体进程里面的线程上下文切换情况

Linux性能监控命令vmstat实战

vmstat(全局)
-
全称:Virtual Memory Statistics(虚拟内存统计)的缩写,是对系统整体的情况进行统计,不细化到某个进程,是宏观命令
-
格式:
vmstat [选项] [时间间隔] [次数](参数很多,记住常用的即可)-
vmstat -n:每隔 n 秒输出一行信息,一般会加个-w进行宽屏显示,比如vmstat -w 1 -
vmstat -s:指定定位单位,默认 KB,M 表示 MB -
vmstat -m:带上时间戳信息 -
更多参数信息:
man vmstat
-
-
实时查看系统 CPU 的队列情况、内存、I/O、上下文切换情况、系统中断次数、cpu 使用率等
-
和
mpstat命令有交集,都可以看出 cpu 使用率、在内核态、用户态等
-
示例命令
stress --cpu 8 --timeout 600s stress --io 8 --timeout 600s

字段说明
| 字段 | 说明 |
| r | 运行(running 或 runnable)就绪队列的长度,包括正在运行和等待 CPU 的进程数 |
| b | 阻塞(Blocked)处于不可中断睡眠状态的进程数,stress --io 或 --hdd 即可产生 |
| swpd | 虚拟内存使用情况,单位 KB |
| free | 空闲内存空间,单位 KB |
| buff | 缓冲的内存空间,单位 KB |
| cache | 缓存的内存空间,单位 KB |
| si | 从磁盘中交换至内存的数据量,单位 KB,数值越大代表内存和磁盘之间的转换越频繁,系统的性能越差 |
| so | 从内存中交换到磁盘中的数据量,单位 KB,数值越大代表内存和磁盘之间的转换越频繁,系统的性能越差 |
| bi | 从块设备中读入的数据的总量,单位块,值越大代表系统的 I/O 越繁忙 |
| bo | 写到块设备的数据的总量,单位块,值越大代表系统的 I/O 越繁忙 |
| in | 中断(interrupt)每秒中断的次数 |
| cs | 上下文切换(context switch)每秒上下文切换次数,会浪费较多的 cpu 资源,比如我们调用系统函数,数值应该越小越好 |
| us | 在用户态进程所使用 CPU 上时间的百分比,CPU 使用率 |
| sy | 在内核态进程所使用 CPU 时间的百分比,CPU 使用率 |
| id | 空闲 CPU 的百分比,在 Linux 2.5.41 之前,这部分包含 IO 等待时间 |
| wa | 等待 I/O 的 CPU 时间百分比 |
| st | 被虚拟机所盗用的 CPU 百分比(基本很少用) |
补充说明
-
Linux 里很多分析工具都是有交集的,但主要用途有差别
-
上下文切换和中断的合理范围:设备 CPU 负载的时候也有每秒 1 万次以内,不过也取决 CPU 的性能
性能指标分析诊断-CPU上下文切换案例实战

CPU 的上下文切换知识点回顾
-
CPU 寄存器和程序计数器是 CPU 在运行任务前依赖的环境,也叫 CPU 上下文
-
CPU 的上下文切换先把前一个任务的 CPU 上下文保存起来,下次才知道任务从哪里加载 + 运行
-
再加载新任务的上下文到寄存器和程序计数器进行运行任务,每次切换在【保存和恢复】上下文耗时几十纳秒 / 微秒
-
1ps(皮秒) = 1000ns(纳秒)
-
-
CPU 的上下文切换的场景
-
系统调用切换
-
即内核态和用户态的切换,一直是同一个进程在运行,不切换进程
-
一次系统调用的过程发生两次 CPU 上下文切换,切换过去,切换回来
-
-
进程上下文切换
-
每个 CPU 都维护了一个就绪队列,存放活跃进程,根据情况进行调度
-
进程是由内核来管理和调度的,进程的切换只能发生在【内核态】
-
比如你用【网易云听音乐、玩英雄联盟】因为现在电脑多 CPU 多核配置好,所以感觉不到切换
-
-
线程上下文切换
-
进程是资源拥有的基本单位,线程是调度的基本单位,当进程只有一个线程的时候,可以认为进程就等于线程
-
前后线程同属于一个进程,切换时虚拟内存资源不变
-
上下文切换时需要保存的线程私有数据,比如栈和寄存器
-
同进程内的线程切换,要比多进程间的切换消耗更少的资源,所以开发中用多线程代替多进程的原因
-
-
中断上下文切换
-
快速响应硬件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件
-
打断其他进程时,就需要保存该进程状态,这样在设备事件结束后,就可以从原来的状态恢复
-
比如老王挪了下鼠标,按下了键盘,CPU 就必须中断正在执行的程序,转而去响应这些硬件的事件
-
-
sysbench
-
是一款开源的多线程性能测试工具,模拟线程上下文切换过多场景等
-
可以执行 CPU / 内存 / 线程 / IO / 数据库等方面的性能测试
-
常用命令
sysbench --threads=32 --time=300 threads run # 32个线程持续运行5分钟,多线程压测
大量线程导致上下文切换,平均负载升高,CPU 使用率也会比较高(系统是 4 核)
-
终端一:模拟大量线程上下文切换,持续 300s
sysbench --threads=32 --time=300 threads run
-
终端二:
-d参数表示高亮显示变化的区域
watch -d uptime
-
终端三:
vmstat -w 1查看变化的 CPU 队列情况、内存、I/O、上下文切换、系统中断次数、CPU 使用率等等-
和 mpstat 命令有交集,都是可以看出 CPU 使用率,在内核态、用户态等
-
-
终端四:
pidstat -w查看运行中的进程和任务上下文切换统计,显示各活动进程的上下文切换情况-
pidstat -t -p pid显示进程里面的线程的统计信息 -
pidstat -wt组合命令,查看进程里面具体线程的上下文切换情况
-
宏观思路
-
先看全局,找系统哪个资源问题,是 CPU 还是 IO 还是啥瓶颈
-
知道具体后,再看哪个进程导致的这个资源有问题
详细分析思路
全局
-
uptime:运行 1 分钟后,4 个核的 CPU 负载比较高 -
mpstat(全局):-
应用场景:当系统变慢,CPU 平均负载增大时,判断是 CPU 的使用率增大,还是 IO 压力增大的情况导致
-
多次调用
mpstat -P ALL 2 2,持续观察,每个 CPU 利用率都高,使用率接近 100%,iowait 很低接近 0,IO 不是瓶颈
-
局部
-
pidstat -u 2 2:对进程和任务的使用情况进行,发现 CPU 使用率接近 100%,前面知道是大量上下文切换导致 -
pidstat -wt 2 2:查看哪个进程大量占据上下文切换,到进程里面的具体线程,大量上下文切换,导致了负载变高 -
pidstat -d:磁盘 IO 情况 -
pidstat -t:显示进程里面的线程的统计信息 -
pidstat -w:进程上下文切换情况,查看是哪种上下文切换占比高-
如果没加
-t则是进程的上下文切换,和 vmstat 的数据不一样,所以推断出是进程内部的大量线程切换导致 CPU 资源争夺 -
加
-t发现 nvcswch 高,大量线程抢夺 CPU 资源导致
-
命令top-mpstat-pidstat-vmstat中wait含义

top 中的 wa 解释
-
全称:IO-wait,即 time waiting for I/O completion
-
含义:等待 I/O 的时间,可能是网络 I/O 或磁盘 I/O,需要进一步分析。
mpstat 中的 iowait 解释
-
全称:Show the percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.
-
含义:等待 I/O 的时间,可能是网络 I/O 或磁盘 I/O,需要进一步分析。
vmstat 中的 wa 解释
-
全称:Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
-
含义:等待 I/O 的时间,可能是网络 I/O 或磁盘 I/O,需要进一步分析。
pidstat 中的 wait 解释(独有)
-
版本说明:10.1.5 版本的 pidstat 看不到
%wait列,11.1.1 版本可以看到(通过pidstat -V查看版本)。 -
全称:Wait Percentage of CPU spent by the task while waiting to run.
-
含义:表示进程等待 CPU 的时间百分比,进程在就绪队列中等待 CPU 调度运行的时间。
总结
-
等待 CPU:进程在 CPU 的就绪队列中,处于运行状态。
-
等待 I/O:进程处于不可中断状态,有磁盘 I/O、网络 I/O 等。
更多推荐

所有评论(0)