有没有办法返回平均负载,排除由好进程引起的任何负载?
我们有一个负载平衡机制,可以检查多个Linux服务器的负载,并将作业提交给负载最低的服务器。我们有一个场景,所有服务器的负载都太高,因此无法在负载平衡中选择任何服务器。然而,我注意到服务器正在处理一堆很好的进程,因此尽管平均负载很高,但提交另一项作业仍然是“安全的”。
如果需要澄清,请告诉我。谢谢。
答案1
您可以编写自己的脚本,用于ps
列出处于运行/可运行状态的所有进程,且 Nice 值不大于 0。您需要使用的特定语法将根据您的 版本而有所不同ps
。像这样的事情可能会起作用:
ps -eo state,nice | awk 'BEGIN {c=0} $2<=0 && $1 ~ /R/ { c++ } END {print c-2}'
它运行时ps
收集所有进程的级别state
和nice
级别,并通过管道将输出awk
设置为计数变量c
,并在第二列(nice)小于或等于 0 并且第一列包含 R(表示可运行)时递增该变量。完成后,它会打印出c
减去 2 后的值。我减去 2 是因为 ps 和 awk 命令在命令执行期间几乎总是被认为是可运行的。最终结果将是一个数字,表示脚本执行时可运行的进程数(不包括自身和进程 run )nicely
,这本质上是计算机上的瞬时负载。您需要定期运行此程序,并在 1 分钟、5 分钟和 15 分钟内取平均值,以确定计算机的典型平均负载。
答案2
好吧,这里是真正的老线程,但我想把我自己的 2 美分放在这里,以防有人像我一样需要这个。在我的特殊情况下,我需要百分比结果,并且我不希望考虑到好的 CPU 时间。
我发现我的机器(debian)上默认安装了实用程序 mpstat,我相信它是一个相当基本的实用程序,可用于大多数发行版。
运行mpstat 2 1
(2 秒一个周期 - 2 秒内平均 CPU 使用率)给出以下输出:
Linux 3.16.0-4-amd64 (vm4) 12/14/2017 _x86_64_ (4 CPU)
11:51:51 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:51:53 PM all 3.02 96.86 0.12 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: all 3.02 96.86 0.12 0.00 0.00 0.00 0.00 0.00 0.00 0.00
您会注意到它是如何为您很好地拼写的,最后是漂亮的列和空闲的列。您注意到在这种情况下,nice 确实很高。
使用下面的命令来发挥一点 awk 的魔力(为清楚起见,进行了分解,希望您能遵循,这不是 awk 教程):
mpstat 2 1| \
awk '$3 ~ /CPU/ { \
for(i=1;i<=NF;i++) { \
if ($i ~ /%nice/) {nice=i} \
if ($i ~ /%idle/) {idle=i} \
} \
} \
$3 ~ /all/ { print 100 - $nice - $idle }'
我们得到以下结果:
3.14
这正是我们想要的。我们假设 100 作为总百分比,并从中减去任何空闲时间(在本例中为 0.00)和任何美好时间(在本例中为 96.86)。瞧,我们得到了结果。
在我的例子中,我使用了,mpstat 2 1
但您也可以使用mpstat 10 1
,结果将是最后 10 秒的平均负载。只是该命令需要 10 秒才能完成,因为它必须采样 10 秒。但 2 秒足以满足我获得想法的需要。
答案3
我只需要类似的东西。答案来自姆科米泰帮助过我。
但该命令ps -e
仅列出进程。负载应该考虑到一个进程可能有许多并行运行的线程。我建议-L
在调用中添加选项ps
以列出所有线程:
ps -eLo state,nice | awk 'BEGIN {c=0} $2<=0 && $1 ~ /R/ { c++ } END {print c-2}'