Linux生产环境中,CPU使用率突然升高或系统负载激增会导致服务性能下降、响应变慢甚至应用崩溃。这些问题常出现在高并发场景(如电商大促),通常由代码缺陷、资源分配不当或外部依赖瓶颈引起。缺乏有效诊断手段时,运维团队往往只能通过重启系统来应急处理,但这并不能根治问题。本文将通过实际案例,介绍如何早期识别CPU性能问题,理解关键指标,定位问题根源,并提出长期解决方案,帮助建立既能应对即时危机又能预防未来问题的策略体系。

CPU负载的查询分析

Linux系统中,有一些常用的命令可以帮助我们查看进程的状态。在这篇文章里,我们将重点介绍两个非常实用的工具——vmstattop,并学习如何使用它们来更好地了解系统的运行情况。

 
vmstat
top
ps -aux
ps -ef

vmstat

vmstat(虚拟内存统计) 是一个非常有用的工具,它可以帮助我们从整体上了解操作系统的运行状况,包括虚拟内存、进程以及CPU等关键指标。通过使用 vmstat 命令,我们可以轻松地获取这些信息,从而更好地监控和管理我们的系统。

下面是一些常用的 vmstat 命令示例:

 
vmstat [-n] [delay [count]] 
  • [-n]:只在开始时显示一次各字段名称。
  • [delay]:刷新时间间隔。如果不指定,只显示一条结果。
  • [count]:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。

使用示例

执行如下命令,使用vmstat1秒统计一次各进程的CPU使用情况,连续统计4次。

 
vmstat -n 1 4

返回示例类似如下。

 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0  69832  32628 930612    0    0  1028    54  812 1534  5  2 92  1  0
 0  0      0  69832  32636 930680    0    0     8    60 1391 2613  3  3 94  0  0
 0  0      0  69832  32636 930676    0    0     0     0 1388 2584  1  1 98  0  0
 0  0      0  69832  32636 930676    0    0     0     0 1343 2535  2  1 98  0  0

显示结果主要字段说明

  • r:等待CPU处理的任务数。数值越大,系统越慢。
  • us:用户程序占用的CPU时间比例。若长期超过50%,建议优化代码或算法。
  • sy:内核使用CPU时间的比例。
  • wa:CPU等待I/O操作完成的时间比例。值高表示磁盘读写慢或频繁随机访问。
  • id:CPU空闲时间比例。若为0且sy是us两倍,表明CPU不足。

top

Linux系统中,top命令是一个非常实用的小帮手,它能够实时地向我们展示每个进程是如何使用系统资源的。

 
top [-n] [-d] 
  • [-n]:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
  • [-d] :刷新时间间隔。

使用示例

你可以试试下面的命令来查看系统里各个进程用了多少资源。这个命令每2秒会刷新一次所有进程的信息,刷新5次后就会自动停下。

 
top -n 5 -d 2

系统显示类似如下。

 
top - 12:40:17 up  1:18,  3 users,  load average0.000.060.08
Tasks170 total,   1 running169 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.5 sy,  0.0 ni98.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1685.0 total,     71.2 free,    666.0 used,    947.9 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.    854.0 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                            
   2078 root      20   0  140536  17052   5120 S   1.3   1.0   1:21.08 AliYunDunMonito                    
   1144 root      20   0 1276316  10180   8544 S   1.0   0.6   0:28.96 argusagent

显示结果主要字段说明

在查看CPU使用率和负载情况时,您可以重点关注输出结果中的第一行和第三行信息。

  • 第一行:这里会显示如 top - 12:40:17 up  1:18,  3 users,  load average: 0.00, 0.06, 0.08 这样的信息。它依次告诉了我们当前的系统时间、系统自启动以来已经运行了多久、现在有多少用户登录到了系统中,以及过去1分钟、5分钟和15分钟内的平均系统负载情况。
  • 第三行:这一行则概览了整个系统的CPU资源使用概况。紧随其后列出的是各个进程具体的资源消耗详情,帮助您了解哪些程序正在占用较多的计算资源。

使用 top 命令时,可以通过几个交互命令更有效地管理系统:

  • P键按CPU使用率从高到低排序进程,便于发现占用大量计算资源的程序。
  • 按 M键根据内存使用量对进程进行排序。对于多核处理器,输入 1 可查看每个核心的负载情况。
  • 若要了解特定进程运行的具体程序,可以使用 ll /proc/PID/exe 查看其可执行文件路径。
 
root@didiplus:~# ll /proc/806/exe 
lrwxrwxrwx 1 root root 0 Apr  3 16:27 /proc/806/exe -> /usr/local/bin/1panel*

要停止占用大量CPU资源的进程,请按以下步骤操作:

  • 轻敲键盘上的小写字母 k
  • 输入要结束进程的PID(进程标识号),然后按Enter键。如果您不确定PID,可以选择列表中的第一个。例如,要停止PID23的进程,输入23后按Enter
  • 操作成功后,界面上会显示类似Send pid 23 signal [15/sigterm]的提示信息。这时,只需轻轻按一下Enter键确认就可以了。

常见CPU资源过高案例分析

案例一:CPU使用率较低但负载较高

问题现象

Linux系统上暂时没有运行任何业务程序。通过使用top命令查看时,我们注意到CPU的使用率其实并不高,但奇怪的是,CPU的负载(load average)却显得异常高,就像下面的截图所展示的一样。

问题原因

这个问题可能是由于过多的僵尸(zombie)进程引起的。Load average是用来衡量CPU负载的一个指标,它的值越高,意味着等待执行的任务队列越长,也就是说,有更多的任务正在排队等待处理。

解决方案

可以通过 ps -axjf 命令来检查系统中是否存在处于 D+ 状态的进程。如果发现有进程处于这种状态,它们暂时既不能被手动终止,也无法自行退出。解决这个问题的办法通常是恢复这些进程所依赖的资源,或者在必要时重启系统。

案例二:kswapd0进程占用CPU较高

问题现象

服务器运行得特别慢,用top命令查了下,发现kswapd0这个进程占用了99%CPU

问题原因

这个问题可能是因为系统正在不停地进行换页操作,占用了大量的CPU资源。kswapd0是负责管理虚拟内存中换页的进程。当服务器内存不够用时,kswapd0就会开始换页,而这个过程会消耗很多CPU资源。

Linux系统CPU负载疯涨?一线大厂排查方案与优化图谱

解决方案

你可以通过调整vm.swappiness这个设置来改变系统使用交换空间的方式,这样可以帮助减少kswapd0进程占用太多CPU资源的问题。

  • 查看swappiness参数。
 
cat /proc/sys/vm/swappiness

当系统里的物理内存使用超过60%(也就是空闲内存低于40%)时,就会开始用swap空间。

swappiness这个参数值设置得越低,Linux就越少用swap分区,尽量多用物理内存;而swappiness值越高,系统就越倾向于把数据放到swap空间里。

  • 根据业务需求,你需要调整swappiness参数。具体操作是打开内核参数配置文件sysctl.conf进行修改。
 
vi /etc/sysctl.conf
  • 根据业务需求,调整swappiness参数的值。具体操作是在sysctl.conf文件里找到vm.swappiness这一行,并将其设置为10(即写成vm.swappiness = 10)。修改完成后,记得重新加载sysctl配置,这样新设置才能生效。
 
sysctl -p

案例三:CPU使用率过高100%问题排查

问题现象

如果你发现CPU使用率飙到100%,但用tophtop这些工具又查不到具体是哪个进程在占用CPU,这情况就比较麻烦了。

问题原因

该问题可能是病毒导致。

解决方案

看看你的Linux系统里的命令在过去30天内有没有被改动过?那就用下面这条命令吧。

 
stat /usr/bin/top

系统显示类似如下,系统命令有被修改。查看更改时间是否和监控中CPU使用率出现100%的时间点吻合。

分别执行如下命令,查看pstop命令是否被修改过。

 
rpm -Vf /bin/ps
rpm -Vf /usr/bin/top

在一切正常的情况下,系统不会返回任何修改信息。如果遇到异常情况,系统会显示类似以下的信息,这通常意味着pstop命令可能已经被修改了。

请您运行以下命令,以检查当前实例是否连接到了任何异常的域名。

 
iftop -i [$Device] -n -P

[$Device]请替换为当前系统使用的网卡,如eth0。

如果系统显示了类似的信息,并且你之前没有连接过crypto-pool.fr,那么这个域名可能是有问题的。