vmstat
vmstat:主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断次数。
# 1 表示 每 1 秒 输出一次数据
->:~$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 5787772 2108 3448464 0 0 530 1766 699 975 14 9 73 5 0
0 0 0 5787648 2108 3448464 0 0 0 0 167 136 0 0 100 0 0
0 0 0 5787624 2108 3448464 0 0 0 0 196 167 0 0 100 0 0
- r(Running or Runnable):就绪队列的长度,即,正在运行和等待 CPU 的进程数;
- b(Blocked):处于不可中断睡眠状态的进程数;
- cs(context switch):每秒上下文切换次数;
in(interrupt):每秒中断次数。
更多详情请见:https://blog.csdn.net/wzyzzu/article/details/50395502
pidstat
vmstat 只给出了系统总体的上下文切换情况,要想查看每个进程的详细情况,需要 pidstat。
# -w 表示显示每个进程的上下文切换;1 表示每秒输出一次数据
->:~$ pidstat -w 1
Linux 3.10.0-862.el7.x86_64 (localhost.localdomain) 04/27/2019 _x86_64_ (4 CPU)
05:07:34 PM UID PID cswch/s nvcswch/s Command
05:07:35 PM 0 1 0.98 0.00 systemd
05:07:35 PM 0 9 12.75 0.00 rcu_sched
05:07:35 PM 0 14 0.98 0.00 ksoftirqd/1
05:07:35 PM 0 19 0.98 0.00 ksoftirqd/2
05:07:35 PM 0 395 0.98 0.00 kworker/u256:32
05:07:35 PM 0 512 19.61 0.00 xfsaild/dm-0
05:07:35 PM 0 604 0.98 0.00 kworker/2:2
05:07:35 PM 0 777 9.80 0.00 vmtoolsd
05:07:35 PM 998 1031 0.98 0.00 memcached
05:07:35 PM 0 15021 0.98 0.00 pidstat
- cswch/s:每秒自愿上下文切换次数;
- nvcswch/s:每秒非自愿上下文切换次数。
自愿切换与非自愿切换的差异:
- 自愿上下文切换,指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
- 非自愿上下文切换,是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换(系统的就绪队列过长,也就是正在运行和等待 CPU 的进程数过多,导致大量上下文切换;而上下文切换又会导致系统 CPU 的占用率升高)。
pidstat 也可以输出线程的上下文切换指标:
# -wt 参数表示输出线程的上下文切换指标
->:~$ pidstat -wt 1
Linux 3.10.0-862.el7.x86_64 (localhost.localdomain) 04/27/2019 _x86_64_ (4 CPU)
05:20:49 PM UID TGID TID cswch/s nvcswch/s Command
05:20:50 PM 0 1 - 0.97 0.00 systemd
05:20:50 PM 0 - 1 0.97 0.00 |__systemd
05:20:50 PM 0 9 - 16.50 0.00 rcu_sched
05:20:50 PM 0 - 9 16.50 0.00 |__rcu_sched
05:20:50 PM 0 14 - 1.94 0.00 ksoftirqd/1
05:20:50 PM 0 - 14 1.94 0.00 |__ksoftirqd/1
05:20:50 PM 0 395 - 0.97 0.00 kworker/u256:32
05:20:50 PM 0 - 395 0.97 0.00 |__kworker/u256:32
05:20:50 PM 0 512 - 20.39 0.00 xfsaild/dm-0
05:20:50 PM 0 - 512 20.39 0.00 |__xfsaild/dm-0
...
更多详情请见:https://www.jianshu.com/p/3991c0dba094
/proc/interrupts
通过读取文件 /proc/interrupts 获取各种类型的中断次数。
# -d 参数表示高亮显示变化的区域
watch -d cat /proc/interrupts
由于这个文件的内容很多,很可能你的屏幕会显示不完整,这个时候用 tail
或者 head
来读取文件。
watch -d head -n 5 /proc/interrupts # 表示读取前 5 行内容
watch -d tail -n 5 /proc/interrupts # 表示读取后 5 行内容
额外说一下其中的 RES (重调度中断)。RES 中断类型表示,唤醒空闲状态的 CPU 来调度新任务,是多处理器系统(SMP)中,调度器用来分散任务到不同 CPU 的机制,也被称为处理器间中断(Inter-Processor Interrupts,IPI)。当它对应的值变化很快时,说明存在过多的任务要调度,CPU 资源可能紧张。
上下文切换次数多少合理?
每秒上下文切换次数多少才算正常,其实取决于系统本身的 CPU 性能。如果系统的上下文切换次数比较稳定,那么从数百到一万以内,都应该算是正常。但当上下文切换次数超过一万次,或者切换次数出现数量级的增长时,很可能已经出现了性能问题。实际场景有如下几个:
- 自愿上下文切换变多,说明进程都在等待资源,可能是发生了 I/O 等其他问题;
- 非自愿上下文切换变多,说明进程都在被强制调度(都在争抢 CPU),说明 CPU 成了瓶颈;
- 中断次数变多,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。
感谢
- 参考极客时间,倪朋飞老师的《Linux性能优化实战》之 04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
还不快抢沙发