web-dev-qa-db-ja.com

SNMPの生のCPUティックに基づいてCPU%を計算する方法

によると http://net-snmp.sourceforge.net/docs/mibs/ucdavis.html#scalar_notcurrentssCpuUserssCpuSystemssCpuIdle 、などは生のバリアント(ssCpuRawUserなど)のために廃止されました。

以前の値(Nice、wait、kernel、interruptなどをカバーしない)はパーセント値を返しました。

直前の1分間に計算された、ユーザーレベルのコードの処理に費やされたCPU時間の割合。

このオブジェクトは「ssCpuRawUser(50)」に置き換えられて廃止されました。これは、同じメトリックを計算するために使用できますが、任意の期間にわたって使用できます。

生の値は、CPUが費やした「生の」ティック数を返します。

ユーザーレベルのコードの処理に費やされた「ティック」の数(通常は1/100秒)。

マルチプロセッサシステムでは、 '_ssCpuRaw*_'カウンターはすべてのCPUにわたって累積されるため、それらの合計は通常N * 100(Nプロセッサの場合)になります。

私の質問は、ティックの数をどのようにパーセンテージに変えるのですか?

つまり、1秒あたりのティック数(通常はです)—これは常にではないことを意味します— 1/100s、つまり100秒ごとに1を意味するか、ティックが1を表すことを意味します/ 100秒)。

また、CPUがいくつあるかまたはを把握する必要があると思います。すべてのCPU値をフェッチして、それらをすべて追加する必要があります。 CPUの数の整数値を提供するMIBが見つからないため、前のルートが扱いにくくなっています。後者のルートは、一部の数値が重複しているため、信頼できないようです(時々)。たとえば、ssCpuRawWaitには次の警告があります。

このオブジェクトは、基盤となるオペレーティングシステムがこの特定のCPUメトリックを測定しないホストには実装されません。 この時間は、 'ssCpuRawSystem(52)'カウンターにも含まれる場合があります。

いくつかの助けをいただければ幸いです。どこでも%は派生できるため非推奨であるとだけ言われているようですが、この派生を実行する公式の標準的な方法を示す場所はどこにもありません。

2番目の要素は、これらの「ティック」が一定期間ではなく累積的であるように見えることです。ある期間にわたって値をサンプリングするにはどうすればよいですか?

私が必要とする究極の情報は、ユーザーの割合、システム、アイドル、ニースです(理想的にはこれを盗みますが、これには標準のMIBがないようです)「現在」(最後の1〜60秒でおそらく十分ですが、より短い期間を優先します)。

7
Bo Jeanes

これらは絶対カウンターなので、これらのメトリックを定期的に取得してから、自分で計算を行う必要があります。したがって、next分を超える数値が必要な場合は、数値を取得し、1分待ってから再度数値を取得する必要があります。 SNMPはこれらの番号を頻繁に更新しないため、とにかくこれらを毎秒取得することができない場合があります。

Rawユーザー、Nice、system、idle、interruptsカウンターを取得したら、これらを合計することでティックの総数を取得できます。 MIBの説明でさえ、それらを追加することが期待されていると述べています。

$ snmptranslate -Td .1.3.6.1.4.1.2021.11.52
UCD-SNMP-MIB::ssCpuRawSystem
...
    This object may sometimes be implemented as the
    combination of the 'ssCpuRawWait(54)' and
    'ssCpuRawKernel(55)' counters, so care must be
    taken when summing the overall raw counters."

次に、測定を行ってからの経過時間に関係なく、その期間のティックの総数はtotal1 - total0。アイドル率は(idle1-idle0)/(total1-total0)

「1秒あたりのティック数が通常どのようにわかるか」と尋ねていますが、ご覧のとおり、そのことを知る必要はありません。

4
chutz

Linuxディストリビューションのmostには1/100ティックがあるため、これを行う非常に簡単な方法はbashを使用することです。

[myhost]# echo "scale=2; -1 * (`snmpget -Oqv -v2c -c public localhost .1.3.6.1.4.1.2021.11.54.0;sleep 5` - `snmpget -Oqv -v2c -c public localhost .1.3.6.1.4.1.2021.11.54.0` )/`snmpwalk -Oqu -v2c -c public localhost 1.3.6.1.2.1.25.3.3.1.2 | wc -l`/5" | bc | sed 's/^\./0./' | awk '{print "CPU_IOWAIT% " $1}'

IOWAIT 0.07

[myhost]#

RH/CentosとUbuntuでは、5秒間隔で正確に動作します...それよりも小さいと、snmpはCounter32をインクリメントせず、常にゼロを取得します。

ループを実行してiostat -c 5 100と比較し、IO with ddも生成しましたが、うまくいきました。

SsCPUraw OIDのいずれかを使用できます(1.3.6.1.4.1.2021.11.5x、50から57まで、私が間違っていない場合、この例ではssCPURawWait、54を使用しています)。1.3.6.1.2.1.25.3.3.1.2 | wc -lはコアの数...

カウンター/間隔の「デルタ」を分割する必要があります-私の場合、5 /-これは基本的にスクリプトが行うことです!

Chutzによってすでに記述されているものに加えて、ティックの持続時間への参照はman 2 timesにあります。

1秒あたりのクロックティック数は、以下を使用して取得できます。

     sysconf(_SC_CLK_TCK);

これはCで呼び出されるシステム関数ですが、シェルでgetconf CLK_TCKを実行するだけでも取得できます。この数値はコンパイル時の定数であり、ソースファイルに触れた人はcouldを変更できますが、これはかなりまれなイベントです-一般的なLinuxディストリビューションにはすべて値100が付属しています。

例えば:

$ getconf CLK_TCK
100
2
the-wabbit