![系统使用率高导致 CPU 负载巨大](https://linux22.com/image/55065/%E7%B3%BB%E7%BB%9F%E4%BD%BF%E7%94%A8%E7%8E%87%E9%AB%98%E5%AF%BC%E8%87%B4%20CPU%20%E8%B4%9F%E8%BD%BD%E5%B7%A8%E5%A4%A7.png)
Tasks: 747 total, 176 running, 560 sleeping, 0 stopped, 11 zombie
Cpu(s): 10.5%us, 89.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Mem: 74236420k total, 73285344k used, 951076k free, 12261184k buffers
Swap: 8388600k total, 10404k used, 8378196k free, 27872176k cached
%sy 正在使用 89% 的 CPU。那%sy是什么?
这就是 iostat 的样子
root@host [~]# iostat -xk 5
Linux 2.6.32-431.20.3.el6.x86_64 (host.superhostsite.com) 09/03/2014 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
43.02 0.28 50.00 0.05 0.00 6.65
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sdb 0.25 64.95 14.21 79.82 91.86 579.51 14.28 0.15 1.60 0.09 0.84
sda 0.87 182.70 28.06 206.05 247.08 1629.10 16.03 0.49 2.07 0.09 2.22
avg-cpu: %user %nice %system %iowait %steal %idle
8.45 0.00 91.55 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sdb 0.00 14.00 0.20 15.00 3.20 116.00 15.68 0.03 1.92 0.28 0.42
sda 0.00 23.20 2.00 47.80 25.60 284.00 12.43 0.02 0.42 0.14 0.70
所以磁盘使用量很小。一切都很小。然而,系统的CPU使用率高达89.2%。
为什么 %sy 很高?为什么不%我们?
答案1
我认为你的问题基本上是“这里发生了什么?”。
我将通过解释你的输出来回答 - 如果有帮助,请告诉我,我会添加更多细节。
(尝试编辑问题,以便更清楚您要问的内容,否则可能会被关闭)
所以,是的,您会看到“由于高中央处理器用法”!
让我们看一下顶部的输出:
Cpu(s): 10.5%us, 89.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
百分比值表示时间花在哪里 - 在用户代码中,还是在系统(内核)代码中。这些%sy
是系统代码中的时间 - 还有额外的 10%us - 用户时间。所以CPU使用率是100%! (你也可以从 0%id - 空闲 - 看到它。)
但还有更多:
Tasks: 747 total, 176 running, 560 sleeping, 0 stopped, 11 zombie
有 176 个正在运行的进程。但是,如果核心数少于 176 个,则其中一些核心处于在有 CPU 时间的情况下可以运行的状态。
这意味着您有更多的负载,可以让更多的 CPU 达到 100% 使用率。
您的 CPU 未使用到 89.2% - 它是 100%
由此看来,没有什么理由iostat
——系统在这种状态下不需要太多的IO。
但我们需要的信息是:这些至少176个进程或线程是什么,可能还有更多类似的任务不处于运行状态。
接下来是:他们在做什么,为什么?
因此,请查看中的进程列表top
- 它可能会显示一些明显的问题。
它可以帮助更多地了解处于“可运行”状态的进程;
下面的命令列出了所有处于“可运行”状态的进程和线程 - 如果获得 CPU 时间就可以运行的任务:
ps -o comm,pid,ppid,user,time,etime,start,pcpu,state --sort=comm aH | grep '^COMMAND\|R$'
对我来说,只列出一两行,包括ps
它自己
答案2
从顶部输出中我可以看到内存利用率很高(包括巨大的文件系统缓存)。如前所述,您的内核代码比用户代码使用得更多,这可能是因为更多的 kworkers 正在工作以从缓存中释放内存并将其分配给请求进程(176 个正在运行的进程可能在运行时请求内存)。
一种解决方案可能是减少缓存大小或使用以下方法删除缓存:
echo 3 > /proc/sys/vm/drop_caches
这将减少 kworkers 的数量,并最终减少内核代码的执行。