我在几个4核心服务器上运行了一个相当繁重的事情,所有的服务器都在云中运行Ubuntu Precise Pangolin LTS 64位(所以我想在虚拟环境中)。
为了监控CPU的使用情况,我写了一个.sh,使用“top -b -n 1”(这是一个顶级的运行,只有第一个“帧”),并与其他一些数据合并,写一个小报告。
然而,顶端总是在cpus线上报告64%空闲,对于每个服务器,即使我确信所有四个内核都100%忙碌。
事实上,在交互式运行中,第一帧会报告64%的空闲时间,但只要刷新一次,就会报告正确的(接近0%的空闲)数据。
vmstat也在cpu列中,总是在第一行报告64%的空闲时间,然后开始报告(据说)真实的数据。
为什么? 是在top / vmstat还是在内核中的错误? 还是它是如何测量cpu%的已知副作用? 为什么总是64%?
CPU负载反而总是正确的(大约4)。
这是因为top,vmstat,iostat在第一次运行时都会收集自系统上次重新启动以来的数据。
并且连续的迭代在您指定的采样周期上运行。 所以,在第一次运行的时候,你会看到%的空闲时间,因为从重新启动的时间到运行最高的时候,空闲的时间就是这么多。 但在接下来的迭代中,由于它很忙,所以不会显示任何空闲百分比。
排除第一次迭代,并在您想要的时间间隔内尝试采样。
你可以通过grep ping“Cpu(s)”开始的行并通过tailpipe道输出结果。
top -b -n2 -d 0.1 |grep "Cpu(s)"|tail -n +1
tail -n +1丢弃第一行(不好的结果),只让第二行通过。 -d 0.1意味着第一次和第二次迭代之间的延迟为十分之一秒; -b -n2表示在批处理模式下运行两次。 最后的结果是包含“好”结果的单行,然后可以在报告中使用。
如果您需要除“Cpu(s)”行之外的其他行,请清洗并重复每一行。