Linux 系统 CPU 负载疯涨?一线大厂排查方案与优化图谱
在Linux生产环境中,CPU使用率突然升高或系统负载激增会导致服务性能下降、响应变慢甚至应用崩溃。这些问题常出现在高并发场景(如电商大促),通常由代码缺陷、资源分配不当或外部依赖瓶颈引起。缺乏有效诊断手段时,运维团队往往只能通过重启系统来应急处理,但这并不能根治问题。
本文将通过实际案例,介绍如何早期识别CPU性能问题,理解关键指标,定位问题根源,并提出长期解决方案,帮助建立既能应对即时危机又能预防未来问题的策略体系。
一、CPU负载的查询分析
在Linux系统中,有一些常用的命令可以帮助我们查看进程的状态。在这篇文章里,我们将重点介绍两个非常实用的工具——vmstat和top,并学习如何使用它们来更好地了解系统的运行情况。
vmstat(虚拟内存统计) 是一个非常有用的工具,它可以帮助我们从整体上了解操作系统的运行状况,包括虚拟内存、进程以及CPU等关键指标。通过使用 vmstat 命令,我们可以轻松地获取这些信息,从而更好地监控和管理我们的系统。
下面是一些常用的 vmstat 命令示例:
(1) 使用示例
执行如下命令,使用vmstat每1秒统计一次各进程的CPU使用情况,连续统计4次。
返回示例类似如下。
(2) 显示结果主要字段说明:
r:等待CPU处理的任务数。数值越大,系统越慢。us:用户程序占用的CPU时间比例。若长期超过50%,建议优化代码或算法。sy:内核使用CPU时间的比例。wa:CPU等待I/O操作完成的时间比例。值高表示磁盘读写慢或频繁随机访问。id:CPU空闲时间比例。若为0且sy是us两倍,表明CPU不足。2. top在Linux系统中,top命令是一个非常实用的小帮手,它能够实时地向我们展示每个进程是如何使用系统资源的。
(1) 使用示例
你可以试试下面的命令来查看系统里各个进程用了多少资源。这个命令每2秒会刷新一次所有进程的信息,刷新5次后就会自动停下。
系统显示类似如下。
(2) 显示结果主要字段说明
在查看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 查看其可执行文件路径。要停止占用大量CPU资源的进程,请按以下步骤操作:
轻敲键盘上的小写字母 k。输入要结束进程的PID(进程标识号),然后按Enter键。如果您不确定PID,可以选择列表中的第一个。例如,要停止PID为23的进程,输入23后按Enter。操作成功后,界面上会显示类似Send pid 23 signal [15/sigterm]的提示信息。这时,只需轻轻按一下Enter键确认就可以了。
二、常见CPU资源过高案例分析
案例一:CPU使用率较低但负载较高(1) 问题现象
Linux系统上暂时没有运行任何业务程序。通过使用top命令查看时,我们注意到CPU的使用率其实并不高,但奇怪的是,CPU的负载(load average)却显得异常高,就像下面的截图所展示的一样。
(2) 问题原因
这个问题可能是由于过多的僵尸(zombie)进程引起的。Load average是用来衡量CPU负载的一个指标,它的值越高,意味着等待执行的任务队列越长,也就是说,有更多的任务正在排队等待处理。
(3) 解决方案
可以通过 ps -axjf 命令来检查系统中是否存在处于 D+ 状态的进程。如果发现有进程处于这种状态,它们暂时既不能被手动终止,也无法自行退出。解决这个问题的办法通常是恢复这些进程所依赖的资源,或者在必要时重启系统。
(1) 问题现象
服务器运行得特别慢,用top命令查了下,发现kswapd0这个进程占用了99%的CPU。
(2) 问题原因
这个问题可能是因为系统正在不停地进行换页操作,占用了大量的CPU资源。kswapd0是负责管理虚拟内存中换页的进程。当服务器内存不够用时,kswapd0就会开始换页,而这个过程会消耗很多CPU资源。
(3) 解决方案
你可以通过调整vm.swappiness这个设置来改变系统使用交换空间的方式,这样可以帮助减少kswapd0进程占用太多CPU资源的问题。
查看swappiness参数:
当系统里的物理内存使用超过60%(也就是空闲内存低于40%)时,就会开始用swap空间。
swappiness这个参数值设置得越低,Linux就越少用swap分区,尽量多用物理内存;而swappiness值越高,系统就越倾向于把数据放到swap空间里。
根据业务需求,你需要调整swappiness参数。具体操作是打开内核参数配置文件sysctl.conf进行修改。
根据业务需求,调整swappiness参数的值。具体操作是在sysctl.conf文件里找到vm.swappiness这一行,并将其设置为10(即写成vm.swappiness = 10)。修改完成后,记得重新加载sysctl配置,这样新设置才能生效。
(1) 问题现象
如果你发现CPU使用率飙到100%,但用top或htop这些工具又查不到具体是哪个进程在占用CPU,这情况就比较麻烦了。
(2) 问题原因
该问题可能是病毒导致。
(3) 解决方案
看看你的Linux系统里的命令在过去30天内有没有被改动过?那就用下面这条命令吧。
系统显示类似如下,系统命令有被修改。查看更改时间是否和监控中CPU使用率出现100%的时间点吻合。
分别执行如下命令,查看ps或top命令是否被修改过。
在一切正常的情况下,系统不会返回任何修改信息。如果遇到异常情况,系统会显示类似以下的信息,这通常意味着ps和top命令可能已经被修改了。
请您运行以下命令,以检查当前实例是否连接到了任何异常的域名。
[$Device]请替换为当前系统使用的网卡,如eth0。
如果系统显示了类似的信息,并且你之前没有连接过crypto-pool.fr,那么这个域名可能是有问题的。