При таком раскладе, мониторинг просто CPU, уже не является главным указателем состояния сервера, а для полной картины требуется отслеживать загрузку как CPU, так и GPU. Серверы работают в режиме real time, поэтому приходится иметь дело с потоками, а не файлами, это означает, что если GPU превысит максимальную нагрузку, возможны потери видео ( в случае файлов кодирование продолжится, со скоростью менее real time ), поэтому поглядывать за работой видеокарты необходимо.
Конечным результатом, приведенных ниже подпорок и костылей, являются графики построенные в Grafana:
В данной статье рассматривается мониторинг на базе TICK ( telegraf, influxdb, chronograf, kapacitor) + Grafana, поэтому все настройки и вывод скриптов адаптированы именно под этот стек технологий, но, при некотором допиливании все приведенное ниже может быть перенесено и в другие системы мониторинга. Еще один нюанс — данная реализация сделана для Windows.
В случае, если с видеокартами Nvidia все понятно, когда сразу после установки драйвера, на компьютере оказываются как консольная утилита nvidia-smi, так и подраздел Nvidia GPU в стандартном Perfomance Monitor, то в случае отслеживания работы Intel GPU все не так очевидно. Все утилиты, которые мне попадались ориентированы на работу в GUI, поэтому в данном месте появляется первый костыль — работу будет отслеживать утилита с GUI.
В настоящий момент, одним из лидеров среди программ такого рода является утилита GPU-Z, немаловажным является наличие логирования.
Настройка логирования в GPU-Z (галочка снизу):
На данном этапе появляется первая сложность — GPU-Z свой лог пишет в формате CSV, с минимальной частотой в 10 сек, что сказывается на объеме лог-файла, поэтому, если считывать файл построково или целиком периодически, то из-за бесконечного роста, работа с ним достаточно трудозатратна.
Второй костыль заключается в настройке ротации логов утилиты GPU-Z. Лог за одни сутки получается небольшого размера, и вполне может быть быстро обработан скриптом, поэтому целью ротации является небольшие файлы, хранящие информацию за сутки. GPU-Z всегда запускается с правами администратора, при автоматическом запуске это требует обхода встроенной в Windows защиты UAC, поэтому, для автоматизации запуска скрипта ротации применяется Windows Scheduler, с выставленной настройкой: Run with highest privileges.
Windows Scheduler запускает скрипт, выполняющий последовательность действий:
1) завершить программу GPU-Z
2) переместить лог в архив
3) запустить утилиту свернутой в трей
Скрипт написан на PowerShell, и выглядит следующим образом:
$gpuz = "GPU-Z.1.12.0"
$gpuzlog = "C:\Program Files\GPU-Z\log\gpu-z.txt"
Stop-Process -Name $gpuz -Force
$logname = $(Get-ChildItem $gpuzlog).Name
$archivelogname = (Get-Date).AddDays(-1).ToString('yyyy-MM-dd') + "_" + $logname
$archivelogdir = $(Get-ChildItem $gpuzlog).DirectoryName + "\" + (Get-Date).AddDays(-1).ToString('yyyy_MM')
$archivelogfile = $archivelogdir + "\" + $archivelogname
New-Item -ItemType directory $archivelogdir -Force
Move-Item $gpuzlog $archivelogfile -Force
& "C:\Program Files\GPU-Z\$gpuz.exe" -minimized
Оказалось, что во время работы GPU-Z не финиширует лог, т.е. его можно считать тем же PowerShell-ом, а вот логпарсер telegraf не видит обновлений. К тому же утилита GPU-Z пишет лог слишком часто ( раз в 10 сек ) в моем случае, вполне достаточно сбора показаний раз в минуту. В этом месте появляется третий костыль — для передачи данных в telegraf был написан небольшой парсер, который выбирает последнюю строку из лога GPU-Z и отдает данные в telegraf в формате graphite.
> github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
Данный формат был выбран по той причине, что стандартный для telegraf формат influx не поддерживает подмену timestamp, мне же хочется видеть честный timestamp из лога, а не сгенерированный в момент считывания строки. В нижеследующем скрипте это учтено, а timestamp из лога преобразован в unix time, в соответствии формату graphite.
Скрипт снова на PowerShell:
$gpuzlog = "C:\Program Files\GPU-Z\log\gpu-z.txt"
$loglaststring = Get-Content $gpuzlog | Select-Object -Last 1
$timestamp = $loglaststring.Split(",")[0]
$unixtimestamp = [int64]((Get-Date "$timestamp").ToUniversalTime()-(Get-Date "1/1/1970")).TotalSeconds
#GPU Temperature [°C] , GPU Load [%] , Memory Usage
$gputemperature = (($loglaststring.Split(",")[1]).Replace(" ", "")).Split(".")[0]
$gpuload = ($loglaststring.Split(",")[2]).Replace(" ", "")
$gpumemoryusage = ($loglaststring.Split(",")[3]).Replace(" ", "")
Write-Host GPUZ.psscript.GPUTemperature $gputemperature $unixtimestamp
Write-Host GPUZ.psscript.GPULoad $gpuload $unixtimestamp
Write-Host GPUZ.psscript.GPUMemoryUsage $gpumemoryusage $unixtimestamp
Данный скрипт запускается самим telegraf-ом, с частотой раз в минуту, согласно следующему правилу:
[[inputs.exec]]
commands = [
"powershell.exe C:/PSScripts/gpu-z.ps1"
]
separator = "."
templates = [
"Utility.measurement.field*"
]
interval = "1m"
timeout = "10s"
name_suffix = "_gpuz"
data_format = "graphite"
В результате в системе TICK собираются данные, отражающие состояние GPU, на базе которых можно либо настраивать мониторинг, либо, как в данном случае делать графики, для анализа работы и аналитики.
Комментарии (9)
Evengard
05.12.2016 23:39+1Честно говоря ощущение после прочтения «Костыль на костыле сидит и костылём погоняет» :( Неужели никто никогда не писал никаких либ для таких задач?
skymal4ik
06.12.2016 14:21Предположу, что обычно для таких вещей используют более специализированные решения — аппаратные энкодеры, мультиплексоры.
По опыту, у таких устройств свои системы слежения и мониторинга (например, Сonsolidated Alarms в составе NMX для оборудования от Harmonic, или nCompass от Ericsson), которые уже предоставляют весь необходимый функционал — графики, алерты, автоматическое резервирование и прочее. Довольно часто там также есть SNMP сервера.sdm
06.12.2016 14:23Все так, попадались и такие железки, но, в данном это софт на базе стандартного сервера + Windows
Xaser
06.12.2016 00:19как бы вот
sdm
06.12.2016 15:27Да, утилитка мне попадалась, но, что тогда, что сейчас сходу консольную версию и ее вывод найти не удается :(
sdm
06.12.2016 15:28Собственно консольная версия нашлась лишь на стороннем ресурсе: http://serveradmin.ru/zabbix-nastroyka-monitoringa/ и, возможно окажется вполне себе решением.
Nikobraz
Сам сейчас ищу возможности мониторинга GPU, но только в связке с остальным.
Для видюшек Intel обращали внимание на Intel Graphics Performance Analyzers?
Nikobraz
И спасибо за nvidia-smi не знал об этом инструменте.
sdm
Да, обращал, на сколько я помню по ссылке GUI, который глубоко встраивается в систему ( библиотеки + служба ), не предоставляя после себя ни логи, ни консольный вывод.