Навигация
ГлавнаяФотогалереяКарта сайтаСтатьиМузыкаФильмыРейтинг контентаИнформация о сервереТемператураОбратная связь
Свежие записи
Что делать после приобретения оружияКак получить лицензию на оружиеРадиохоббиВышло обновление iOS 6.1Душевный блатнячок
Комменты
2017-10-23 15:35:49 [projects] Дим:
2017-10-11 12:42:42 [articles] Маша:
2017-10-06 10:09:52 [news] Николай:
2017-10-06 10:00:20 [projects] Николай:
2017-09-15 13:47:27 [projects] Artem:
2017-09-15 13:47:10 [projects] Artem:
2017-07-06 07:21:52 [projects] DarkEternal:
Теги
Друзья

RRDTool - графики на FreeBSD

Октября
2011 года
12
Теги: freebsd,
Раздел: odmin.info Статьи FreeBSD RRDTool - графики на FreeBSD
Просмотров: 6171
В общем захотелось мне визуальной статистики сервера, точнее температуры его процессора, да еще чтоб смской уведомление приходило, если проц перегревается... Пришлось разбираться с дикой на первый взгляд штукой как RRDTool.
RRDtool — набор утилит для работы с RRD (Round-robin Database, кольцевая база данных). Созданы Тоби Отикером (Tobias Oetiker) для хранения, обработки и визуализации динамических (изменяющихся во времени) последовательностей данных, таких как сетевой трафик, температура, загрузка процессора и так далее. Все данные хранятся в кольцевой базе, размер которой остаётся неизменным.
RRDtool включают в себя возможность графического отображения хранимой информации. Данный набор утилит распространяется под лицензией GNU GPL.
Если вы дочитаете статью до конца и проследуете инструкциям, то получите вот такие красивые графики:



Перед установкой не забываем обновить порты:
# portsnap fetch && portsnap update
Если порты обновляем в первый раз, тогда:
# portsnap fetch && portsnap extract && portsnap update
Конфигурируем (доавим галочку DeJaVu):
# cd /usr/ports/databases/rrdtool
# make config
Устанавливаем:
# make install clean
Теперь нам нужно создать саму базу данных, для этого напием такой скриптик... Стоп!!! Внимательный читатель заметит, что я не сказал, что мы будем хранить в базе: температуру, статистику по трафику или число видимых звезд на небе =)
Так вот! Идем по порядку. Для начала займемся мониторингом температуры. Возникает логичный вопрос: "А где ее взять? Как узнать температуру проца на BSD?". Вариантов как всегда несколько:
1-й. Использовать утилиту mbmon.
2-й. Мониторить средствами ядра.
Я выбрал второй вариант, ибо mbmon'y не нравится моя материнка, но как на зло в стандартном конфиге ядра нет поддержки мониторинга проца, поэтому пришлось пересобирать ядро.
Добавим в конфиг ядра следующую строчку:
device coretemp
Откомпилируем и установим новое ядро, и проверим выдает ли теперь система температуру проца:
# sysctl -a | grep temperature
если видим:
dev.cpu.0.temperature: 27
dev.cpu.1.temperature: 24
значит можно продолжать дальше.
Создадим RRD базу, при помощи скриптика:
ВАЖНО!!! RRD скрипты для создания базы и генерации графика пишутся в ОДНУ строку,
поэтому не следует игнорировать знак \


#!/bin/sh

rrdtool create cputemp.rrd --step 60 \
DS:core0:GAUGE:120:U:U \
DS:core1:GAUGE:120:U:U \
RRA:AVERAGE:0.5:1:4320 \
RRA:AVERAGE:0.5:15:2880 \
RRA:AVERAGE:0.5:120:2160 \
RRA:AVERAGE:0.5:720:1440 \
RRA:MIN:0.5:1:4320 \
RRA:MIN:0.5:15:2880 \
RRA:MIN:0.5:120:2160 \
RRA:MIN:0.5:720:1440 \
RRA:MAX:0.5:1:4320 \
RRA:MAX:0.5:15:2880 \
RRA:MAX:0.5:120:2160 \
RRA:MAX:0.5:720:1440 \
RRA:LAST:0.5:1:4320 \
RRA:LAST:0.5:15:2880 \
RRA:LAST:0.5:120:2160 \
RRA:LAST:0.5:720:1440
Теперь кратко о типах источников данных в базе RRD и функциях их консолидации:
Типы источников данных
COUNTER: для получения текущего значения отсчета предыдущее значение счетчика вычитается из текущего и делится на интервал между отсчетами (например, счетчик переданных байт). Переполнение счетчика обрабатывается только для типа COUNTER (предполагается, что счетчик 32 или 64-битный).

GAUGE: текущее значение отсчета приравнивается полученному значению счетчика (например, температура вместо изменения температуры).

DERIVE: COUNTER, который может уменьшаться.

ABSOLUTE: для получения текущего значения отсчета текущее значение счетчика делится на интервал между отсчетами (используется для счетчиков, обнуляемых при чтении).

COMPUTE: вычисляемое значение в виде rpn-выражения.
Функции консолидации данных в базе RRD
AVERAGE – среднее арифметическое всех отсчетов;
MIN и MAX – максимальное и минимальное значение;
TOTAL – сумма всех отсчетов;
LAST – последний полученный отсчет.

В версии 1.2 дополнительно к основным функциям добавлены еще несколько специализированных, обеспечивающих экспоненциальное сглаживание по алгоритму Холта-Винтерса – HWPREDICT, SEASONAL, DEVSEASONAL, DEVPREDICT и FAILURES.
Исходя из этого пробуем разобраться в том, что написано в скрипте для создания базы:
rrdtool create cputemp.rrd --step 60 \
# Создадим базу с наванием cputemp.rrd c шагом в 60 секунд, т.е. значения в базу мы будем заносить раз в минуту

DS:core0:GAUGE:120:U:U \
DS:core1:GAUGE:120:U:U \

# Укажем, что в базе будет два источника данных, для первого и второго ядра соответственно. core0 и core1 это как бы ссылки, по которым мы сможем делать выборку. GAUGE - тип источника, о них читаем выше. Значение 120 - это так называемый параметр heartbeat – максимально допустимый интервал (в секундах) между считываниями (рекомендуется двойной '--step '), при превышении которого промежуточные отсчеты заполняются значением UNKNOWN. Две буквы U также означают unknown, вместо этого можно подставить min и max значение соответственно, и если измеряемая величина не попадет в указанный с помощью этих значений интервал, она будет проигнорирована.

RRA:AVERAGE:0.5:1:4320 \
# У каждого источника данных может быть один или несколько RRA (round robin archive). AVERAGE - это функция консолидации данных, она указывает каким образом будут обрабатываться данные перед их записью в ячейку. Сам архив данных описывают числа идущие после функции консолидации, это параметры RRA. Число 0.5 показывает на достоверность – то есть число отсчетов со значением *UNKNOWN*, после превышения которого ячейка также принимает значение «U». Далее для удобства восприятия разберем запись с конца, она говорит о том, что в архиве будет создано 4320 ячеек, каждая из которых будет хранить среднее арифметическое значение всех отсчетов (согласно функции консолидации), производимых 1 раз в минуту, т.е. 4320/60=72, следовательно нам хватит ячеек чтобы хранить данные трое суток.

RRA:AVERAGE:0.5:15:2880 \
# Аналогично предыдущему, но данные будут вноситься 1 раз в 15 минут.

RRA:MIN:0.5:1:4320 \
# Этот архив будет хранить только минимальные значения измерений.

RRA:MAX:0.5:1:4320 \
# Этот архив будет хранить только максимальные значения измерений.

RRA:LAST:0.5:1:4320 \
# Этот архив будет хранить последние значения измерений.
Вот, вроде бы разобрались с самой базой, создали ее, теперь необходимо ее наполнять. А делается это проще простого, через маленький скриптик в cron. Саму базу я решил положить в /var/db/rrd, поэтому и пути все в скрипте прописаны на эту папку.
#!/bin/sh
rrd='/var/db/rrd'

core0=`sysctl -a | grep dev.cpu.0.temperature | awk -F " " '{print $2}'`
core1=`sysctl -a | grep dev.cpu.1.temperature | awk -F " " '{print $2}'`

`/usr/local/bin/rrdtool update $rrd/cputemp.rrd N:$core0:$core1`

Добавим запись в cron на выполнение скрипта 1 раз в минуту
*/1 * * * * root /usr/local/etc/scripts/coretemp.sh
Внимательный читатель заметит, что я обещал написать о том, чтобы наш сервер отправлял смску в случае превышения заданного порога температуры. Скрипт который снимает показания мы написали, а вот об смс'ном скрипте я расскажу ниже, ибо главной задачей статьи является рисование графиков.
Теперь наша база начала заполняться, а мы в это время перейдем к ниписанию скрипта, который и будет делать выборку из базы и отрисовавать график:
Скрипт для отрисовки графика температуры процессора за последние 12 часов
ВАЖНО!!! RRD скрипты для создания базы и генерации графика пишутся в ОДНУ строку,
поэтому не следует игнорировать знак \


#!/bin/sh

export LANG=UTF-8
export LC_ALL=ru_RU.UTF-8

#Picture CPU 12 hours

CPUBASE="/var/db/rrd/cputemp.rrd"
WWWPREFIX="/usr/local/www/apache22/data/odmin.info/serv"
RRDCMD="/usr/local/bin/rrdtool"
$RRDCMD graph $WWWPREFIX/cpu12h.png \
--width 580 \
--height 250 \
--imgformat PNG \
--start -12h \
--end now \
--slope-mode \
--font-render-mode light \
--font DEFAULT:8:Tahoma \
--font TITLE:9:Arial \
--font AXIS:7:Arial \
--font UNIT:8:"Courier New" \
--font LEGEND:7:"Courier New" \
--font WATERMARK:1:Arial \
--color BACK#2F2F2F \
--color CANVAS#003333 \
--color SHADEA#CCCCCC \
--color SHADEB#CCCCCC \
--color FONT#FFFFFF \
--color AXIS#FFFFFF \
--color ARROW#FF0000 \
--color GRID#CCCCCC \
--color MGRID#CCCCCC \
--vertical-label "Processor temerature, C" \
--title "Temperature from last 12 hours" \
DEF:core0=$CPUBASE:core0:LAST \
DEF:core1=$CPUBASE:core1:LAST \
LINE3:core0#FFFF00:"CPU core0 " \
AREA:core0#FF0000:"" \
GPRINT:core0:LAST:"Last %1.0lf deg, C " \
GPRINT:core0:MAX:"Max %1.0lf deg, C " \
GPRINT:core0:AVERAGE:"Avg %1.0lf deg, C " \
GPRINT:core0:MIN:"Min %1.0lf deg, C \c" \
COMMENT:"\s" \
LINE2:core1#00FF00:"CPU core1 " \
GPRINT:core1:LAST:"Last %1.0lf deg, C " \
GPRINT:core1:MAX:"Max %1.0lf deg, C " \
GPRINT:core1:AVERAGE:"Avg %1.0lf deg, C " \
GPRINT:core1:MIN:"Min %1.0lf deg, C \c" \
COMMENT:"\n"

Теперь снова начнем разбираться в этой всей писанине:
CPUBASE="/var/db/rrd/cputemp.rrd"
# Укажем к какой базе данных мы будем обращаться.

WWWPREFIX="/usr/local/www/apache22/data/odmin.info/serv"
# Зададим папку, куда будем сохранять картинки с графиками.

RRDCMD="/usr/local/bin/rrdtool"
# Укажем путь до бинарника rrdtool

$RRDCMD graph $WWWPREFIX/cpu12h.png \
# Скажем rrd'шнику - рисуй график и положи его в /usr/local/www/apache22/data/odmin.info/serv/cpu12h.png

--width 580 \
--height 250 \
--imgformat PNG \

# Зададим размеры графика и его формат. ВАЖНО!!! Фактический размер изображения будет больше т.к. в него добавляются title и легенды.

# Со шрифтами и цветами каждый может экспериментировать самостоятельно.

--vertical-label "Processor temerature, C" \
# Подпись оси Y (ординат).

--title "Temperature from last 12 hours" \
# Заголовок графика.

DEF:core0=$CPUBASE:core0:LAST \
DEF:core1=$CPUBASE:core1:LAST \

# Теперь самое интересное. Параметр DEF означает источник из которого будем брать данные для построения графика. Первая переменная core0, которая стоит до знака равно может иметь произвольное название, это непосредственно само значение из которого будет строиться график, а вот далее указываем саму базу и переменную, которую мы записали непосредственно в базе. LAST означает, что строить график будем по последним значениям.

LINE3:core0#FFFF00:"CPU core0 " \
# Это желтая линия на графике. Цифра 3 в конце LINE означает толщину линии.

AREA:core0#FF0000:"" \
# Красная зона под желтой линией.

GPRINT:core0:LAST:"Last %1.0lf deg, C " \
GPRINT:core0:MAX:"Max %1.0lf deg, C " \
GPRINT:core0:AVERAGE:"Avg %1.0lf deg, C " \
GPRINT:core0:MIN:"Min %1.0lf deg, C \c" \

# Выведем под графиком последнее, среднее, минимальное и максимальное значения измеряемой величины.

COMMENT:"\s" \
# Сделаем перенос строки.

LINE2:core1#00FF00:"CPU core1 " \
# Зеленая линия температуры второго ядра.

GPRINT:core1:LAST:"Last %1.0lf deg, C " \
GPRINT:core1:MAX:"Max %1.0lf deg, C " \
GPRINT:core1:AVERAGE:"Avg %1.0lf deg, C " \
GPRINT:core1:MIN:"Min %1.0lf deg, C \c" \
COMMENT:"\n"

# Вывод данных под графиком касаемо второго ядра.
После выполнения скрипта увидим лишь:
# ./gr_coretemp.sh
662x337
Все, график готов, можно его посмотреть по адресу (в моем случае): /usr/local/www/apache22/data/odmin.info/serv/cpu12h.png Если настроен веб-сервер и ему открыт доступ на папку, то увидим картинку с графиком: График который вы видите сгенерирован при моем последнем заходе на страницу мониторинга, т.е. я не добавлял скрипт генерации графика в cron, а прописал его запуск посредством php.
Ну и теперь расскажу про смс'ки =) Статью, "Как настроить отправку смс с консоли" вы можете прочитать на сайте моего друга ZG, после того как вы настроите smtp-cli, согласно его статье, нужно добавить в скрипт, который с помощью crona пишет температуру в базу несколько строк, вот что должно получиться:
#!/bin/sh
rrd='/var/db/rrd'

core0=`sysctl -a | grep dev.cpu.0.temperature | awk -F " " '{print $2}'`
core1=`sysctl -a | grep dev.cpu.1.temperature | awk -F " " '{print $2}'`

`/usr/local/bin/rrdtool update $rrd/cputemp.rrd N:$core0:$core1`
warn="Warning processor temperature!!! "
deg=" deg, C"
if let "$core0>45"
then `/usr/local/etc/scripts/sms "$warn"$core0"$deg"`
else echo 'good'
fi
Теперь при превышении порога температуры в 45 градусов на первом ядре, вам придет смска: "Warning processor temperature!!! -- deg, C", где вместо -- будет температура вашего процессора. Нужно иметь в виду, что смска будет приходить каждую минуту. Также можно модернизировать скрипт и заставить сервак отключаться при превышении порога.
Вот и все. Удачи!!!
Комментарии к записи:
zametki.me 2013-06-26 16:40:15
Спасибо автору. Отличная статья.
Для себя, благодаря данному примеру, снимаю температуру с видеокарт, и отображаю в виде графиков.

Добавление комментария

Ваше имя:
Ваш комментариий:
Введите код с картинки:
 
^_^