cactiの「Data Input Methods」にrsh/ssh経由で指定の<hostname>でnvidia-smiを実行させ
・watt
・core Hz
・memory Hz
・温度
らを取得するスクリプトを用意して、cactiに渡してみる。

nvidia-smi

nvidia-smiのコマンドには、GPUカードの各種情報をcsvで書き出す機能がある。
例えば、

[root@s ~]# nvidia-smi --query-gpu=gpu_name,gpu_bus_id,vbios_version --format=csv
name, pci.bus_id, vbios_version
GeForce GT 710, 0000:01:00.0, 80.28.A6.00.30
[root@s ~]#

ってな感じで。--query-gpu=で使用可能なフラグは下記のコマンドで得られる

[root@s ~]# nvidia-smi --help-query-gpu
 :
"power.draw"
The last measured power draw for the entire board, in watts. Only available if power management is supported.
This reading is accurate to within +/- 5 watts.
 :
"clocks.current.sm" or "clocks.sm"
Current frequency of SM (Streaming Multiprocessor) clock.
 :
"clocks.current.memory" or "clocks.mem"
Current frequency of memory clock.
 :
"temperature.gpu"
 Core GPU temperature. in degrees C.
 :
[root@s ~]#

これから、watt、core Hz、memory Hz、温度らを得るには

[root@s ~]# nvidia-smi --query-gpu=index,timestamp,power.draw,clocks.sm,clocks.mem,temperature.gpu --format=csv

でいいのだが、こちらで用意しているカードでは

[root@s ~]# nvidia-smi --query-gpu=index,timestamp,power.draw,clocks.sm,clocks.mem,temperature.gpu --format=csv
index, timestamp, power.draw [W], clocks.current.sm [MHz], clocks.current.memory [MHz], temperature.gpu
0, 2017/04/04 23:35:54.943, [Not Supported], [Not Supported], [Not Supported], 45
[root@s ~]#

と表示される。もっと高価なカードでないと表示されない項目があります
*「--format=csv,noheader」でヘッダー行が省略されます。単位も消したければ「nounits」を追加する

DataInputMethods

snmpでは得られないデータをグラフ化するには、別途bashやphpを駆使したスクリプトが使えます
サンプルというか実際に使われているスクリプトは /usr/share/cacti/scripts にいくつか用意されている

例えば、「Unix - Get Load Average」にて使用されるスクリプトは「loadavg_multi.pl」で引数はなく、出力が3つとある。
2017y04m05d_000331662.png
実際に「loadavg_multi.pl」を実行すると

[root@c ~]# perl /usr/share/cacti/scripts/loadavg_multi.pl
1min:0.10 5min:0.11 10min:0.13

と帰ってくる。末尾に改行コードは入っていない

これを例にして、引数にホスト名を加え、出力をタグ付きの値として出すようなスクリプトを作って見ることとした
留意点

nvidia向けDataInputMethodsのスクリプト

cactiから実行されるスクリプトとして、下記/usr/share/cacti/scripts/nvidia-multi.shを作成した。
cactiは、cronで定期的に情報を収集するプログラムをcactiユーザで実行する。
そのcactiユーザが収集対象のリモートマシン上で「nvidia-smi」を実行する必要がある。しかし、そのマシンにcactiユーザが確実に存在するわけはないので、nisとかsamba-adで提供されるユーザに代行させて実行させる必要がある。

ここではsamba-adで既に用意されているnfs-userユーザに代行させて「nvidia-smi」を実行させてみた。
対象マシンへのrshがパスワードなしで実行できる環境であること。/etc/hosts.equivとか

*引数で対象となるホスト名を指定できるようにしている

鴻鴻
-
|
-
|
|
!
-
-
|
|
-
|
|
|
!
#!/bin/bash
#
if [ $# -ne 1 ]; then
  echo "requere hostname" 1>&2
  exit 1
fi
#
for i in `/usr/bin/sudo -u nfs-user /usr/bin/rsh $1 "/usr/bin/nvidia-smi \
--query-gpu=index,timestamp,power.draw,clocks.sm,clocks.mem,temperature.gpu --format=csv,noheader | \
sed 's/ *//g' | sed 's/W//g' | sed 's/MHz//g'|sed 's/\[NotSupported\]/0/g'"`
do
  l=( `echo $i | tr -s ',' ' '`)
  echo -n watt_${l[0]}:${l[2]} sm_${l[0]}:${l[3]} mem_${l[0]}:${l[4]} temp_${l[0]}:${l[5]}
  echo -n " "
done

これを実行するとgpuの数だけ「watt,sm,mem,temp」の値が得られる *下記はGPUカード二枚の時の出力例

[root@c ~]# /usr/share/cacti/scripts/nvidia-multi.sh gpu
watt_0:76.03 sm_0:1001 mem_0:3505 temp_0:58 watt_1:57.22 sm_1:1001 mem_1:3505 temp_1:59

*項目名の「_0」はgpuカードのidを示します。gpuカードの2枚目なら「_1」

次に、visudoコマンドで、パスワードなしでcactiがnfs-userユーザに成りすまして、上記スクリプト内のrshを実行できるようにする。

[root@c ~]# visudo
 :
cacti   ALL=(nfs-user)  NOPASSWD:/usr/bin/rsh
Defaults        requiretty
Defaults:cacti  !requiretty
[root@c ~]#

DataInputMethodsにスクリプトを登録する

cactiのweb画面で、左ペインの「DataCollection」から「DataInputMethods」を選択します
2017y04m09d_112329789.png
表示された右側の「DataInputMethods」画面にて、右上の「Add」リンクをクリックします
2017y04m09d_112822963.png
「DataInputMethods」の追加登録画面に移り、下記のように入力して、画面下部の「Create」ボタンを押下します

2017y04m09d_113338555.png

すると、新たな入力画面項目(「Input Fields」と「Output Fields」)が追加表示されます。
2017y04m09d_113903996.png

「Input Fields」はこのスクリプトに引数として渡す値を定義します。ここでは<hostname>が引数となります。
まず「Input Fields」の右端にある「Add」リンクをクリックします。
表示された「Input Fields」の定義画面で下記のように入力して、「create」ボタンを押下します

2017y04m09d_114336243.png

「create」ボタンを押下すると、「DataInputMethods」の登録画面に戻り、引数が定義されたことが分かります。
2017y04m09d_115150977.png

次にスクリプトの「Output Fields」を定義します。「Output Fields」欄の右端の「Add」リンクをクリックします。
ここでは出力はGPUカード4枚分が出力されると仮定します。なので「watt,sm,mem,temp」の4タイプ、4GPUカードの出力を定義します。
まずは、一枚目GPUカードのwattを定義します。下記のように入力して「create」ボタンを押下します

2017y04m09d_115932841.png

「create」ボタンを押下すると、「DataInputMethods」の登録画面に戻り、出力値が定義されたことが分かります
2017y04m09d_120157333.png
これで1枚目のGPUのwattが定義されました。
この「Output Fields」の定義を「watt,sm,mem,temp」の4タイプ、4GPUカード分登録します。最後に「save」ボタンを押下します
2017y04m09d_121141031.png

再度、左ペインの「DataCollection」から「DataInputMethods」を選ぶと入力した「Unix - Get nvidia state」が提示される
2017y04m09d_121645506.png

DataTemplate作成

次に、DataInputMethodsからDataTemplateを作成します。
左ペインの「Templates」から「Deta Source」を選択します
2017y04m10d_215822661.png
表示された右側の「Data Templates」画面にて、右上の「Add」リンクをクリックします
2017y04m10d_220032022.png
「Data Templates」の追加登録画面に移り、下記のように入力して、

2017y04m10d_220814276.png
引き続きその下部は下記のように定義して、画面下部の「Create」ボタンを押下します

2017y04m10d_223305899.png

すると、「Data Source Item」欄に「Output Field」入力欄が一つ追加されます。
これには「DataInputMethods」で定義した「watt_0」を当てはめて、画面下部の「save」ボタンを押下します。
2017y04m10d_223636640.png

これで「Data Source Item」の「watt_0」の登録が済みました。
引き続き、「watt_1」「watt_2」「watt_3」「sm_0」と項目を追加するのですが、
追加方法は下図「Data Source Item」欄の右端に「New」リンクを使用します。
2017y04m10d_224244312.png

クリックすると「Data Source Item」欄の上にタブが作られます。初めに作った「watt_0」の他に「ds」が提示されます。
2017y04m10d_224441960.png

この「ds」は「Internal Data Source Name」と連携してます。
下表のように「Data Source Item」を作成します。

Internal Data Source NameMinimum ValueMaximum ValueData Source TypeOutput Field
watt_00300GAUGEwatt_0 - watt_0
watt_10300GAUGEwatt_1 - watt_1
watt_20300GAUGEwatt_2 - watt_2
watt_30300GAUGEwatt_3 - watt_3
sm_003000GAUGEsm_0 - sm_0
sm_103000GAUGEsm_1 - sm_1
sm_203000GAUGEsm_2 - sm_2
sm_303000GAUGEsm_3 - sm_3
mem_006000GAUGEmem_0 - mem_0
mem_106000GAUGEmem_1 - mem_1
mem_206000GAUGEmem_2 - mem_2
mem_306000GAUGEmem_3 - mem_3
temp_00100GAUGEtemp_0 - temp_0
temp_10100GAUGEtemp_1 - temp_1
temp_20100GAUGEtemp_2 - temp_2
temp_30100GAUGEtemp_3 - temp_3

最終的に「Data Source Item」は下図のようになる
2017y04m10d_225914255.png

Graph Templates作成

「DataTemplate」で定義した「Unix - nvidia」を使ってグラフ(テンプレート)を作ります
左ペインの「Templates」から「Graph」を選択します
2017y04m09d_122005063.png
表示された「Graph Templates」画面にて、右端の「Add」リンクをクリックします
2017y04m09d_222640850.png

ここではGPUカードの温度をグラフ化したいと思います。
Name欄を「Unix - nvidia - temperature」とします。
2017y04m09d_222920433.png
これ以降の入力欄はリストで説明します。

以上を定義して、画面下部の「create」ボタンを押下する。
すると画面上部に「Graph Template Items」と「Graph Item Inputs」欄が表示される。
2017y04m10d_230733755.png
まず「Graph Template Items」の右端にある「Add」リンクを押下して、
「Graph Template Items [edit graph: Unix - nvidia - temperature]」画面を表示させます。
この画面で、下記のように入力して、画面下部の「create」ボタンを押下します。

2017y04m11d_095347913.png
すると、画面が前に戻り、「temp_0」の折れ線が定義されました。
2017y04m11d_094852518.png

次に、凡例を定義します。同じく「Graph Template Items」の右端にある「Add」リンクを押下して、下表のように入力します

Graph Item TypeData SourceConsolidation FunctionCDEF FunctionVDEF FunctionGPRINT TypeText FormatInsert Hard Return
GPRINT:LASTUnix - nvidia - (temp_0)LASTnonenoneNormalCurrent:off
GPRINT:MINUnix - nvidia - (temp_0)MINnonenoneNormalMin:off
GPRINT:MAXUnix - nvidia - (temp_0)MAXnonenoneNormalMax:on

入力が完了すると下図のようになる。
2017y04m11d_094616854.png
これは1枚目のGPUカードの温度変化をグラフにする定義です。他3枚分も同様に追記していきます。

他3枚を入れると下のようになる。
2017y04m11d_094325395.png

DeviceTemplateに登録

だいぶ長くなっているが、、、まだまだ作業はあります。
次に、この作った「Graph Templates」を「Device Template」に登録します。
左メニューの「Templates」から「Devices」を選択します。
2017y04m10d_235655944.png
右側には「Device Templates」画面が表示される。ここで「Net-SNMP Device」を選択します。
2017y04m10d_235823659.png
すると、「Net-SNMP Device」を対象に適用可能な「Graph Templates」が表示されている。ここに先ほど作った「Unix - nvidia - temperature」を追加させる。
画面下部の「Add Graph Template」から「Unix - nvidia - temperature」を選択して、「Add」ボタンを押下します。
2017y04m11d_000318489.png
表に追加されたら、画面下部の「save」ボタンを押下します。

*既存の「Net-SNMP Device」への波及がうまく行かない場合、この「Net-SNMP Device」にチェックを付けて、「Sync Devices」を実行する必要があります。
2017y04m11d_001757675.png

Deviceにnvidiaテンプレートを適用する

次に、既に登録されているデバイス(マシン)に作ったテンプレートを適用します。
左メニューの「Management」から「Devices」を選択します。
2017y04m11d_000651901.png
そして、右側に表示されたデバイス(マシン)からnvidiaカードを搭載したマシンを選びます。
「Associated Graph Templates」欄に「Unix - nvidia - temperature」が提示されているかを確認します。
2017y04m11d_002207930.png
もしなければ、「Sync Devices」を行ってください

そして、選択した「Devices」の画面上部にある「*Create Graphs for this Device」リンクをクリックします。
2017y04m11d_002551760.png
作成可能グラフの一覧から「Unix - nvidia - temperature」を有効にして、画面下部の「Create」ボタンを押下します。
2017y04m11d_002842618.png

グラフ

最上部タブの「Graphs」を選択して、デバイス(マシン)を選びます。
2017y04m11d_014206163.png

各種のグラフの中に、nvidiaカードの温度のグラフが見えます。
2017y04m11d_094101778.png
このマシンは1枚しかカードがないので、1つの折れ線のみです。

最新の60件
2026-05-09 2026-05-08 2026-05-06 2026-05-05 2026-05-04 2026-05-03 2026-05-02 2026-04-30 2026-04-29 2026-04-28 2026-04-27 2026-04-25 2026-04-24 2026-04-22 2026-04-21 2026-04-12 2026-04-08 2026-04-06 2026-04-05 2026-04-02 2026-03-26 2026-03-23 2026-03-21 2026-03-19 2026-03-15 2026-03-14 2026-03-13 2026-03-07 2026-03-06 2026-03-04 2026-03-02 2026-02-26 2026-02-24 2026-02-21 2026-02-18 2026-02-17 2026-02-16 2026-02-11 2026-02-09

edit


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-04-11 (火) 09:55:19