Pull to refresh

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

Reading time6 min
Views9.5K


Доброго времени суток уважаемый %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 можете смотреть статистику в браузере.
Tags:
Hubs:
+11
Comments27

Articles