pidstat命令就可以帮助我们监测到具体线程的上下文切换
通过pidstat -help命令,可以查看到有以下几个常用参数可以监测线程的性能:
常用参数:
-u:默认参数,显示各个进程的cpu使用情况;
-r:显示各个进程的内存使用情况;
-d:显示各个进程的I/O使用情况;
-w:显示每个进程的上下文切换情况;
-p:指定进程号;
-t:显示进程中线程的统计信息
首先,通过pidstat -w -p pid 命令行,我们可以查看到进程的上下文切换:
cswch/s:每秒主动任务上下文切换数量
nvcswch/s:每秒被动任务上下文切换数量
之后,通过pidstat -w -p pid -t 命令行,我们可以查看到具体线程的上下文切换:
Note:
有两列内容是需要重点关注对象。一个是 cswch ,表示每秒自愿上下文切换(voluntary context switches)的次数,另一个则是nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数。
自愿上下文切换 cswch
是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
非自愿上下文切换 nvcswch
则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU时,就容易发生非自愿上下文切换。
每秒上下文切换多少次才算正常呢?
这个数值其实取决于系统本身的 CPU 性能。如果系统的上下文切换次数比较稳定,那么从数百到一万以内,都应该算是正常的。但当上下文切换次数超过一万次,或者切换次数出现数量级的增长时,就很可能已经出现了性能问题。
需要根据上下文切换的类型,再做具体分析。比方说:
自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;
非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;
中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。