美文网首页
CPU上下文切换排查

CPU上下文切换排查

作者: Daisy小朋友 | 来源:发表于2020-02-03 16:56 被阅读0次
    1 压测工具

    sysbench,模拟系统多线程调度的瓶颈

    yum -y install sysbench
    # 以10个线程运行5分钟的基准测试,模拟多线程切换的问题
    $ sysbench --threads=10 --max-time=300 threads run
    
    2 指标

    这个数值取决于系统本身的CPU性能,如果系统的上下文切换次数比较稳定,那么从数百到上万以内,都应该是正常的。但当上下文切换次数超过一万次或者切换次数出现数量级的增长时,很有可能已经出现了性能问题。

    3 工具

    yum -y install sysstat
    vmstat ——是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析CPU上下文切换和中断的次数
    pidstat ——vmstat只给出了系统总体的上下文切换情况,要想查看每个进程的详细情况,就需要使用pidstat,加上-w,可以查看每个进程上下文切换的情况
    /proc/inteerupts——/proc实际上是linux的虚拟文件系统用于内核空间和用户空间的通信,/proc/inteerupts是这种通信机制的一部分,提供了一个只读的中断使用情况。

    4 命令

    vmstat

    # 每隔1秒输出1组数据(需要Ctrl+C才结束)
    $ 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
     6  0      0 6487428 118240 1292772    0    0     0     0 9019 1398830 16 84  0  0  0
     8  0      0 6487428 118240 1292772    0    0     0     0 10191 1392312 16 84  0  0  0
    cs(context switch)是每秒上下文切换的次数
    in   (interrupt)每秒中断的次数
    r    (Running or Runnnable)是就绪队列的长度,也就是正在运行和等待CPU的进程数。
    b  (Blocked) 则是处于不可中断睡眠状态的进程数
    分析:
    查看cs大小(实验时cs骤升到百万)
    同时注意r列(实验时为8),机器cpu为1,远远超过1,必然会有大量的CPU竞争
    us和sy列,计算cpu使用率总和(实验加起来快100%,其中sy高达84%,说明cpu主要被内核占用)
    in列,查看大小(实验中骤升到一万,说明中断处理也是潜在的问题)
    综合可知,系统的就需队列过长,也就是正在运行和等待CPU的进程数过多,导致了大量的上下文切换,而上下文切换导致了cpu占用率高
    

    pidstat查看进程上下文切换情况

    
    # 每隔1秒输出1组数据(需要 Ctrl+C 才结束)
    # -w参数表示输出进程切换指标,而-u参数则表示输出CPU使用指标
    $ pidstat -w -u 1
    08:06:33      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
    08:06:34        0     10488   30.00  100.00    0.00    0.00  100.00     0  sysbench
    08:06:34        0     26326    0.00    1.00    0.00    0.00    1.00     0  kworker/u4:2
    
    08:06:33      UID       PID   cswch/s nvcswch/s  Command
    08:06:34        0         8     11.00      0.00  rcu_sched
    08:06:34        0        16      1.00      0.00  ksoftirqd/1
    08:06:34        0       471      1.00      0.00  hv_balloon
    08:06:34        0      1230      1.00      0.00  iscsid
    08:06:34        0      4089      1.00      0.00  kworker/1:5
    08:06:34        0      4333      1.00      0.00  kworker/0:3
    08:06:34        0     10499      1.00    224.00  pidstat
    08:06:34        0     26326    236.00      0.00  kworker/u4:2
    08:06:34     1000     26784    223.00      0.00  sshd
    cswch  表示每秒自愿上下文切换的次数,是指进程无法获取所需资源,导致的上下文切换,比如说,I/O,内存等系统资源不足时,就会发生自愿上下文切换。
    nvcswch 表示每秒非自愿上下文切换的次数,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。
    分析:
    pidstat查看果然是sysbench导致了cpu达到100%,但上下文切换来自其他进程,包括非自愿上下文切换最高的pidstat,以及自愿上下文切换最高的kworker和sshd
    但pidtstat输出的上下文切换次数加起来才几百和vmstat的百万明显小很多,现在vmstat输出的是线程,而pidstat加上-t后才输出线程指标
    
    # 每隔1秒输出一组数据(需要 Ctrl+C 才结束)
    # -wt 参数表示输出线程的上下文切换指标
    $ pidstat -wt 1
    08:14:05      UID      TGID       TID   cswch/s nvcswch/s  Command
    ...
    08:14:05        0     10551         -      6.00      0.00  sysbench
    08:14:05        0         -     10551      6.00      0.00  |__sysbench
    08:14:05        0         -     10552  18911.00 103740.00  |__sysbench
    08:14:05        0         -     10553  18915.00 100955.00  |__sysbench
    08:14:05        0         -     10554  18827.00 103954.00  |__sysbench
    ...
    pidstat子线程加一起就差不多百万了。
    

    查看中断——可排查是哪些中断引起的(变化速度最快的)

    # -d 参数表示高亮显示变化的区域
    $ watch -d cat /proc/interrupts
               CPU0       CPU1
    ...
    RES:    2450431    5279697   Rescheduling interrupts
    ...
    
    5 场景
    • 根据调度策略,将CPU时间划片为对应的时间片,当时间片耗尽,当前进程必须挂起。
    • 资源不足的,在获取到足够资源之前进程挂起。
    • 进程sleep挂起进程。
    • 高优先级进程导致当前进度挂起
    • 硬件中断,导致当前进程挂起
    6 小结
    • CPU上下文切换,是保证Linux系统正常工作的核心功能之一,一般情况下不需要我们特别关注。
    • 但过多的上下文切换,会把CPU时间消耗在寄存器,内核栈以及虚拟内存等数据的保存和恢复上,从而缩短进程真正运行的时间,导致系统的整体性能大幅下降。
    • 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题
    • 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈
    • 中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。小结
    7 其它

    cpu知识扩展

    物理cpu——grep ‘physical id’ /proc/cpuinfo|sort|uniq|wc -l
    cpu核心——grep ‘cpu cores’ /proc/cpuinfo|uniq|awk -F ‘:’ ‘{print $2}’
    逻辑cpu——cat /proc/cpuinfo| grep “processor”|wc -l
    逻辑cpu=物理cpu*cpu核心
    

    相关文章

      网友评论

          本文标题:CPU上下文切换排查

          本文链接:https://www.haomeiwen.com/subject/jzmhxhtx.html