如何根据 SNMP 中的原始 CPU 滴答计算 CPU %

Bo *_*nes 7 monitoring central-processing-unit nagios snmp

根据http://net-snmp.sourceforge.net/docs/mibs/ucdavis.html#scalar_notcurrent ssCpuUserssCpuSystemssCpuIdle等被弃用,以支持原始变体(ssCpuRawUser等)。

前一个值(不包括 nice、wait、kernel、interrupt 等)返回一个百分比值:

在最后一分钟内计算的处理用户级代码所花费的 CPU 时间百分比。

此对象已被弃用,取而代之的是“ ssCpuRawUser(50)”,它可用于计算相同的指标,但可以在任何所需的时间段内计算。

原始值返回 CPU 花费的“原始”滴答数:

处理用户级代码所花费的“滴答”数(通常为 1/100 秒)。

在多处理器系统上,“ ssCpuRaw*”计数器在所有 CPU 上累积,因此它们的总和通常为 N*100(对于 N 个处理器)。

我的问题是:如何将刻度数转换为百分比?

也就是说,你怎么知道每秒有多少滴答声(通常——这意味着不总是——1/100s,这意味着每 100 秒一次,或者滴答声代表 1/100 秒)。

我想您还需要知道有多少个 CPU,或者您需要获取所有 CPU 值以将它们加在一起。我似乎找不到一个 MIB,它可以为您提供 CPU 数的整数值,这使得前一条路线很尴尬。后一条路线似乎不可靠,因为一些数字重叠(有时)。例如,ssCpuRawWait有以下警告:

此对象不会在底层操作系统不测量此特定 CPU 指标的主机上实现。 该时间也可能包含在“ ssCpuRawSystem(52)”计数器内。

一些帮助将不胜感激。似乎到处都在说 % 已被弃用,因为它可以派生,但我还没有找到任何显示执行此派生的官方标准方法的地方。

第二个组成部分是这些“滴答声”似乎是累积的,而不是在某个时间段内。如何在一段时间内对值进行采样?

我想要的最终信息是:“当前”(过去 1-60 秒可能就足够了)的用户、系统、空闲、好(理想情况下是窃取,尽管似乎没有标准 MIB)的百分比,偏好较小的时间跨度)。

chu*_*utz 4

由于这些是绝对计数器,因此您必须定期检索这些指标,然后自己进行计算。因此,如果您想要下一分钟的号码,您必须先获取号码,等待一分钟,然后再次获取号码。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."
Run Code Online (Sandbox Code Playgroud)

然后,无论您进行测量以来已经过了多长时间,该时间段内的刻度总数为total1 - total0。闲置百分比将为(idle1-idle0)/(total1-total0)

您问“您如何知道通常每秒有多少个滴答声”,但正如您所看到的,您不需要知道这一点。