NVIDIA の GPU の使用率を、Ganglia で監視するようにした。
GPU の状態は nvidia-smi コマンドで取得できる。dmon モードで起動すると、連続的に1エントリ1行の形式で出力してくれる。
nvidia-smi dmon -s pu -d 5 # gpu pwr temp sm mem enc dec mclk pclk # Idx W C % % % % MHz MHz 0 64 36 0 0 0 0 3004 745 1 68 36 94 4 0 0 3004 745 0 64 37 0 0 0 0 3004 745 1 64 37 0 0 0 0 3004 745 0 21 37 0 0 0 0 324 324 1 21 37 0 0 0 0 324 324 0 21 36 0 0 0 0 324 324 1 21 35 0 0 0 0 324 324 ...
コマンドの -s オプションは出力項目の指定、-d は更新間隔(秒)である。最初の数サイクルは、nvidia-smi コマンド自体が GPU を初期化するため、GPU 使用率が跳ね上がるようだ(参考記事)。このため、nvidia-smi コマンドを何度も呼び出すような監視スクリプトはうまくいかない。
これを awk で切り出して gmetric コマンドで監視サーバに送信する。本マシンには、2枚の GPU ボードが装着されているので、平均値を取ることにした。温度の平均値に意味があるのかとか突っ込まないように。
nvidia-smi dmon -s puc -d 10 | awk '$1==0 {t=$3;c=$4} $1==1 {system("gmetric -t float -n gpu_temp -g GPU -u Celcius -v " (t+$3)/2.0); system("gmetric -t float -n gpu_use -g GPU -u Percent -v " (c+$4)/2.0)}'
これを自動で起動する必要がある。ちゃんとした daemon として登録するのは面倒だったので、上記スクリプトを gmond-gpu として保存した後、/etc/init.d/gmond の start から呼び出すようにした。
nohup sh /etc/init.d/gmond-gpu > /dev/null 2> /dev/null&
linux - Does nohup work across a pipe? - Stack Overflow にあるように、nohup に直接コマンドを書いても、パイプが期待した動作をしない。また、ヒアドキュメントの中に入れると、エスケープが煩雑である。
stop のほうでは、
killall nvidia-smi
とした。雑だが、nvidia-smi を他で使わないなら問題なかろう。