spvd.ru
spvd.ru
Павел Селиванов. Статьи, обзоры, заметки

Мониторим температуру в серверной. Недорого

К теме организации серверной комнаты в условиях ограниченного бюджета мне уже доводилось обращаться ранее. Одна из коротких заметок об общих принципах так и называлась - Бюджетная серверная. Сегодня я хочу снова вернуться к этой теме, но на этот раз в узкой области мониторинга температуры.

Сначала очень хотелось рассказать, почему так важно контролировать температуру серверного помещения, привести статистику по причинам сбоев в работе вычислительного оборудования, привлечь аналогию с крупными центрами обработки данных, ещё раз высказать мнение, что основополагающие принципы построения крупных дата-центров и маленьких серверных, в общем-то не отличаются, и затем плавно перейти к основной теме. Но зачем, подумал я, раз вы читаете этот текст, то наверняка уже в курсе, а потому – сразу к делу. :)

Для бюджетного мониторинга температуры в серверном помещении предлагаю воспользоваться простеньким USB-термометром, стоимость которого сравнима со стоимостью дюжины поездок на метро, а задачу по обработке получаемых с него данных возложить на один из серверов. Представляю вам TEMPer.

Устройство существует в разных вариантах, с выносными и внутренними датчиками температуры и влажности. Далее речь пойдёт о самом простом (и недорогом) представителе семейства с единственным внутренним датчиком температуры.

Данная модель USB-термометра может продаваться под разными брендами, но чаще всего концы ведут к компании RDing Technology и торговой марке PCsensor.

Продаётся обычно в комплекте с USB-удлинителем и 8-см диском с драйвером и ПО. Содержимое диска в моём случае оказалось бесполезно – программа под Windows, по качеству пригодная, разве что, для демонстрации работы.

Комплектный простой USB-удлинитель так же не очень удобен. Вот, к примеру, как выглядит TEMPer, установленный в кредл из комплекта USB Wi-Fi адаптера Netgear WNA1100:

Итак, датчик у нас есть, осталось разобраться с ПО для мониторинга. Помимо выяснения текущей температуры, хотелось бы получить следующие функции: сбор статистики за определённый период, представление её в удобном виде и возможность задания пороговых значений температуры, достижение которых вызывало бы отправку сообщения, например, по электронной почте, ответственному лицу.

В случае ПО для Windows всё очень просто. Стивом Тимсом (Steve Timms) написана и поддерживается программа ThermoHID, где есть все перечисленные функции и даже много больше.

Поблагодарим Стива за программу, и перейдём к более интересному (по крайней мере, для меня ;)) случаю – мониторинг из UNIX-подобных операционных систем. По причинам, не относящимся к теме данной заметки, ближе всего мне системы семейства BSD. Так что пусть простят меня линуксоиды, но именно примеру мониторинга из операционной системы OpenBSD будет посвящён дальнейший текст, хотя многое из описанного с небольшими изменениями подойдёт и для них. Да и в интернете примеров применения устройств семейства TEMPer с различными дистрибутивами на базе GNU/Linux несравнимо больше.

Функции датчика HidTEMPer (vendor 0x1130, product 0x660c) в операционной системе OpenBSD доступны благодаря драйверу uthum, и, благодаря нему же, получить значение температуры можно в одной из переменных sysctl. Пример:

# sysctl hw.sensors.uthum1
hw.sensors.uthum1.temp0=21.50 degC (inner)

В других UNIX-подобных операционных системах поддержка данного устройства может отличаться, поддерживаться может другим драйвером, и для получения данных потребуется отдельная программа, а не чтение переменной sysctl. Кроме того, существует устройство TEMPerV1.2, внешне выглядящее точно так же и выполняющее те же функции, но аппаратно несколько отличающееся.

Для дальнейшего использования в скрипте неплохо бы получать только значение, без имён переменных и описаний. Проще простого, призовём на помощь awk:

# sysctl hw.sensors.uthum1.temp0 | awk '{print $1}'
hw.sensors.uthum1.temp0=21.25

Отсечено всё, что было в выводимой изначально строке после первого пробела.

Применив операцию дважды, но во второй раз назначив разделительным знак "=" и взяв второе поле, наконец получим искомое:

# sysctl hw.sensors.uthum1.temp0 | awk '{print $1}' | awk -F"=" '{print $2}'
21.25

Способ получать значения температуры найден, давайте посмотрим, как можно собирать статистику и представлять её в удобоваримом виде. Для UNIX-like существует отличный набор утилит rrdtool. С помощью rrdtool создадим и будем вести базу данных с получаемыми периодически отсчётами температуры, но не только – rrdtool умеет на основе данных из базы строить различные графики.

Пример скрипта на sh, с комментариями:

#!/bin/sh
# Пути к программе и данным
PATH_TO_RRDTOOL=/usr/local/bin/rrdtool
PATH_TO_DB=/usr/local/rrd/temperdb.rrd
PATH_TO_IMG=/usr/local/rrd/temper/png
# Чтение температуры и период для базы данных в секундах.
# С той же периодичностью требуется запускать сам скрипт.
GETTEMP=`sysctl hw.sensors.uthum1.temp0 | awk '{print $1}' | awk -F"=" '{print $2}'`
STEP=60
# Описания и данные для построения графика
GRAPH_TITLE='Temperature'
GRAPH_LEGEND='Temp.'
T_MIN=0
T_MAX=35
# Проверка и создание базы данных, если не существует.
# В примере – для данных за час, сутки, неделю и месяц.
if ! [ -f $PATH_TO_DB ]
then
$PATH_TO_RRDTOOL create $PATH_TO_DB -s $STEP DS:temperature:GAUGE:300:0:40 \
RRA:AVERAGE:0.5:1:60 \
RRA:AVERAGE:0.5:5:288 \
RRA:AVERAGE:0.5:10:1008 \
RRA:AVERAGE:0.5:60:1488
fi
# Внесение в базу нового отсчёта
$PATH_TO_RRDTOOL update $PATH_TO_DB N:$GETTEMP
# Создадим функцию для построения графиков
function CreateImg
{
# Получение текущих даты и времени
CURRENT_DATE=`date +%Y," "%B," "%d`
CURRENT_HOUR=`date +%H`
CURRENT_MIN=`date +%M`
# Разные пояснения на графиках за разные временные периоды
case $1 in
hour)
GRAPH_TYPE="last hour"
VAR_SPEC="(1 min read)"
;;
day)
GRAPH_TYPE="last twenty-four hours"
VAR_SPEC="(5 min avg read)"
;;
week)
GRAPH_TYPE="last week"
VAR_SPEC="(10 min avg read)"
;;
month)
GRAPH_TYPE="last month"
VAR_SPEC="(30 min avg read)"
;;
esac
# Создание файла с графиком по заданным параметрам
$PATH_TO_RRDTOOL graph $PATH_TO_IMG/$2 \
-s -1$1 \
-e now \
-a PNG \
-t "$GRAPH_TITLE - $GRAPH_TYPE" \
-l $T_MIN \
-u $T_MAX \
-r \
-E \
-i \
-R light \
-w 500 \
-h 200 \
DEF:temperature=$PATH_TO_DB:temperature:AVERAGE \
LINE3:temperature#009900:"$GRAPH_LEGEND" \
GPRINT:temperature:LAST:"Current\: %0.1lf°C" \
GPRINT:temperature:MAX:"[ Max\: %0.1lf°C" \
GPRINT:temperature:MIN:"Min\: %0.1lf°C ] $VAR_SPEC" \
COMMENT:"Get time\: $CURRENT_DATE - $CURRENT_HOUR\:$CURRENT_MIN"
}
# Конец функции CreateImg
# Вызов функции построения графиков за разные периоды
CreateImg 'hour' 'img0_last_hour.png'
CreateImg 'day' 'img1_last_day.png'
CreateImg 'week' 'img2_tast_week.png'
CreateImg 'month' 'img3_last_month.png'

Теперь осталось запланировать в cron выполнение данного скрипта с заданной периодичностью (в примере – раз в минуту), и по мере заполнения базы данных начнут создаваться графики, подобные этим:

 

Следующим логичным ходом будет установить и запустить web-сервер, создаваемые изображения с графиками складывать в папку, доступную по http, а на web-сервере разместить страничку с этими изображениями.

Полагаю, разобравшемуся в данном скрипте не составит сложности дополнить этот или написать ещё один скрипт, который будет сверять текущее значение температуры с заданным, и в случае превышения первого над вторым отправлять e-mail на определённый адрес. Ничто не мешает с помощью сервисов Email-to-SMS обеспечить таким образом доставку SMS сообщений с предупреждениями. Нетрудно так же наладить периодическую отправку отчётов, причём с почтовым клиентом вроде mutt, можно к отправляемым сообщениям легко присоединять изображения, созданные с помощью приведённого выше скрипта.

Да пребудет всегда прохлада в вашей серверной!

Оцените материал: 
twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com blogger.com liveinternet.ru livejournal.ru memori.ru google.com yandex.ru
Оставить комментарий

Отправка комментария без регистрации. Комментарий публикуется после проверки.

Имя и сайт используются только при регистрации

Комментарий с авторизацией. Также можно сразу зарегистрироваться одновременно с первым комментарием. Для регистрации потребуется указать адрес электронной почты и придумать пароль, на электронную почту придет письмо с дальнейшей инструкцией по завершению регистрации. Комментарий публикуется после проверки.

(обязательно)