WindowsサーバーでのGPU監視(TICK + Grafana +松葉杖)

私が自由に使えるのは、ビデオをキャプチャ、エンコード、アーカイブするWindowsベースのサーバーです。 このシステムの主要な機能は、Intel Quick Sync Videoに基づいてエンコードが実装されていることです。 GPUベース。



この状況では、単にCPUを監視するだけではサーバーステータスの主な指標ではなくなりますが、全体像を把握するには、CPUとGPUの両方の負荷を監視する必要があります。 サーバーはリアルタイムモードで動作するため、ファイルではなくストリームを処理する必要があります。これは、GPUが最大負荷を超えると、ビデオの損失が発生する可能性があることを意味します(ファイルの場合、エンコードはリアルタイムよりも遅い速度で続行します)。したがって、ビデオカードの操作を確認してください必要です。



次の小道具と松葉杖の最終結果は、Grafanaで作成されたグラフです。







この記事では、 TICK (telegraf、influxdb、chronograf、kapacitor)+ Grafanaに基づいたモニタリングについて説明します。したがって、すべての設定とスクリプト出力はこのテクノロジースタックに特化していますが、いくつかの改良を加えると、以下のすべてを他のモニタリングシステムに転送できます。 もう1つの注意点-この実装はWindows用に作成されています。



Nvidiaビデオカードですべてが明らかな場合、ドライバーをインストールした直後に、nvidia-smiコンソールユーティリティと標準のパフォーマンスモニターのNvidia GPUサブセクションの両方がコンピューターに表示されますが、Intel GPUを監視する場合、すべてはそれほど明白ではありません。 私が出会ったユーティリティはすべてGUIで動作するようになっているため、最初の松葉杖がこの場所に表示されます。GUIを備えたユーティリティが動作を監視します。



現時点では、この種のプログラムのリーダーの1つはGPU-Zユーティリティです。ロギングの可用性は重要です。



GPU-Zでのロギングのセットアップ(以下のチェックマーク):



画像






この段階では、最初の問題が発生します-GPU-ZはログをCSV形式で書き込みます。最小頻度は10秒です。ログファイルのボリュームに影響します。したがって、ファイルを1行ずつまたは全体として定期的に読み取る場合、無限の成長のため、作業します彼にとっては非常に面倒です。



2番目の松葉杖は、GPU-Zユーティリティのログローテーションを設定しています。 1日のログはサイズが小さく、スクリプトですばやく処理できるため、ローテーションの目的は1日あたりの情報を保存する小さなファイルです。 GPU-Zは常に管理者権限で起動します。自動的に起動する場合、Windowsに組み込まれているUAC保護をバイパスする必要があります。したがって、ローテーションスクリプトの起動を自動化するには、Windowsスケジューラを次の設定で使用します:最高の権限で実行します。















Windowsスケジューラは、一連のアクションを実行するスクリプトを実行します。



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秒ごとに)書き込みます。1分に1回読み取り値を収集するだけで十分です。 3番目の松葉杖がこの場所に表示されます。データをtelegrafに転送するための小さなパーサーが書き込まれ、GPU-Zログから最後の行が選択され、データがグラファイト形式でtelegrafに送信されます。



github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md



この形式は、telegrafの標準的な流入形式がタイムスタンプスプーフィングをサポートしないという理由で選択されましたが、ログから正直なタイムスタンプを表示したいので、行の読み取り時に生成されません。 次のスクリプトでは、これが考慮され、ログからのタイムスタンプは、グラファイト形式に従ってUNIX時間に変換されます。



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自体によって、1分に1回の頻度で起動されます。



 [[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"
      
      





その結果、GPUの状態を反映するデータがTICKシステムに収集されます。これに基づいて、監視を構成するか、この場合のようにグラフを作成して作業と分析を分析できます。



All Articles