良いプロセスで発生した負荷を除いて負荷平均を返す方法はありますか?
複数の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
2番目の列(nice)が0以下で、最初の列にR(実行可能を意味)が含まれている場合はそれをインクリメントします。完了したら、値からc
2を引いた値を印刷します。 ps および awk コマンドは、コマンドの実行中にほぼ常に実行可能と見なされるため、2 を引くことになります。最終結果は、スクリプトの実行中に実行できるプロセスの数(それ自体と実行中のプロセスを除く)を示す数値です。nicely
これは本質的にコンピュータの瞬間的な負荷です。コンピュータの一般的な負荷平均を確認するには、このプログラムを定期的に実行し、1分、5分、15分にわたって平均を計算できます。
答え2
さて、これはここで本当に古いスレッドですが、誰かが私のようにこれを必要とする場合に備えて、ここに私自身の2セントを入れたいと思いました。私の特別なケースでは、パーセンテージ結果が必要で、良いCPU時間を考慮したくありません。
私はmpstatユーティリティが私のコンピュータ(debian)にデフォルトでインストールされていることを発見しました。私はこれがほとんどのディストリビューションで利用できるかなり基本的なユーティリティだと思います。
実行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}'