命令

vmstat

  1. [root@Linkin ~]# vmstat 5
  2. procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
  3. r b swpd free buff cache si so bi bo in cs us sy id wa st
  4. 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

  1. [root@Linkin ~]# pidstat -w 5
  2. Linux 3.10.0-1062.9.1.el7.x86_64 (Linkin) 05/26/2020 _x86_64_ (2 CPU)
  3. 11:27:33 PM UID PID cswch/s nvcswch/s Command
  4. 11:27:38 PM 0 6 4.78 0.00 ksoftirqd/0
  5. 11:27:38 PM 0 7 0.80 0.00 migration/0
  6. 11:27:38 PM 0 9 79.88 0.00 rcu_sched

加上 -w 参数后显示 cswch 和 nvcswch 相关信息

  • cswch 每秒自愿上下文切换
  • nvcswch 每秒非自愿上下文切换
  • 所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
  • 非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。

cat /proc/interrupts

  1. watch -d cat /proc/interrupts
  2. NMI: 0 0 Non-maskable interrupts
  3. LOC: 4276960094 4016656530 Local timer interrupts
  4. SPU: 0 0 Spurious interrupts
  5. PMI: 0 0 Performance monitoring interrupts
  6. IWI: 115428866 116458797 IRQ work interrupts
  7. RTR: 0 0 APIC ICR read retries
  8. RES: 1148916620 1089266486 Rescheduling interrupts
  9. CAL: 1536 1880 Function call interrupts
  10. 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 进行查看,并分析具体原因,是由于资源不足自愿切换太多,还是争抢太激烈导致,或者是由于中断过于频繁导致。