如何根據 SNMP 中的原始 CPU 滴答計算 CPU %
根據http://net-snmp.sourceforge.net/docs/mibs/ucdavis.html#scalar_notcurrent
ssCpuUser
,ssCpuSystem
,ssCpuIdle
, 等已被棄用, 有利於原始變體 (ssCpuRawUser
, 等)。以前的值(不包括 nice、wait、kernel、interrupt 等)返回一個百分比值:
過去一分鐘計算的用於處理使用者級程式碼的 CPU 時間百分比。
此對像已被棄用,取而代之的是 ’
ssCpuRawUser(50)
’,它可用於計算相同的指標,但在任何所需的時間段內。原始值返回 CPU 花費的“原始”滴答數:
處理使用者級程式碼所花費的“滴答”數(通常為 1/100 秒)。
在多處理器系統上,’
ssCpuRaw*
’ 計數器在所有 CPU 上是累積的,因此它們的總和通常為 N*100(對於 N 個處理器)。我的問題是:如何將刻度數轉換為百分比?
也就是說,你怎麼知道每秒有多少滴答聲(通常是- 這意味著並不總是 - 1/100 秒,這意味著每 100 秒有 1 個滴答聲,或者一個滴答聲代表 1/100 秒)。
我想您還需要知道有多少 CPU,或者您需要獲取所有 CPU 值以將它們加在一起。我似乎找不到一個 MIB 可以為您提供 # of CPUs 的整數值,這使得前一條路線很尷尬。後一條路線似乎不可靠,因為一些數字重疊(有時)。例如,
ssCpuRawWait
有以下警告:此對像不會在底層作業系統不測量此特定 CPU 指標的主機上實現。 這個時間也可以包含在’
ssCpuRawSystem(52)
‘計數器中。一些幫助將不勝感激。到處似乎只是說 % 已被棄用,因為它可以派生,但我還沒有找到任何地方顯示執行此派生的官方標準方法。
第二個組成部分是這些“滴答聲”似乎是累積的,而不是在一段時間內。如何在某個時間段內對值進行採樣?
我想要的最終資訊是:“目前”(過去 1-60 年代可能就足夠了)使用者、系統、空閒、nice(理想情況下是竊取,儘管似乎沒有標準 MIB)的百分比,偏好更小的時間跨度)。
由於這些是絕對計數器,因此您必須定期檢索這些指標,然後自己進行計算。所以,如果你想要下一分鐘的號碼,你必須得到號碼,等待一分鐘,然後再次得到號碼。SNMP 不會太頻繁地更新這些數字,因此您可能無法每秒獲得這些數字。
一旦你有了原始使用者、nice、系統、空閒、中斷計數器,你就可以通過將它們相加來獲得總的滴答數。甚至 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)
.你在問“你怎麼知道它通常是每秒多少滴答聲”,但正如你所看到的,你不需要知道這一點。