如何查看系统的上下文切换

性能优化 2019-04-27 3892 字 1565 浏览 点赞

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 文件来分析具体的中断类型。

感谢



本文由 Guan 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论