CPU比率をカウンタで取得するには?

CPU比率をカウンタで取得するには?

総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_b2番目のサンプルです。

(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秒以上)を使用することができます。

おすすめ記事