命令
vmstat
[root@Linkin ~]# vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 1414676 161632 5256384 0 0 0 7047 4427 8747 9 4 85 1 0
- cs(context switch)是每秒上下文切换的次数。
- in(interrupt)则是每秒中断的次数。
- r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。
- b(Blocked)则是处于不可中断睡眠状态的进程数。
pidstat -w
[root@Linkin ~]# pidstat -w 5
Linux 3.10.0-1062.9.1.el7.x86_64 (Linkin) 05/26/2020 _x86_64_ (2 CPU)
11:27:33 PM UID PID cswch/s nvcswch/s Command
11:27:38 PM 0 6 4.78 0.00 ksoftirqd/0
11:27:38 PM 0 7 0.80 0.00 migration/0
11:27:38 PM 0 9 79.88 0.00 rcu_sched
加上 -w 参数后显示 cswch 和 nvcswch 相关信息
- cswch 每秒自愿上下文切换
- nvcswch 每秒非自愿上下文切换
- 所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
- 而非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
cat /proc/interrupts
watch -d cat /proc/interrupts
NMI: 0 0 Non-maskable interrupts
LOC: 4276960094 4016656530 Local timer interrupts
SPU: 0 0 Spurious interrupts
PMI: 0 0 Performance monitoring interrupts
IWI: 115428866 116458797 IRQ work interrupts
RTR: 0 0 APIC ICR read retries
RES: 1148916620 1089266486 Rescheduling interrupts
CAL: 1536 1880 Function call interrupts
TLB: 1170638309 1154071720 TLB shootdowns
重调度中断(RES),这个中断类型表示,唤醒空闲状态的 CPU 来调度新的任务运行。这是多处理器系统(SMP)中,调度器用来分散任务到不同 CPU 的机制,通常也被称为处理器间中断(Inter-Processor Interrupts,IPI)。
指标
那么当上下文切换次数到达什么样的情况下才算是出现问题了呢?
一般当上下文切换次数超过一万次,或者切换次数出现数量级的增长时,就很可能已经出现了性能问题。
- 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;
- 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;
- 中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。
总结
当我们通过 uptime 发现 平均负载 高的情况下,就要尝试看看是否由于 CPU 上下文切换过于频繁导致;就可以尝试利用vmstat
\ pidstat -w
进行查看,并分析具体原因,是由于资源不足自愿切换太多,还是争抢太激烈导致,或者是由于中断过于频繁导致。