При таком раскладе, мониторинг просто 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, на базе которых можно либо настраивать мониторинг, либо, как в данном случае делать графики, для анализа работы и аналитики.

