系统使用率高导致 CPU 负载巨大

系统使用率高导致 CPU 负载巨大
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 的数量,并最终减少内核代码的执行。

相关内容