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 等。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐