Категорії
FreeBSD

Мониторим состояние температуры сервера

Если у вас в серверной надёжное охлаждение, да ещё и с системой вдува-выдува, то вам беспокоится неочем : температура будет в норме. Но если у вас стоит один кондиционер, который время от времени перестаёт охлаждать, то эта статья для вас. В статье расскажу о том, как получить температуру процессоров и отправлять уведомление на e-mail, sms.

Замечу, что эта статья описывает возможности только для процессоров Intel/AMD

Тестовый стенд: FreeBSD 8.1 Release amd64 (CPU: Intel(R) Xeon(R) CPU E5504  @ 2.00GHz), FreeBSD 8.1 Release i386 (CPU:AMD Sempron(tm) Processor 3000+)

1) Настройка отображения температуры.

Intell

Для поддержки датчиков температуры нужно подгрузить модуль coretemp.ko. Соответственно его можно подгрузить или вкомпилировать в ядро.

– подгрузка модулем:

#kldload coretemp.ko

и добавим строку (что бы подгружался при загрузке ОС)

coretemp_load="YES"

в файл /boot/loader.conf

– добавление в ядро:

добавляем в файл ядра такую строку:

device          coretemp

и пересобираем ядро.

После того, как вы сделали одно из действий описанных выше, проверим работоспособность:

skeletor@gate:~$ sysctl -a | grep temperature
dev.cpu.0.temperature: 38,0C
dev.cpu.1.temperature: 34,0C
dev.cpu.2.temperature: 39,0C
dev.cpu.3.temperature: 33,0C

Как видим результаты выдались по каждому ядру отдельно.

AMD

Для поддержки датчиков температуры нужно подгрузить модуль amdemp.ko. Соответственно его можно подгрузить или вкомпилировать в ядро.

– подгрузка модулем:

#kldload amdtemp.ko

и добавим строку (что бы подгружался при загрузке ОС)

amdtemp_load="YES"

в файл /boot/loader.conf

– добавление в ядро:

добавляем в файл ядра такую строку:

device          amdtemp

и пересобираем ядро.

После того, как вы сделали одно из действий описанных выше, проверим работоспособность:

[root@tor /boot/kernel]# sysctl -a | grep temp | grep dev
dev.cpu.0.temperature: 37.0C
dev.amdtemp.0.%desc: AMD K8 Thermal Sensors
dev.amdtemp.0.%driver: amdtemp
dev.amdtemp.0.%parent: hostb3
dev.amdtemp.0.sensor0.core0: 37.0C
dev.amdtemp.0.sensor0.core1: -49.0C
dev.amdtemp.0.sensor1.core0: 37.0C
dev.amdtemp.0.sensor1.core1: -49.0C

Как видим результаты выдались по каждому ядру отдельно.

Примечание:

21.05.2009 драйвер k8temp был заменён на amdtemp. Поэтому, если у вас старая ОС, то замените в статье amdtemp на k8temp

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

2) Скрипт мониторинга

В выводе информации через переменные sysctl нас интересуют только целые значения температур (я ограничился этими значениями). Соответственно нужно как-то “вырезать” их. Для этого можно использовать, например, awk:

/sbin/sysctl dev.cpu.0.temperature | /usr/bin/awk '{print $2}' | /usr/bin/awk '{split($1,a,","); print a[1] }'

Эта строка выводит целое значение температуры для первого ядра процессора.

Проведя несколько тестов, я обнаружил, что наибольшая температура у первого и третьего ядер. Соответственно их и будем мониторить.

Теперь оформим небольшой скрипт (данный скрипт будет сравнивать значение полученные через sysctl и если температура одного из ядер больше 65 градусов – будет отправлять сообщение на почту и смс на мобильный), который сравнивает полученные значения с 65 градусами (предупреждающая температура для большинства процессоров):

#!/bin/sh
t0=`/sbin/sysctl dev.cpu.0.temperature | /usr/bin/awk '{print $2}' | /usr/bin/awk '{split($1,a,","); print a[1] }'`
t2=`/sbin/sysctl dev.cpu.2.temperature | /usr/bin/awk '{print $2}' | /usr/bin/awk '{split($1,a,","); print a[1] }'`
if [ "$t0" -gt "65" -o "$t2" -gt "65" ]
then
/bin/echo "Temperature on gate is $t0 (core0) and $t2 (core2)" | mail -s "[Warning]: Temperature on gate" postmaster@domain.ua
/bin/echo "Temperature on gate is $t0 (core0) and $t2 (core2)" | mail -s "Warning" 380XXXXXXXXX@sms.kyivstar.net
fi

Сохраняем скрипт и добавляем строку в /etc/crontab (проверка каждые 5 минут)

*/5     *       *       *       *       root    /scripts/core_temp.sh

Но тут меня ждало разочарование. Дело в том, что при выполнении вручную скрипт отрабатывал на отлично, а через cron – не хотел. В итоге на почту присылались сообщения об ошибке в скрипте:

[: 37.0C: bad number

Выяснилось, что при обработке через cron в показаниях температуры запятая заменялась на точку. Поэтому пришлось подправить скрипт :

#!/bin/sh
t0=`/sbin/sysctl dev.cpu.0.temperature | /usr/bin/awk '{print $2}' | /usr/bin/awk '{split($1,a,"."); print a[1] }'`
t2=`/sbin/sysctl dev.cpu.2.temperature | /usr/bin/awk '{print $2}' | /usr/bin/awk '{split($1,a,"."); print a[1] }'`
if [ "$t0" -gt "65" -o "$t2" -gt "65" ]
then
/bin/echo "Temperature on gate is $t0 (core0) and $t2 (core2)" | mail -s "[Warning]: Temperature on gate" postmaster@domain.ua
/bin/echo "Temperature on gate is $t0 (core0) and $t2 (core2)" | mail -s "Warning" 380XXXXXXXXX@sms.kyivstar.net
fi

Зато теперь при запуске ручками он ругается на точку:

[: 36,0C: bad number

Получается палка о 2-х концах. Но поскольку мне нужна была проверка именно через cron, я оставил второй вариант.

Послесловие.

Для отправки смс обратитесь к своему оператору для уточнения формата email адреса.

Один коментар до “Мониторим состояние температуры сервера”

sysctl dev.cpu.0.temperature | awk ‘{print $2+0}’
Прибавить ноль и можно получать корректное значение в обоих случаях.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff