The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Мониторинг загрузки многоядерного сервера по каждому ядру в отдельности в 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 <community> <server_name> 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


Осталось добавить это в рисовалку и все.
 
24.01.2012 , Автор: fantom
Ключи: snmp, cpu, monitoring, shell / Лицензия: CC-BY
Раздел:    Корень / Администратору / Система / Просмотр состояния и мониторинг системы

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, Олег (??), 23:14, 24/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Что не понял, в htop это все и так есть
     
     
  • 2.6, fantom (ok), 11:19, 26/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Просветите, как из htop эту инфу в snmp запихнуть?
     

  • 1.2, Michael Shigorin (ok), 01:12, 25/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    collectd не смотрели?
     
     
  • 2.7, fantom (ok), 11:27, 26/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Нет, не смотрел...
    Насколько понял из описания он скорее для задачки "наоборот" т.е. снимать с чего-то по SNMP статистику и отправлять ее средсвами collectd дальше.
    Я хотел снять статистику именно по snmp как с любой другой железки типа роутера или свича.

    Или я неправ?

     

  • 1.3, mike_t (?), 09:30, 25/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    чем HOST-RESOURCES-MIB::hrProcessorLoad не устроил?
     
     
  • 2.4, Аноним (-), 20:33, 25/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    На линуксе его наверно нет)
     
     
  • 3.5, mike_t (?), 08:52, 26/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    наверно у меня какой-то не правильный линукс :(
     
  • 2.8, fantom (ok), 12:19, 26/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Поиск о нем ничего не выдал :)
    При поиске инфы в инете было обнаружено:

    1. http://linuxportal.ru/forums/index.php/m/69003/
    Не очень удобно - надо потом скриптом вывод парсить.

    2. http://www.qinet.ru/2010/09/311/
    Но в этих OID нет поядерной статистики.

    насчет
    HOST-RESOURCES-MIB::hrProcessorLoad

    snmpwalk -v 2c -c <comm> <host> hrProcessorLoad
    HOST-RESOURCES-MIB::hrProcessorLoad = No Such Object available on this agent at this OID

    Не подскажете как snmpd заставить оный отдавать? потестим-пощупаем что оно такое.

     
     
  • 3.12, mike_t (?), 09:17, 27/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    у меня из коробки работает
    net-snmp 5.5
     

  • 1.9, Рудвульф (?), 14:50, 26/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Собственно я не понимаю зачем такие мучения

    # snmpwalk -v2c -c public localhost .1.3.6.1.2.1.25.3.3.1
    iso.3.6.1.2.1.25.3.3.1.1.768 = OID: ccitt.0
    iso.3.6.1.2.1.25.3.3.1.1.769 = OID: ccitt.0
    iso.3.6.1.2.1.25.3.3.1.2.768 = INTEGER: 3
    iso.3.6.1.2.1.25.3.3.1.2.769 = INTEGER: 2

    усе работает - взял из штатных скриптов какти. PPS    Collectd и Monit   малофункциональные решения, какти рулит.  

     
     
  • 2.10, fantom (ok), 15:04, 26/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Собственно я не понимаю зачем такие мучения
    > # snmpwalk -v2c -c public localhost .1.3.6.1.2.1.25.3.3.1
    > iso.3.6.1.2.1.25.3.3.1.1.768 = OID: ccitt.0
    > iso.3.6.1.2.1.25.3.3.1.1.769 = OID: ccitt.0
    > iso.3.6.1.2.1.25.3.3.1.2.768 = INTEGER: 3
    > iso.3.6.1.2.1.25.3.3.1.2.769 = INTEGER: 2
    > усе работает - взял из штатных скриптов какти. PPS    
    > Collectd и Monit   малофункциональные решения, какти рулит.

    Повторю вопрос - как пнуть snmpd чтобы он сие отдал?

     
     
  • 3.11, Аноним (-), 20:18, 26/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    На snmpd не знаю, а вот на фряшном bsnmpd с установленным bsnmp-ucd оно работает.
     
     
  • 4.14, fantom (ok), 12:39, 28/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > На snmpd не знаю, а вот на фряшном bsnmpd с установленным bsnmp-ucd
    > оно работает.

    Как пнуть snmpd нашел, любопытнейшая вещь этот snmpd оказывается. :)

     
     
  • 5.16, mike_t (?), 12:43, 31/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    и что ему не хватало?
     
     
  • 6.17, fantom (ok), 12:56, 31/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > и что ему не хватало?

    Строчки
    view    systemview      included        .1.3.6.1.2.1.25.3.3.1
    В конфиге :)

     
  • 2.15, fantom (ok), 12:46, 28/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Собственно я не понимаю зачем такие мучения
    > # snmpwalk -v2c -c public localhost .1.3.6.1.2.1.25.3.3.1
    > iso.3.6.1.2.1.25.3.3.1.1.768 = OID: ccitt.0
    > iso.3.6.1.2.1.25.3.3.1.1.769 = OID: ccitt.0
    > iso.3.6.1.2.1.25.3.3.1.2.768 = INTEGER: 3
    > iso.3.6.1.2.1.25.3.3.1.2.769 = INTEGER: 2
    > усе работает - взял из штатных скриптов какти. PPS    
    > Collectd и Monit   малофункциональные решения, какти рулит.

    В процессе изучения вопроса узнал много для себя нового...
    Например теперь запросто можно снимать загрузку проца усредненную по любому промежутку времени - от 1 секунды и больше, мониторить максимальную за нужный интервал (минута, 2, 3 и т.д.).

     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру