我在 ubuntu 12.04 KVM 主机上运行了几个 ubuntu 12.04 VM。那些完全空闲且没有任何服务的虚拟机(除了 syslog 和全新安装的其他“小型”标准内容)在 top/htop 中显示恒定负载“0.00 0.01 0.05”,平均为 1/5/15。
什么时候有“真实”的应用程序正在运行,平均负载表现完全正常,但它们从未低于所提到的值。
虽然这根本不影响性能并且很容易被忽略,但它会以一种非常烦人的方式搞乱监控图表:
(请注意,在图片的右半部分,如果短时间内 > 0.05,load15 表现良好)
不幸的是,我不知道哪些诊断输出可能对您有帮助,因此这里有一些默认的内容:
# top
top - 16:31:01 up 1:05, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 62 total, 1 running, 61 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 99.2%id, 0.5%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1019464k total, 73452k used, 946012k free, 6140k buffers
Swap: 0k total, 0k used, 0k free, 22504k cached
。
# free -m
total used free shared buffers cached
Mem: 995 72 923 0 6 21
-/+ buffers/cache: 43 951
Swap: 0 0 0
。
# iostat -x /dev/vda
Linux 3.2.0-32-virtual (vm3) 11/15/2012 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.25 0.00 0.65 0.20 0.24 98.66
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.14 0.12 0.51 0.22 6.74 1.46 22.50 0.02 23.26 20.64 29.30 7.63 0.56
还需要其他东西吗?
有人见过这种行为吗?这可能是 kvm/ubuntu/kernel 3.x 中的一个错误吗?
多谢!
答案1
实际上,真正的原因在于 Linux 中平均负载的计算方式。
截至目前实现为
static unsigned long
calc_load(unsigned long load, unsigned long exp, unsigned long active)
{
load *= exp;
load += active * (FIXED_1 - exp);
load += 1UL << (FSHIFT - 1);
return load >> FSHIFT;
}
如果您手动执行计算,您会发现,如果该值曾经增加超过 93(93 / 2048 = 0.04541015625(在输出时四舍五入为 0.05))就永远不会低于该值(这里我指的是 LA15,对于 LA5,该值可能不同)。
更多细节:
https://bugzilla.kernel.org/show_bug.cgi?id=45001#c13
参考:
答案2
完全空闲且没有运行任何服务的虚拟机
事实上,这种情况不会发生;总是在 *nix 系统上运行的服务:
- 系统日志
- systemd/udev
- 暴发户
- hald/dbus
- cron/at
- +任意数量的内核线程
期望上述任何组合能够产生一个完全空闲的系统只是幻想。
除此之外,计算平均负载的逻辑可能会导致 1 分钟显示 0.00,而 5 分钟显示 0.01一般。