在Linux
生产环境中,CPU
使用率突然升高或系统负载激增会导致服务性能下降、响应变慢甚至应用崩溃。这些问题常出现在高并发场景(如电商大促),通常由代码缺陷、资源分配不当或外部依赖瓶颈引起。缺乏有效诊断手段时,运维团队往往只能通过重启系统来应急处理,但这并不能根治问题。本文将通过实际案例,介绍如何早期识别CPU
性能问题,理解关键指标,定位问题根源,并提出长期解决方案,帮助建立既能应对即时危机又能预防未来问题的策略体系。
CPU负载的查询分析
在Linux
系统中,有一些常用的命令可以帮助我们查看进程的状态。在这篇文章里,我们将重点介绍两个非常实用的工具——vmstat
和top
,并学习如何使用它们来更好地了解系统的运行情况。
vmstat
top
ps -aux
ps -ef
vmstat
vmstat
(虚拟内存统计) 是一个非常有用的工具,它可以帮助我们从整体上了解操作系统的运行状况,包括虚拟内存、进程以及CPU
等关键指标。通过使用 vmstat
命令,我们可以轻松地获取这些信息,从而更好地监控和管理我们的系统。
下面是一些常用的 vmstat
命令示例:
vmstat [-n] [delay [count]]
-
[-n]:只在开始时显示一次各字段名称。
-
[delay]:刷新时间间隔。如果不指定,只显示一条结果。
-
[count]:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
使用示例
执行如下命令,使用vmstat
每1
秒统计一次各进程的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 average: 0.00, 0.06, 0.08
Tasks: 170 total, 1 running, 169 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.0 us, 0.5 sy, 0.0 ni, 98.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
键按使用率从高到低排序进程,便于发现占用大量计算资源的程序。
-
按 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
,可以选择列表中的第一个。例如,要停止PID
为23
的进程,输入23
后按Enter
。
-
操作成功后,界面上会显示类似 Send pid 23 signal [15/sigterm]
的提示信息。这时,只需轻轻按一下Enter键确认就可以了。
常见CPU资源过高案例分析
案例一:CPU使用率较低但负载较高
问题现象
Linux
系统上暂时没有运行任何业务程序。通过使用top
命令查看时,我们注意到的使用率其实并不高,但奇怪的是,
的负载(load average)却显得异常高,就像下面的截图所展示的一样。
问题原因
这个问题可能是由于过多的僵尸(zombie)进程引起的。Load average
是用来衡量负载的一个指标,它的值越高,意味着等待执行的任务队列越长,也就是说,有更多的任务正在排队等待处理。
解决方案
可以通过 ps -axjf
命令来检查系统中是否存在处于 D+
状态的进程。如果发现有进程处于这种状态,它们暂时既不能被手动终止,也无法自行退出。解决这个问题的办法通常是恢复这些进程所依赖的资源,或者在必要时重启系统。
案例二:kswapd0进程占用CPU较高
问题现象
服务器运行得特别慢,用top
命令查了下,发现kswapd0
这个进程占用了99%
的。
问题原因
这个问题可能是因为系统正在不停地进行换页操作,占用了大量的CPU资源。kswapd0
是负责管理虚拟内存中换页的进程。当服务器内存不够用时,kswapd0
就会开始换页,而这个过程会消耗很多资源。

解决方案
你可以通过调整vm.swappiness
这个设置来改变系统使用交换空间的方式,这样可以帮助减少kswapd0
进程占用太多资源的问题。
-
查看 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%
,但用top
或htop
这些工具又查不到具体是哪个进程在占用CPU
,这情况就比较麻烦了。
问题原因
该问题可能是病毒导致。
解决方案
看看你的Linux
系统里的命令在过去30天内有没有被改动过?那就用下面这条命令吧。
stat /usr/bin/top
系统显示类似如下,系统命令有被修改。查看更改时间是否和监控中CPU
使用率出现100%的时间点吻合。
分别执行如下命令,查看ps
或top
命令是否被修改过。
rpm -Vf /bin/ps
rpm -Vf /usr/bin/top
在一切正常的情况下,系统不会返回任何修改信息。如果遇到异常情况,系统会显示类似以下的信息,这通常意味着ps
和top
命令可能已经被修改了。
请您运行以下命令,以检查当前实例是否连接到了任何异常的域名。
iftop -i [$Device] -n -P
[$Device]请替换为当前系统使用的网卡,如eth0。
如果系统显示了类似的信息,并且你之前没有连接过crypto-pool.fr
,那么这个域名可能是有问题的。