CPU占用过高处理方案

滴滴云技术支持发表于:2018年10月24日 15:18:35更新于:2018年10月25日 15:16:49

如果云服务器系统的 CPU 持续跑高,则会对系统稳定性和业务运行造成影响。本文对 CPU占用率较大问题的排查分析做简要说明。

CPU 负载查看方法

使用 top 查看进程纬度的 CPU 负载

使用 vmstat 查看系统纬度的 CPU 负载

使用 top 查看进程纬度的 CPU 负载

您可以通过 top 从进程纬度来查看其 CPU、内存等资源的使用情况。

用法说明:

命令:

top

示例输出:

top - 17:27:13 up 27 days,  3:13,  1 user,  load average: 0.02, 0.03, 0.05
Tasks:  94 total,   1 running,  93 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.1 sy,  0.0 ni, 99.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.1 st
KiB Mem:   1016656 total,   946628 used,    70028 free,   169536 buffers
KiB Swap:        0 total,        0 used,        0 free.   448644 cached Mem
   
PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                          
1 root      20   0   41412   3824   2308 S  0.0  0.4   0:19.01 systemd                                          
2 root      20   0       0      0      0 S  0.0  0.0   0:00.04 kthreadd

·       回显说明:默认界面上第三行会显示当前 CPU 资源的总体使用情况,下方会显示各个进程的资源占用情况。

可以直接在界面输入大写字母 P,来使监控结果按 CPU 使用率倒序排列,进而定位系统中占用 CPU 较高的进程。最后,根据系统日志和程序自身相关日志,对相应进程做进一步排查分析,以判断其占用过高 CPU 的原因。

操作案例

使用 top 直接终止 CPU 消耗较大的进程

如前面所述,可以通过 top 命令查看系统的负载问题,并定位耗用较多 CPU 资源的进程。

您可以直接在 top 运行界面快速终止相应的异常进程。说明如下:

1.      想要终止某个进程,只需按下小写的 k 键。

2.     输入想要终止的进程 PID (top 输出结果的第一列)。比如,如下图所示,假如想要终止 PID 为 23 的进程,输入 23 后按回车。

3.     image.png

如下图所示,操作成功后,界面会出现类似 Send pid 23 signal [15/sigterm] 的提示信息让用户进行确认。按回车确认即可。

image.png

使用 vmstat 查看系统纬度的 CPU 负载

您可以通过 vmstat 从系统维度查看 CPU 资源的使用情况。

用法说明:

命令:

vmstat -n 1
# -n 1 表示结果一秒刷新一次。

示例输出:

$ vmstat -n 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  70352 169448 448452    0    0     0     4   10   11  0  0 99  0  0
0  0      0  70376 169448 448484    0    0     0     0  175  406  0  0 100  0  0
0  0      0  70376 169448 448484    0    0     0     0  173  414  0  1 99  0  0
0  0      0  70376 169448 448484    0    0     0   128  212  429  3  0 96  1  0
 ^C

·       返回结果中的主要数据列说明:

·       r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

·       b 表示阻塞的进程,这个不多说,进程阻塞。

·       swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

·       free   空闲的物理内存的大小。

·       buff   Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存。

·       cache cache直接用来记忆我们打开的文件,给文件做缓冲。

·       si  每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

·       so  每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

·       bi  每秒从块设备接收到的块数,即读块设备。这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

·       bo 每秒发送到块设备的块数,即写块设备。例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

·       in 每秒CPU的中断次数,包括时间中断

·       cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

·       us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。

·       sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

·       id  空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

·       wt 等待IO CPU时间。

4.     CPU 使用率较低但负载较高

问题描述

Linux 系统没有业务程序运行,通过 top 观察,类似如下图所示,CPU 很空闲,但是 load average 却非常高,如下图所示。

image.png

处理办法

load average 是对 CPU 负载的评估,其值越高,说明其任务队列越长,处于等待执行的任务越多。出现此种情况时,可能是由于僵死进程导致的。可以通过指令 ps -axjf 查看是否存在 D 状态进程。

D 状态是指不可中断的睡眠状态。该状态的进程无法被 kill,也无法自行退出。只能通过恢复其依赖的资源或者重启系统来解决。

image.png

如果问题还未能解决,您可以到滴滴云主页进行进线工单咨询。