30 июня 2014 в 12:39

Zabbix 2.2: Мониторинг температуры процессора Windows машины из песочницы

Немного о себе и о рабочей среде
Работаю инженером в компании из двух человек, обслуживаем десяток муниципальных и коммерческих предприятий с парком компьютеров до 100 штук из них 99% windows машин. Занимаемся всем от прокладки сети до настройки информационных систем. Работы много и иногда очень хочется сделать свою жизнь чуточку проще и вот, в очередной такой момент, я столкнулся с системой мониторинга zabbix.
При первом знакомстве с zabbix, меня переполняли эмоции и фантазии о мониторинге всего на свете. Первой была идея предотвращения физических неисправностей путем отслеживания основных показателей железа, например температуру или напряжение, поскольку мне видится весьма логичным и экономически выгодным, поменять термопасту или начать подбирать замену уставшей технике до того как пользователь сообщит о её преждевременной кончине или страшных тормозах.
Система мониторинга Zabbix действительно очень мощная и гибкая, но, к сожалению, далеко не все аспекты для отслеживания доступны из стандартных коробочных шаблонов. Таким образом, моя фантазия с треском разбилась об стену отсутствия штатных инструментов мониторинга температур в Windows.

Процесс поиска в интернете поставил меня перед фактом, что вытащить температуры железа без сторонних средств нельзя. При поиске этих самых средств, я столкнулся с популярной утилитой SpeedFan, которая умеет собирать данные о температуре устройств, скорости вентиляторов, напряжений. Но получить от неё готовые к обработке данные без установки еще одной утилиты нет возможности. Плюс ко всему они не open source и требует активации компонента SNMP протокола. Вывод: попробовать на windows сервере без IMPI можно, но как вариант массового распространения в сети – не годен. Дальнейший поиск навел на программы hwmonitor и aida64 — монстры, крупногабаритные и платные.

OpenHardwareMonitor

Уже почти отчаявшись, зацепился за короткое сообщение на англоязычном форуме zabbix. Рекомендовали небольшую open source утилиту OpenHardwareMonitor — она имеет графический интерфейс и умеет считывать температуру устройств с датчиков. И самое главное её автор, по просьбе трудящихся написал консольную версию(последняя версия 28.10.2012), выводящую информацию в готовой для обработки форме.

Версия с GUI:

Версия с GUI


Консольная версия:

Консольная версия


Консольная версия состоит из двух файлов, exe исполняемого файла и dll библиотеки.

  • OpenHardwareMonitorReport.exe
  • OpenHardwareMonitorLib.dll

Где брать данные мы поняли, теперь нужно наладить поставки значений показателей Zabbix серверу.

Настройка сервера

Для начала на сервер для узла сети добавим новый элемент данных:

Новый элемент данных


Назовем его: CPU Temperature. (Температура процессора)

Тип: Zabbix агент
Ключ: Temperature.CPU[0]. (Название не принципиально, главное чтобы с конфигом агента совпадал).
Интерфейс узла сети: ip\dns. (Узел, который будем мониторить).
Тип информации: Числовой (целое положительное)
Тип данных: Десятичный

Интервал обновлений (в сек): 3600. (На скриншоте стоит 10 сек, для временной проверки).

На сервере закончили, переходим к конфигурации клиента.

Настройка клиента

Нестандартные данные мы будем отправлять через Zabbix agent в конфиге(zabbix_agentd.conf) которого предусмотрены так называемые пользовательские параметры – UserParameters вида:

UserParameter=ключ[*],команда


Команда, через которую мы получим значение, обрабатывается на стороне клиента. Zabbix сервер будет получать ключ с присвоенным ему значением. В статье имеется в виду, что агент у вас уже установлен в виде службы и дружит с сервером.

В конец конфиг файла агента добавляем:

UserParameter=Temperature.CPU[*], C:\OpenHardwareMonitor\CPUTemperature.bat


CPUTemperature.bat — написанный мной batch файл который вытаскивает из OpenHardwareMonitor, среднюю температуру по процессору. В программе эта строка называется CPU Package.

В C:\OpenHardwareMonitor лежат 3 файла:

  • OpenHardwareMonitorReport.exe
  • OpenHardwareMonitorLib.dll
  • CPUTemperature.bat


Содержимое CPUTemperature.bat
Здесь мой старый код
Инвалид на костылях.
@echo off
del /s C:\OpenHardwareMonitor\*.txt >nul 2>null
call start /B /wait C:\OpenHardwareMonitor\OpenHardwareMonitorReport.exe >> C:\OpenHardwareMonitor\OpenHardwareMonitorReport.txt
find "CPU Package    :" C:\OpenHardwareMonitor\OpenHardwareMonitorReport.txt | find "temperature" >>C:\OpenHardwareMonitor\Result.txt
for /f "tokens=7 delims= " %%i in (C:\OpenHardwareMonitor\Result.txt) do echo %%i >> C:\OpenHardwareMonitor\temp.txt
TYPE C:\OpenHardwareMonitor\temp.txt


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

Обновлено: Новый код от уважаемого cawaleb
@echo off
for /F "usebackq tokens=7-10" %%a in (`C:\OpenHardwareMonitor\OpenHardwareMonitorReport.exe`) do echo %%b %%c %%d| findstr .*lpc.*\/temperature\/0>nul && set temper=%%a
echo %temper%

Для процессоров intel так же справедлив вариант с find вместо findstr и регулярным выражением:
@echo off
for /F "usebackq tokens=7-10" %%a in (`C:\OpenHardwareMonitor\OpenHardwareMonitorReport.exe`) do echo %%b %%c %%d| find "/intelcpu/0/temperature/0">nul && set temper=%%a 
echo %temper%



Скрипт возвращает значение в виде десятичного числа.

После этого изменения конфиг файла и размещения всех файлов и скриптов, перезагружаем службу zabbix agent.

Начинаем получать значения на сервер:

График


Заключение

Решена задача по извлечения температуры CPU. По той же схеме можно получить температуру GPU. Но по-прежнему остро стоят вопросы определения скорости работы вентиляторов, напряжения на бп, а так же вопрос есть ли способ проверки состояния северного и южного мостов.

Обновление: Добавлен код для CPUTemperature.bat предложенный уважаемым Cawaleb. Не забудьте поблагодарить его, за то, что отозвался помочь!
Александр Кириченко @FATALnv
карма
7,0
рейтинг 0,0
Самое читаемое Разработка

Комментарии (22)

  • 0
    А через IPMI не проще сливать эти данные? В наше время любой нормальный сервер имеет разновидность out-of-band мониторинга.
    Тем более заббикс его из коробки умеет, а в последних версиях даже дискретные сенсоры.
    • 0
      Речь как раз идет о рабочих станциях. Ведь предприятие не на одни серверах держится. Мне например важно знать состояние рабочих станций в бухгалтериях от и до.
      • 0
        А, звиняюсь, пропустил. Я просто как-то не заморачиваюсь мониторингом десктопов — юзер сам хороший мониторинг :)
        • +1
          Система должна работать так что бы дать юзеру работать продуктивно и избежать простоя в рабочее время. О том что компьютер волшебным образом приведен в порядок, знает журнал выполненных работ и видеонаблюдение. Ведь дороги наиболее продуктивно ремонтируют в двух случаях: когда перекрыта вся дорога или когда работа выполнена ночью в самое разгруженное от трафика время.
    • 0
      ТУт вроде идея мониторить рабочие станции.
  • 0
    А разве у разных моделей CPU не разные рабочие диапазоны температур? Не получится наложить один шаблон на все наблюдаемые машины с триггерами на превышение нормальных значений. Придется готовить разные шаблоны для каждой модели CPU.
    • 0
      Согласен, нужно будет еще немного потрудиться. Настройка триггеров это очень индивидуальное занятие и рекомендуется её продумывать самостоятельно.Здесь находится список максимальных температур. Для начала я предлагаю сделать проверку раз в час. Судя по инвентаризации моих организации большинство пк на процессоре intel в соотношений 1 к 20. Если на протяжении 4 таких измерений температура выше 61, то выставляется предупреждение. Если за 3 измерения 70 уже критическое.
    • 0
      Получится. Можно например параметризировать пороги срабатывания с помощью пользовательских макросов (один в шаблоне и опционально индивидуальный для хоста).
      • 0
        Про макросы согласен. Но проблема остается — я к тому, что очень уж трудоемка следить за парком машин от 1000шт.
        В идеале нужно, чтобы программа агент по модели CPU сама решала, перегрелся он уже или нет, и на сервер мониторинга сообщала не температуру, а статус — OK, WARN, CRIT…
        • –1
          В идеале нужно, чтобы программа агент по модели CPU сама решала, перегрелся он уже или нет, и на сервер мониторинга сообщала не температуру, а статус — OK, WARN, CRIT…
          Идиотский подход который часто любят пользователи nagios. Решения должны приниматься сервером мониторинга, это даёт гораздо большую управляемость.
          Если у вас кондиционер отрубило, а порог срабатывания вы слишком низкий поставили, будете по каждой машине лазить и править его? А потом обратно? Вместо того чтобы изменить значение на сервере мониторинга.
          • 0
            Если наша цель — не допустить перегревания процессора, то в случае выхода из строя кондиционера нужно, как я понимаю, не пороги поднимать, а чинить кондиционер, либо выключать компьютеры.
  • 0
    Проверить не могу, но вдруг это решение окажется для вас удобнее.
  • 0
    Поспешил, температуру он не показывает :(
  • 0
    А не подскажите вы SMART пробовали мониторить?
    • 0
      SMART на Windows-машинах проверял при помощи консольной smartmontools. Попробуйте.
  • 0
    Не большая проблема, похоже не во всех процессорах/материнках есть датчик CPU Package. проверил на 2 компьютерах нету. Напишите в личку результат работы скрипта у вас, попробую переделать скрипт и проверить на разных ОС и процессорах.
    • 0
      Я сей час нахожусь в отпуске и кроме виртуальных машин и своего ноутбук ничем не располагаю. Я так же заметил, что на некоторых пк OpenHardwareMonitor определяет скорость вентилятора, но не у меня. Вы хотите сказать, что у вас вообще не считывает температуру процессора или именно CPU Package. Попробуйте заменить в бат файле «CPU Package :» на «CPU Core #1 :» в надежде на то что первое ядро есть в любом процессоре. Вернусь из отпуска, дополним статью подробностями экспериментов.
      • 0
        Попробовал переделать батник (терпеть не могу батники, уж очень язык мало-функциональный), и вот что у меня получилось:

        @echo off
        for /F "usebackq tokens=7-10" %%a in (`C:\OpenHardwareMonitor\OpenHardwareMonitorReport.exe`) do echo %%b %%c %%d| findstr .*lpc.*\/temperature\/0>nul && set temper=%%a
        echo %temper%

        Попробовал на нескольких машинах с разными мат. платами, ОС (XP, 2003, 2008, 7) и процессорами ( i5, i7, Fx8350), попробовал сделать более менее универсальным, работает на всем что проверял. Но наверное найдутся платы на которых придётся переделать параметр: tokens=7-10.
        Приятно встретить земляка.
        • 0
          Не сработало на двухпроцессорной системе. Пришлось выводимые параметры echo "%%b %%c %%d" взять в двойные кавычки. Что собственно правильнее со стороны echo :)
  • 0
    Можно получать следующим образом через powershell:

    param($cpuid)
    (Get-WmiObject -Namespace Root\OpenHardwareMonitor -Class sensor | ?{$_.identifier -eq "/intelcpu/0/temperature/$cpuid"}).value

    В zabbix_agentd.conf
    UserParameter=cpu.temperature[*],powershell.exe C:\scripts\cpuid.ps1 $1

    • 0
      Как вариант универсального скрипта:

      В скрипте:
      param($hw, $hwid, $sensor, $sensorid)
      (Get-WmiObject -Namespace Root\OpenHardwareMonitor -Class sensor | ?{$_.identifier -eq "/$hw/$hwid/$sensor/$sensorid"}).value

      В zabbix_agentd.conf
      UserParameter=system.sensor[*],powershell.exe C:\scripts\cpuid.ps1 $1 $2 $3 $4

      В zabbix
      В item:
      key = system.sensor[intelcpu,0,temperature,0]

      Весь список можно посмотреть:
      (Get-WmiObject -Namespace Root\OpenHardwareMonitor -Class sensor ) | ft Identifier,name,SensorType,Value

  • 0
    Если экранировать и переместить findstr то работает в разы быстрее и не вешает машины:

    for /F «usebackq tokens=7-10» %%a in (`OpenHardwareMonitorReport.exe ^| findstr .*lpc.*\/temperature\/0`) do echo %%a

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.