尽管 CPU 或磁盘都没有被过度使用,但为什么负载仍然很高

use*_*951 26 performance load

我从以下输出top

Cpu(s): 43.8%us, 32.5%sy,  4.8%ni,  2.0%id, 15.6%wa,  0.2%hi,  1.2%si,  0.0%st
Mem:  16331504k total, 15759412k used,   572092k free,  4575980k buffers
Swap:  4194296k total,   260644k used,  3933652k free,  1588044k cached
Run Code Online (Sandbox Code Playgroud)

的输出iostat -xk 6显示如下:

Device: rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda       0.00   360.20   86.20  153.40  1133.60  2054.40    26.61     1.51    6.27   0.77  18.38
sdb       0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdd      22.60   198.80   17.40   31.60   265.60   921.60    48.46     0.18    3.70   1.67   8.20
sdc      16.80   218.20   22.20   23.40   261.60   966.40    53.86     0.21    4.56   1.49   6.78
Run Code Online (Sandbox Code Playgroud)

基于以上,看起来某些东西必须重载。但是什么?

问题

  1. 如果不是硬盘或CPU,那又是什么?
  2. 似乎 15.6% 的 CPU 时间花在等待上。它到底在等什么?

phe*_*mer 58

作为澄清点,负载与 CPU 没有直接关系。这是对负载最常见的误解之一。您提到磁盘这一事实似乎承认您知道这一点,但我只是想提及它,因为我看到一些评论表明有些人不这么认为。

负载定义为等待系统资源的进程数。这通常是 CPU、磁盘或网络,但实际上可以是任何硬件。
一个“过程”也不一定是一个完整的过程。一个线程被定义为一个“轻量级进程”,每个等待的线程都会增加负载计数。


要找出哪些进程有问题:

运行top -H-H启用显示线程)

键盘快捷键因版本而异。

使用较新的顶部(3.3 及更高版本):

按 调f出字段选项。
使用箭头键转到S = Process Status并按s
q返回主页面。
Shift+R反转排序。

使用较旧的顶部(3.3 之前):

Shift+ 调o出排序选项。
然后w按进程状态排序。
然后Enter回到主页面。
然后Shift+R反转排序。

然后在S列中,查找具有D或的进程R(它们现在应该位于顶部)。这些将是对系统负载有贡献的进程。

如果进程显示D,则表示“不间断睡眠”。通常这是在进程等待 I/O(磁盘、网络等)时引起的。
如果进程显示R,则意味着它只是在进行正常计算。


要了解有关这些进程正在做什么的更多信息:

使用较新的顶部(3.3 及更高版本):

按 调f出字段选项。
使用箭头键转到WCHAN = Sleeping in Function并按下d以启用它。
然后q返回主页面。

使用较旧的顶部(3.3 之前):

f然后y启用该WCHAN字段。

如果您的系统具有必要的内核选项,并且您的系统上存在 wchan 文件(我忘记了它的位置和名称),则该WCHAN字段应显示进程当前正在运行的内核函数(如果该字段仅显示-?任何事情,你没有支持)。
在这里搜索一下谷歌,你应该在路上。

如果您没有 wchan 支持,您可以随时尝试strace查看流程以了解他们在做什么,但这是困难的方法。