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

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


  1. Nikobraz
    05.12.2016 23:28

    Сам сейчас ищу возможности мониторинга GPU, но только в связке с остальным.

    Для видюшек Intel обращали внимание на Intel Graphics Performance Analyzers?


    1. Nikobraz
      05.12.2016 23:34

      И спасибо за nvidia-smi не знал об этом инструменте.


    1. sdm
      06.12.2016 15:30

      Да, обращал, на сколько я помню по ссылке GUI, который глубоко встраивается в систему ( библиотеки + служба ), не предоставляя после себя ни логи, ни консольный вывод.


  1. Evengard
    05.12.2016 23:39
    +1

    Честно говоря ощущение после прочтения «Костыль на костыле сидит и костылём погоняет» :( Неужели никто никогда не писал никаких либ для таких задач?


    1. skymal4ik
      06.12.2016 14:21

      Предположу, что обычно для таких вещей используют более специализированные решения — аппаратные энкодеры, мультиплексоры.

      По опыту, у таких устройств свои системы слежения и мониторинга (например, Сonsolidated Alarms в составе NMX для оборудования от Harmonic, или nCompass от Ericsson), которые уже предоставляют весь необходимый функционал — графики, алерты, автоматическое резервирование и прочее. Довольно часто там также есть SNMP сервера.


      1. sdm
        06.12.2016 14:23

        Все так, попадались и такие железки, но, в данном это софт на базе стандартного сервера + Windows


  1. Xaser
    06.12.2016 00:19

    как бы вот


    1. sdm
      06.12.2016 15:27

      Да, утилитка мне попадалась, но, что тогда, что сейчас сходу консольную версию и ее вывод найти не удается :(


      1. sdm
        06.12.2016 15:28

        Собственно консольная версия нашлась лишь на стороннем ресурсе: http://serveradmin.ru/zabbix-nastroyka-monitoringa/ и, возможно окажется вполне себе решением.