故障排查——CPU使用率过高

本篇将介绍CPU使用率过高的处理方案。

CPU使用率

CPU使用率过高,跟内存和进程都有关系,例如复杂运算,一般都会导致CPU升高。使用top命令查看(按1可以查看多核的CPU使用情况):
故障排查——CPU使用率过高_第1张图片

产生原因

第三行 CPU 占用率根据类型有以下几种情况:

  • (us) user:CPU 在低 nice 值(高优先级)用户态所占用的时间(nice<=0)。正常情况下只要服务器不是很闲,那么大部分的 CPU 时间应该都在此执行这类程序
  • (sy) system:CPU 处于内核态所占用的时间,操作系统通过系统调用(system call)从用户态陷入内核态,以执行特定的服务;通常情况下该值会比较小,但是当服务器执行的 IO 比较密集的时候,该值会比较大
  • (ni) nice:CPU 在高 nice 值(低优先级)用户态以低优先级运行占用的时间(nice>0)。默认新启动的进程 nice=0,是不会计入这里的,除非手动通过 renice 或者 setpriority() 的方式修改程序的nice值
  • (id) idle:CPU 在空闲状态(执行 kernel idle handler )所占用的时间
  • (wa) iowait:等待 IO 完成做占用的时间
  • (hi) irq:系统处理硬件中断所消耗的时间
  • (si) softirq:系统处理软中断所消耗的时间,记住软中断分为 softirqs、tasklets (其实是前者的特例)、work queues,不知道这里是统计的是哪些的时间,毕竟 work queues 的执行已经不是中断上下文了
  • (st) steal:在虚拟机情况下才有意义,因为虚拟机下 CPU 也是共享物理 CPU 的,所以这段时间表明虚拟机等待 hypervisor 调度 CPU 的时间,也意味着这段时间 hypervisor 将 CPU 调度给别的 CPU 执行,这个时段的 CPU 资源被“stolen”了。

排查步骤

CPU 占用率高很多情况下意味着一些东西,这也给服务器 CPU 使用率过高情况下指明了相应地排查思路:

  1. 当 user 占用率过高的时候,通常是某些个别的进程占用了大量的 CPU,这时候很容易通过 top 找到该程序;此时如果怀疑程序异常,可以通过 perf 等思路找出热点调用函数来进一步排查;

  2. 当 system 占用率过高的时候,如果 IO 操作(包括终端 IO)比较多,可能会造成这部分的 CPU 占用率高,比如在 file server、database server 等类型的服务器上,否则(比如>20%)很可能有些部分的内核、驱动模块有问题;

  3. 当 nice 占用率过高的时候,通常是有意行为,当进程的发起者知道某些进程占用较高的 CPU,会设置其 nice 值确保不会淹没其他进程对 CPU 的使用请求;

  4. 当 iowait 占用率过高的时候,通常意味着某些程序的 IO 操作效率很低,或者 IO 对应设备的性能很低以至于读写操作需要很长的时间来完成;

  5. 当 irq/softirq 占用率过高的时候,很可能某些外设出现问题,导致产生大量的irq请求,这时候通过检查 /proc/interrupts 文件来深究问题所在;

  6. 当 steal 占用率过高的时候,黑心厂商虚拟机超售了吧!

  7. top -c 然后按P,获取CPU使用率最高的进程

  • 如果是Java类应用,使用JDK提供的工具排查具体线程ID的调用情况即可,可以参考CPU %100排查过程;
  • C++的话,使用gdb调试;
  • 没有专门的工具的话,使用strace命令即可,例如跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面:
    strace -o output.txt -T -tt -e trace=all -p 28979

健康范围

一般来说服务器上的CPU使用率在%40-%60左右即可,最高不超过80%,如果长期超过,考虑升级核心数。

你可能感兴趣的:(Linux,监控和故障)