如何根据 SNMP 中的原始 CPU 滴答计算 CPU 百分比

如何根据 SNMP 中的原始 CPU 滴答计算 CPU 百分比

根据http://net-snmp.sourceforge.net/docs/mibs/ucdavis.html#scalar_notcurrent ssCpuUser、、、等已被弃用,取而代之的是原始变体(ssCpuSystem、等)。ssCpuIdlessCpuRawUser

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

过去一分钟内计算出的处理用户级代码所花费的 CPU 时间百分比。

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

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

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

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

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

也就是说,你怎么知道每秒有多少个滴答声(它是通常— 这意味着并非总是 — 1/100 秒,要么意味着每 100 秒出现 1 次,要么意味着一个刻度代表 1/100 秒)。

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

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

非常感谢您的帮助。似乎到处都只是说 % 已被弃用,因为它可以被推导,但我没有找到任何地方显示执行此推导的官方标准方法。

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

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

答案1

由于这些是绝对计数器,因此您必须定期检索这些指标,然后自己进行计算。因此,如果您想要超过下一个分钟,您必须获取数字,等待一分钟,然后再次获取数字。 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)

您正在问“您怎么知道通常每秒有多少个滴答声”但正如您所见,您不需要知道这一点。

答案2

自从最多Linux 发行版都有 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 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 / - 这基本上就是脚本所做的!

答案3

除了 chutz 已经写的内容之外,还可以在以下位置找到对滴答持续时间的参考man 2 times

可以使用以下方法获取每秒的时钟滴答数:

     sysconf(_SC_CLK_TCK);

这是一个在 C 中调用的系统函数,但也可以通过getconf CLK_TCK在 shell 中运行来获取。这个数字是一个编译时常量,可以可以被接触源文件的任何人改变,但这是一个相当罕见的事件 - 常见的 Linux 发行版都带有值 100。

例如:

$ getconf CLK_TCK
100

相关内容