Мониторинг загрузки многоядерного сервера по каждому ядру в отдельности в Linux

Исходная задача: по SNMP загрузить параметры загруженности CPU с сервера по каждому ядру в отдельности (ОС Linux).

Простое решение:

Необходимые данные можно получить из файла /proc/stat

Описание структуры файла было вскоре найдено здесь http://www.linuxhowtos.org/System/procstat.htm
И так же был обнаружен простенький пример реализации (shell скрипт): http://colby.id.au/node/39

Осталось все это прикрутить к SNMP. У SNMP есть чудесная возможность - создать свой OID и прицепить к нему все что угодно :)

1. Пишем скрипт, в простейшем варианте выглядящий примерно так:

   #!/bin/bash

   PREV_TOTAL0=0
   PREV_TOTAL1=0
   PREV_IDLE0=0
   PREV_IDLE1=0

   while true; do
      CPU0=(`cat /proc/stat | grep '^cpu0 '`) # Общая картинка по cpu0
      CPU1=(`cat /proc/stat | grep '^cpu1 '`) # Общая картинка по cpu1
      unset CPU0[0] # отрезаем первый столбец (cpu0)
      unset CPU1[0] # отрезаем первый столбец (cpu1)
      IDLE0=${CPU0[4]} # время простоя cpu0.
      IDLE1=${CPU1[4]} # время простоя cpu1.

      # Подсчитаем суммарное время по cpu0
      TOTAL0=0
      for VALUE0 in "${CPU0[@]}"; do
         let "TOTAL0=$TOTAL0+$VALUE0"
      done 

      # Подсчитаем суммарное время по cpu1
      TOTAL1=0
      for VALUE1 in "${CPU1[@]}"; do
         let "TOTAL1=$TOTAL1+$VALUE1"
      done

      # Подсчитаем дельту с момента последнего замера по CPU0. 
      let "DIFF_IDLE0=$IDLE0-$PREV_IDLE0"
      let "DIFF_TOTAL0=$TOTAL0-$PREV_TOTAL0"

      # Вычисляем процент использования CPU0
      let "DIFF_USAGE0=(1000*($DIFF_TOTAL0-$DIFF_IDLE0)/$DIFF_TOTAL0+5)/10"

      # Подсчитаем дельту с момента последнего замера по CPU1.
      let "DIFF_IDLE1=$IDLE1-$PREV_IDLE1"
      let "DIFF_TOTAL1=$TOTAL1-$PREV_TOTAL1"

      # Вычисляем процент использования CPU1
      let "DIFF_USAGE1=(1000*($DIFF_TOTAL1-$DIFF_IDLE1)/$DIFF_TOTAL1+5)/10"

      #Результаты пишем в файлик
      echo "$DIFF_USAGE0">/opt/cpu_load
      echo "$DIFF_USAGE1">>/opt/cpu_load

      # Запоминаем текущее состояние, понадобиться при следующем цикле
      PREV_TOTAL0="$TOTAL0"
      PREV_TOTAL1="$TOTAL1"

      PREV_IDLE0="$IDLE0"
      PREV_IDLE1="$IDLE1"


      #exit
      # Собственно пауза перед следующим замером...
      sleep 59
   done



В файл конфигурации /etc/snmpd.conf добавляем строчку например такого вида

   exec .1.3.6.1.4.1.2021.54 cpu /bin/cat /opt/cpu_load


Что нам это дает (после перезапуска/запуска snmpd):

   snmpwalk -v 2c -c   1.3.6.1.4.1.2021.54

   UCD-SNMP-MIB::ucdavis.54.1.1 = INTEGER: 1
   UCD-SNMP-MIB::ucdavis.54.2.1 = STRING: "cpu"
   UCD-SNMP-MIB::ucdavis.54.3.1 = STRING: "/bin/cat /opt/cpu_load"
   UCD-SNMP-MIB::ucdavis.54.100.1 = INTEGER: 0
   UCD-SNMP-MIB::ucdavis.54.101.1 = STRING: "1"
   UCD-SNMP-MIB::ucdavis.54.101.2 = STRING: "2"


Собственно

   UCD-SNMP-MIB::ucdavis.54.101.1 = STRING: "1 - загрузка CPU0
   UCD-SNMP-MIB::ucdavis.54.101.2 = STRING: "2" - загрузка CPU1


Осталось добавить это в рисовалку и все.




Вас также может заинтересовать:

Ядру Linux исполнилось 22 года
Доступны для загрузки тестовые образы Red Hat Enterprise Linux 7
Let's Encrypt выходит в публичную бету: HTTPS всюду, каждому, отныне и навсегда бесплатно
Мониторинг Nginx с помощью MRTG
Мониторинг Sphinx с помощью MRTG
Мониторинг количества активных хостов в сети