Назад | Перейти на главную страницу

Как рассчитать% ЦП на основе необработанных тиков ЦП в SNMP

В соответствии с http://net-snmp.sourceforge.net/docs/mibs/ucdavis.html#scalar_notcurrent ssCpuUser, ssCpuSystem, ssCpuIdleи т. д. устарели в пользу необработанных вариантов (ssCpuRawUser, и т.д).

Первые значения (которые не охватывают такие вещи, как nice, wait, kernel, interrupt и т. Д.) Возвращали процентное значение:

Процент процессорного времени, затраченного на обработку кода пользовательского уровня, рассчитанный за последнюю минуту.

Этот объект устарел и заменен на "ssCpuRawUser(50)', который можно использовать для расчета той же метрики, но за любой желаемый период времени.

Необработанные значения возвращают "сырое" количество тиков, потраченных ЦП:

Количество тактов (обычно 1/100), затраченных на обработку кода пользовательского уровня.

В многопроцессорной системе 'ssCpuRaw*'счетчики суммируются для всех процессоров, поэтому их сумма обычно составляет N * 100 (для N процессоров).

У меня вопрос: как перевести количество тиков в проценты?

То есть как узнать, сколько тиков в секунду (это обычно - что подразумевает не всегда - 1/100 с, что означает либо 1 каждые 100 секунд, либо тик представляет 1/100 секунды).

Я полагаю, вам также нужно знать, сколько процессоров есть или вам нужно получить все значения ЦП, чтобы сложить их все вместе. Я не могу найти MIB, который дает вам целочисленное значение для # процессоров, что делает первый маршрут неудобным. Последний путь кажется ненадежным, потому что некоторые числа перекрываются (иногда). Например, ssCpuRawWait имеет следующее предупреждение:

Этот объект не будет реализован на хостах, где базовая операционная система не измеряет этот конкретный показатель ЦП. Это время также может быть включено в 'ssCpuRawSystem(52)счетчик.

Некоторая помощь будет оценена. Везде, кажется, просто говорится, что% устарел, потому что он может быть получен, но я не нашел нигде, который показывает официальный стандартный способ выполнения этого вывода.

Второй компонент заключается в том, что эти «тики» кажутся кумулятивными, а не в течение некоторого периода времени. Как сделать выборку значений за определенный период времени?

Конечная информация, которую я хочу:% пользователя, системы, простоя, хорошего (и в идеале - кражи, хотя, похоже, для этого не существует стандартной MIB) «в настоящее время» (за последние 1-60 секунд, вероятно, будет достаточно, с предпочтением меньших временных интервалов).

Поскольку это абсолютные счетчики, вам придется регулярно извлекать эти метрики, а затем выполнять вычисления самостоятельно. Итак, если вы хотите, чтобы число превышало следующий минуту, вам нужно будет получить числа, подождать минуту и ​​снова получить числа. SNMP не будет обновлять эти числа слишком часто, поэтому вы все равно не сможете получать их каждую секунду.

Если у вас есть счетчики необработанных пользователей, nice, system, idle, прерываний, вы можете получить общее количество тиков, суммируя их. Даже в описании 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).

Вы спрашиваете: «Как узнать, сколько тиков в секунду обычно?», Но, как видите, вам не нужно этого знать.

поскольку большинство дистрибутивов 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, также генерирующий ввод-вывод с 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:

Количество тактов часов в секунду можно получить, используя:

     sysconf(_SC_CLK_TCK);

которая является системной функцией, которая вызывается в C, но также может быть получена простым запуском getconf CLK_TCK в вашей оболочке. Это число - постоянная времени компиляции и мог может быть изменен любым, кто прикоснется к исходным файлам, но это будет довольно редким событием - все распространенные дистрибутивы Linux имеют значение 100.

Например:

$ getconf CLK_TCK
100