获取不包括好的进程的平均负载

获取不包括好的进程的平均负载

有没有办法返回平均负载,排除由好进程引起的任何负载?

我们有一个负载平衡机制,可以检查多个Linux服务器的负载,并将作业提交给负载最低的服务器。我们有一个场景,所有服务器的负载都太高,因此无法在负载平衡中选择任何服务器。然而,我注意到服务器正在处理一堆很好的进程,因此尽管平均负载很高,但提交另一项作业仍然是“安全的”。

如果需要澄清,请告诉我。谢谢。

答案1

您可以编写自己的脚本,用于ps列出处于运行/可运行状态的所有进程,且 Nice 值不大于 0。您需要使用的特定语法将根据您的 版本而有所不同ps。像这样的事情可能会起作用:

ps -eo state,nice | awk 'BEGIN {c=0} $2<=0 && $1 ~ /R/ { c++ } END {print c-2}'

它运行时ps收集所有进程的级别statenice级别,并通过管道将输出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}'

相关内容