Мониторинг ресурсов сервера под управлением *nix с помошью RRDtool



Доброго времени суток уважаемый %user%! Сегодня я расскажу, как поднять мониторинг железа и системы в реальном времени с использованием набора утилит — RRDtool. Нашей целью является сбор и графической отображение в реальном времени данных о работе системы: загрузка CPU, состояние памяти, загрузка сетевых интерфейсов, а так же температура процессора за различные периоды времени.

Немного теории. RRDtool – набор утилит для работы с кольцевыми базами данных. Такие базы специально созданы для хранения изменяющихся во времени последовательностей данных (сетевой трафик, загрузка CPU) – как раз то, что нам нужно. В дополнение будем использовать демон collectd – это небольшой демон, который занимается сбором статистики ресурсов системы за периоды времени – т.е. и создает необходимые кольцевые базы данных на основе которых при помощи RRDtool мы можем строить графики. Перед установкой допустим что у вас уже установлен и настроен веб сервер, он понадобится для просмотра графиков в браузере. Приступим к установке и настройке.

Все манипуляции проводились на свежемустановленном Debian 7 wheezy:

root@kd-ast:/etc/collectd# uname -a
Linux kd-ast 3.2.0-4-686-pae #1 SMP Debian 3.2.46-1 i686 GNU/Linux


Для отрисовки графиков необходимо установить RRDtool:

apt-get install rrdtool

Для сбора статистики об использовании ресурсов системы
вместо самописных скриптов, используем демон «Collectd»:

apt-get install collectd

Запускаем:

cd /usr/sbin/
./collectd onestart


После загрузки увидим в /var/lib/collectd/router.local, где «router.local» имя вашего сервера.
Теперь можно переходить к самому скрипту, который будет генерировать графики:

#!/bin/sh

### CPU
/usr/bin/rrdtool graph /var/www/monitor/cpu0.png \ #путь до RRDtoll и путь куда класть график 
 -e now \
 -s 'end - 6 hours' \
 -S 60 \
 --title "CPU USAGE: AMD Athlon(tm) II X3 455 Processor" \ #CPU
 --vertical-label "Percents" \
 --imgformat PNG \
 --slope-mode   \
 --lower-limit 0 \
 --upper-limit 100 \
 --rigid \
 -E \
 -i \
 --color SHADEA#FFFFFF \
 --color SHADEB#FFFFFF \
 --color BACK#CCCCCC \
 -w 600 \
 -h 150 \
 --interlaced \
 --font DEFAULT:8:/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf \
 DEF:a=/var/lib/collectd/rrd/kd-ast/cpu-0/cpu-idle.rrd:value:MAX \ #пути к кольцевым БД
 DEF:b=/var/lib/collectd/rrd/kd-ast/cpu-0/cpu-system.rrd:value:MAX \
 DEF:c=/var/lib/collectd/rrd/kd-ast/cpu-0/cpu-user.rrd:value:MAX \
LINE2:b#2cc320: \
 AREA:b#54eb48:System \
LINE2:c#e7ad4a: \
 AREA:c#ebd648:User

#LINE1:a#CCCCCC:Idle \

###eth0

/usr/bin/rrdtool graph /var/www/monitor/network0.png \
 -e now \
 -s 'end - 6 hours' \
 -S 60 \
 --title 'Traffic on ext_if: eth0 (local) (100Mb/s)' \ ## название интерфейса
 --vertical-label 'Mbyte\s' \
 --imgformat PNG \
 --slope-mode   \
 --lower-limit 0 \
 --upper-limit 20000000 \ # пропускная способность - max
 --rigid \
 -E \
 -i \
 --color SHADEA#FFFFFF \
 --color SHADEB#FFFFFF \
 --color BACK#CCCCCC \
 -w 600 \
 -h 150 \
 --interlaced \
 --font DEFAULT:8:/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf \
 DEF:a=/var/lib/collectd/rrd/kd-ast/interface-eth0/if_octets.rrd:tx:MAX \
 DEF:b=/var/lib/collectd/rrd/kd-ast/interface-eth0/if_octets.rrd:rx:MAX \
 DEF:c=/var/lib/collectd/rrd/kd-ast/interface-eth0/if_errors.rrd:tx:MAX \
 AREA:a#4169E1:Tx \
LINE2:b#2cc320: \
AREA:b#54eb48:Rx \
LINE1:c#FF0000:Errors

### RAM
/usr/bin/rrdtool graph /var/www/monitor/memory.png \
 -e now \
 -s 'end - 6 hours' \
 -S 60 \
 --title 'MEMORY USAGE: 2Gb' \ # RAM
 --vertical-label 'Mbyte' \
 --imgformat PNG \
 --slope-mode   \
 --lower-limit 0 \
 --upper-limit 2000000000 \ # верхний лимит
 --rigid \
 -E \
 -i \
 --color SHADEA#FFFFFF \
 --color SHADEB#FFFFFF \
 --color BACK#CCCCCC \
 -w 600 \
 -h 150 \
 --interlaced \
 --font DEFAULT:8:/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf \
 DEF:a=/var/lib/collectd/rrd/kd-ast/memory/memory-buffered.rrd:value:MAX \ # пути до кольцевых БД
 DEF:b=/var/lib/collectd/rrd/kd-ast/memory/memory-cached.rrd:value:MAX \
 DEF:c=/var/lib/collectd/rrd/kd-ast/memory/memory-free.rrd:value:MAX \
 DEF:d=/var/lib/collectd/rrd/kd-ast/memory/memory-used.rrd:value:MAX \
 LINE1:a#6959CD:buffered \
AREA:b#00FF00:cache \
LINE2:c#006400: \
AREA:c#00CD66:free \
AREA:d#FF1493:used \


Добавим его в крон, для выполнения через каждую минуту:

nano /etc/crontab

*/1 * * * * root /home/sysbes/Scripts/RRDtool/mon.sh > /dev/null 2>&1

Cоздадим index.php с таким содержимым:

<html>
<head>
<meta charset='koi8-r'>
<title>NOC</title>
</head>
<body bgcolor='#8FBC8F'>
<br>
<center> <h2><font face='Arial'>Визуализация системных ресурсов: kd-ast</font></h2>
<br><br>
<center> <img src='cpu0.png'> </center><br>
<center> </h2> <img src='network0.png'> </center><br>
<center> </h2> <img src='memory.png'> </center><br>
</body>
</html>


Можем смотреть получившиеся графики открыв в браузере: ваш_сервер/monitor

Для определения температуры будем использовать lm-sensors — набор драйверов и утилита позволяющая отслеживать температуру, напряжение, скорость вращения вентиляторов в вашей системе. Следует помнить, что набор датчиков индивидуален для Вашей системы, поэтому некоторые возможности могут быть недоступны. Так же можете использовать mbmon.

apt-get install lm-sensors

Для определения датчиков:

sensors-detect

Скрипт задаст вам несколько вопросов — не пугайтесь.

Пробуем определить:

sensors

Если температура неверная или не определяется, возможно придется подгрузить модуля ядра, мне помогло:

modprobe it87

и снова sensors

Если температура вывелась правильно добавляем модуль it87 в автозагрузку:

nano /etc/modules

it87


sensors

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

Скрипт выдался следующим:

#!/bin/bash

RRDTOOL=/usr/bin/rrdtool #путь до RRDtool

DATABASE=/var/lib/collectd/rrd/kd-ast/space-temperature.rrd # путь до кольцевой ДБ
PERIOD=60

SENSOR=` /usr/bin/sensors | grep temp3 | awk '{ print $2-0}'` # команда запроса температуры

IMAGE_PATH=/var/www/monitor # куда складывать графики

TITLE_TEXT='CPU TEMP'

UNDER_TEXT='TEMP'

TEMP_MIN=20
TEMP_MAX=90


if ! [ -f $DATABASE ]
        then
                $RRDTOOL create $DATABASE -s $PERIOD DS:temperature:GAUGE:600:10:80 \
                RRA:AVERAGE:0.5:1:576 \
                RRA:AVERAGE:0.5:6:672 \
                RRA:AVERAGE:0.5:24:732 \
                RRA:AVERAGE:0.5:144:1460
        fi

$RRDTOOL update $DATABASE N:$SENSOR

function DRAW_GRAPHIC

{

        NOW_HOUR=`date +%H`
        NOW_MIN=`date +%M`
        NOW_SEC=`date +%S`

        case $2 in
        day)
                 TIME_TEXT="Last 24 hours"
                 ;;
        week)
                 TIME_TEXT="Last week"
                 ;;
        month)
                 TIME_TEXT="Last mounth"
                 ;;
        year)
                 TIME_TEXT="Last year"
                 ;;
        esac

        $RRDTOOL graph $IMAGE_PATH/$1 \
        -s -1$2 \
        -e now \
        -a PNG \
        -v 'C' \
        -t "$TITLE_TEXT [$HOSTNAME] - $TIME_TEXT" \
        -l $TEMP_MIN \
        -u $TEMP_MAX \
        -r \
        -E \
        -i \
        -R light \
        --zoom 1.0 \
        -w 600 \
        -h 150 \
        DEF:temperature=$DATABASE:temperature:AVERAGE \
        LINE2:temperature#33cc33:"$UNDER_TEXT" \
        GPRINT:temperature:MIN:'MIN\:%2.lf' \
        GPRINT:temperature:MAX:'MAX\:%2.lf' \
        GPRINT:temperature:AVERAGE:'AVG\:%4.1lf' \
        GPRINT:temperature:LAST:'NOW\:%2.lf \n' \
        COMMENT:"TIME \: $NOW_HOUR\:$NOW_MIN\:$NOW_SEC \n"

}

DRAW_GRAPHIC 'temp_d.png' 'day'
DRAW_GRAPHIC 'temp_w.png' 'week'
DRAW_GRAPHIC 'temp_m.png' 'month'
DRAW_GRAPHIC 'temp_y.png' 'year'


Скрипт добавьте в crontab, на выполнение каждую минуту:

*/1 * * * * root /home/sysbes/temp.sh > /dev/null 2>&1

Примерный вид таблицы статистики такой:

<html>
<head>
<meta charset='koi8-r'>
<title> RRD графики температуры : Маршрутизатор БЛА-БЛА</title>
</head>
<body bgcolor='#ccddcc'>
 <h2> <font face='Arial'> Температура процессора @ маршрутизатор БЛА-БЛА </font> </h2>
 <img src='png/temp_d.png'> <br>
 <img src='png/temp_w.png'> <br>
 <img src='png/temp_m.png'> <br>
 <img src='png/temp_y.png'>
</body>
</html>


В итоге получаем:

<html>
<head>
<meta charset='koi8-r'>
<title>kd-ast</title>
</head>
<body bgcolor='#8FBC8F'>
<br>
<center> <h2><font face='Arial'>Real Time Load kd-ast:</font></h2>
<center> <img src='cpu0.png'> </center><br>
<center> </h2> <img src='network0.png'> </center><br>
<center> </h2> <img src='memory.png'> </center><br>
<center> <h2><font face='Arial'>CPU TEMP kd-ast:</font></h2>
 <img src='temp_d.png'> <br>
 <img src='temp_w.png'> <br>
 <img src='temp_m.png'> <br>
 <img src='temp_y.png'>
</body>
</html>


По запросу ваш_сервер/monitor можете смотреть статистику в браузере.

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 27

    +11
    Я просто оставлю это здесь munin-monitoring.org/
      +5
      Cacti в ту же копилку.
        +3
        zabbix.
      0
      А может поясните, для не знающих, в чем преимущества? Нужно писать bash-скрипты или графики «из коробки»? Какую статистику снимает?
        0
        С munin не работал, но всё вышеперечисленное — решения на базе rrdtool «из коробки». При этом нельзя сказать, что они негибкие или простые при детальном изучении.
      0
      вот вам еще XYMon
        0
        collectd+graphite
        collectd+collection3
          0
          Да куча есть вэбморд, зачем такой велосипед — совсем не понимаю, может автор прояснит что у него не сложилось с решениями на офф.сайте
            0
            Хотелось понять и разобраться как это работает, а установив готовую систему и включив в конфиге отображение нужных графиков это сделать не получилось. Данный способ минималистичен, и ведь большинству как раз нужно отображения всего нескольких показателей, а использовать для этого такие гиганты считаю не целесообразно.
              0
              Так демон работает сам по себе, ему от Вас нужны только конфиги и все. Да и какие гиганты? возьмите тот же CGP — минималистичный динамический интерфейс, для работы нужен web-сервер и PHP. От Вашего отличается лишь наличием PHP, но уровень панели несколько другой, чем просто изображения статики.
                0
                Хочешь понять как это работает — напиши к нему плагин. или почитай исходники :)
            +4
            munin, cacti. Зачем изобретать своё?
              +2
              и munin, и cacti тянет за собой слишком много. Если нужно просто рисовать график двух счётчиков, то голый rrdtool лучше.
              –1
              Опечатка в заголовке:
              «Мониторинг ресурсов сервера под управлением *nix с подошью RRDtool»
                0
                Спасибо, исправил.
                +1
                Ко всему прочему есть еще Zabbix, который может не только снимать статистику но и предупреждать по удобному каналу связи или задействовать скрипты, если значения принятых данных отличаются от заднных порогов. Хорошо документирован к тому же.
                  +1
                  как уже написали выше — для двух счетчиков Zabbix это оверхэд. Проще действительно голыми скриптами
                  +3
                  Да простит меня автор, но при помощи утилит для работы с Round-robin БД ничего мониторить нельзя. Можно только удобно хранить результаты мониторинга (и не только) и строить удобные графики тоже можно, что и делается в большинстве систем. Короче говоря, переименуйте в «Хранение и отображение результатов мониторинга ресурсов сервера под управлением *nix при помощи RRDtool»
                    0
                    <Зануда mode off>
                    +4
                    Это ужасающе кривое и неэффективное решение. Ко всему прочему, администрировать это (особенно расширять) — пытка. Если вам так нравится collectd, почему бы не воспользоваться штатными GUI для него? Например, графики отлично рисует Graphite. Если вам нужен простой мониторинг на полпинка — используйте munin — он элементарно настраивается и очень легко расширяется. Если вам надо мониторить очень много и очень сложно (правила, зависимости, эскалации, SLA/SLS и прочие страшные штуки) — ваш выбор — Zabbix или Zeus (последний, правда, платный, хотя есть и бесплатная лицензия). Если вы мониторите оборудование, куда поставить агента невозможно физически — вам поможет cacti или тот же заббикс (но настраивать его на SNMP — пытка, и я вас предупредил!). Мониторинг — это очень древняя задача для админа, собственно работа админа и начиналась с двух задач — мониторинга и бэкапа. Инструментов для мониторинга — тьма. А хороший админ никогда не станет делать велосипед, если есть подходящее ему готовое решение.
                      0
                      Не нужно рассматривать данный топик как инструкцию к проектированию и внедрению системы мониторинга — это туториал, в котором объясняется как работают все подобные системы и как сделать свое элементарное решение и понять как это работает. Речь идет все лишь о простом мониторинге ресурсов одного сервера.
                        +1
                        Думаю, если бы было другое название статьи и чуть больше информации по работе непосредственно с rrdtool, статья воспринималась бы по другому.
                        –2
                        на счет хорошего админа — это верно подмечено
                        + в карму
                        0
                        image

                        лучше так процессор отображать, ибо видно недогруз нескольких ядер.
                          0
                          Ну раз минимализм, то еще заменить генерацию графика каждую минуту по крону на rrdcgi, нагрузка на генерацию графика будет только по запросу
                            0
                            Я за zabbix. С помощью него можно вытянуть какие-угодно параметры с сервера.

                            Only users with full accounts can post comments. Log in, please.