System administration
December 2016 5

Мониторинг GPU на серверах Windows ( TICK + Grafana + костыли )

Tutorial
В распоряжении у меня оказалось несколько серверов, на базе Windows, осуществляющих захват, кодирование и архивирование видео. Ключевой особенностью этой системы является то, что кодирование реализовано на базе Intel Quick Sync Video, т.е. на базе GPU.

При таком раскладе, мониторинг просто 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 (галочка снизу):

image

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

+2
5.6k 24
Comments 9
Top of the day