総CPU使用率をカウンタで監視したい。私がカウンターとして使用したいのは、サンプル間でデータが失われないためです(そして、フローティング側で比率を計算することができます)。
私の最初のアプローチは/proc/uptime
公式を使用することでした(uptime-(idle_time/num_core))*100
。これは通常、多数のサーバー(約98%)で正確に見えますが、時には間違った結果が表示されるようです。たとえば、以下は否定的なCPU使用率を示すようですが、実際には意味がありません。
[root@ny-lb05 ~]# echo -e "scale=10\n ($(cut -f1 -d' ' /proc/uptime)-($(cut -f2 -d' ' /proc/uptime)/16))*100" | bc
5646895.3750000000
[root@ny-lb05 ~]# echo -e "scale=10\n ($(cut -f1 -d' ' /proc/uptime)-($(cut -f2 -d' ' /proc/uptime)/16))*100" | bc
5646891.5625000000
このサーバーでは、私は以下を実行しています。
Linux ny-lb05.ds.stackexchange.com 2.6.32-431.11.2.el6.x86_64 #1 SMP Tue Mar 25 19:59:55 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
この計算でエラーを見つけた人はいますか?カウンタでCPU使用率を取得するより良い方法はありますか?
修正する:
だから私が追求するのは単調に増加するカウンターとしての総使用時間です。総利用率が絶対に高くないことを願っています。減らす。さて、以下のような場合のようです。
[root@ny-lb05 ~]# read uptime idle </proc/uptime; echo -e "scale=1000\n ($uptime*16-($idle))" | bc 903874.23 [root@ny-lb05 ~]# read uptime idle </proc/uptime; echo -e "scale=1000\n ($uptime*16-($idle))" | bc 903870.29
また、/proc/cpuinfoによると、cores = siblingsなのでHTがアクティブになっていないようです。
アップデート2:
長すぎます。 /proc/uptimeにバグがあります。代わりに /proc/stat を使用してください。
答え1
(稼働時間 - (idle_time/num_core))
システムがどれだけ長く使用されているかを秒単位で確認できます。ここに100を掛けると100分の1秒になります。それは意図ですか?
IMO はプロセッサの秒数を考慮し、アイドル時間を減算する方が合理的です。
uptime * num_core - idle_time = total active processor seconds
利用度指標は次のとおりです。
active seconds / (uptime * num_core)
たとえば、システムが4つのコアで10秒間実行され、アイドル時間が5秒の場合:
(10 * 4 - 5) / (10 * 4) = 0.875
稼働率は87.5%である。
または:
(10 - 5 / 4) / 10 = 0.875
同様に、1つのタスクを保存します。
カウンタでCPU使用率を取得するより良い方法はありますか?
システム診断C ++ライブラリで、/proc/stat
すべてのコアの合計である最初の行を解析してこれを実行します。最初の3つのフィールドは、ユーザー時間、低優先順位(良好とも呼ばれる)時間、およびシステム時間です。これらの合計はアクティブ時間の量です(ここの単位は秒ではありません。/proc/stat
以下を参照man proc
)。
USER_HZが100と仮定して5秒以上ポーリングする場合は、total_a
最初のサンプル(user + Nice + sys)、total_b
2番目のサンプルです。
(total_b - total_a) / 5 / 100 / num_cores = usage ratio
ここに100を掛けると、5秒間隔の平均を表すパーセンテージが得られます。
ロジックは次のとおりです。
total_b - total_a
=サンプル間の活動時間サンプル期間(5秒)で割ります。
1秒あたりの測定単位(USER_HZ)で割ります。
コア数で割った値
USER_HZはほぼ確実に100です。確認すべき事項:
#include <stdio.h>
#include <unistd.h>
int main (void) {
printf (
"%ld\n",
sysconf(_SC_CLK_TCK)
);
return 0;
}
コンパイル: gcc whatever.c
、実行./a.out
。
シェルツールを使用して正確な持続時間を得ることは困難です。したがって、合計アクティブ時間測定を増やすか(私の考えではこれがあなたの意図であると仮定する)、かなり長い間隔(例えば30秒以上)を使用することができます。
答え2
/proc/cputime
2つの別々のプロセスからデータを読み取っているため、問題が発生する可能性があります。各時間のアイドル時間がわずかに増加するため、cat
2番目の読み取り値が低下する可能性があります。代わりに、次のことをお勧めします。
read uptime idle </proc/cputime
echo -e "scale=10\n ($uptime-($idle/16))*100" | bc
また、結果を総利用率として表示するには、再び稼働時間に分割する必要があります。
read uptime idle </proc/cputime
echo -e "scale=10\n ($uptime-($idle/16))/$uptime*100" | bc