Если у вас в серверной надёжное охлаждение, да ещё и с системой вдува-выдува, то вам беспокоится неочем : температура будет в норме. Но если у вас стоит один кондиционер, который время от времени перестаёт охлаждать, то эта статья для вас. В статье расскажу о том, как получить температуру процессоров и отправлять уведомление на 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}’
Прибавить ноль и можно получать корректное значение в обоих случаях.