Monitoring

如何根據 SNMP 中的原始 CPU 滴答計算 CPU %

  • December 31, 2018

根據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).

你在問“你怎麼知道它通常是每秒多少滴答聲”,但正如你所看到的,你不需要知道這一點。

引用自:https://serverfault.com/questions/441897