cactiの「Data Input Methods」にrsh/ssh経由で指定の<hostname>でnvidia-smiを実行させ
・watt
・core Hz
・memory Hz
・温度
らを取得するスクリプトを用意して、cactiに渡してみる。
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」を追加する
snmpでは得られないデータをグラフ化するには、別途bashやphpを駆使したスクリプトが使えます
サンプルというか実際に使われているスクリプトは /usr/share/cacti/scripts にいくつか用意されている
例えば、「Unix - Get Load Average」にて使用されるスクリプトは「loadavg_multi.pl」で引数はなく、出力が3つとある。

実際に「loadavg_multi.pl」を実行すると
[root@c ~]# perl /usr/share/cacti/scripts/loadavg_multi.pl
1min:0.10 5min:0.11 10min:0.13と帰ってくる。末尾に改行コードは入っていない
これを例にして、引数にホスト名を加え、出力をタグ付きの値として出すようなスクリプトを作って見ることとした
留意点
[root@c ~]# cat /etc/cron.d/cacti
*/5 * * * * cacti /usr/bin/php /usr/share/cacti/poller.php > /dev/null 2>&1
[root@c ~]#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とか
*引数で対象となるホスト名を指定できるようにしている
- | - | | ! - - | | - | | | ! | |
これを実行すると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 ~]#cactiのweb画面で、左ペインの「DataCollection」から「DataInputMethods」を選択します

表示された右側の「DataInputMethods」画面にて、右上の「Add」リンクをクリックします

「DataInputMethods」の追加登録画面に移り、下記のように入力して、画面下部の「Create」ボタンを押下します

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

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

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

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

「create」ボタンを押下すると、「DataInputMethods」の登録画面に戻り、出力値が定義されたことが分かります

これで1枚目のGPUのwattが定義されました。
この「Output Fields」の定義を「watt,sm,mem,temp」の4タイプ、4GPUカード分登録します。最後に「save」ボタンを押下します

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

次に、DataInputMethodsからDataTemplateを作成します。
左ペインの「Templates」から「Deta Source」を選択します

表示された右側の「Data Templates」画面にて、右上の「Add」リンクをクリックします
![]()
「Data Templates」の追加登録画面に移り、下記のように入力して、

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

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

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

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

この「ds」は「Internal Data Source Name」と連携してます。
下表のように「Data Source Item」を作成します。
| Internal Data Source Name | Minimum Value | Maximum Value | Data Source Type | Output Field |
| watt_0 | 0 | 300 | GAUGE | watt_0 - watt_0 |
| watt_1 | 0 | 300 | GAUGE | watt_1 - watt_1 |
| watt_2 | 0 | 300 | GAUGE | watt_2 - watt_2 |
| watt_3 | 0 | 300 | GAUGE | watt_3 - watt_3 |
| sm_0 | 0 | 3000 | GAUGE | sm_0 - sm_0 |
| sm_1 | 0 | 3000 | GAUGE | sm_1 - sm_1 |
| sm_2 | 0 | 3000 | GAUGE | sm_2 - sm_2 |
| sm_3 | 0 | 3000 | GAUGE | sm_3 - sm_3 |
| mem_0 | 0 | 6000 | GAUGE | mem_0 - mem_0 |
| mem_1 | 0 | 6000 | GAUGE | mem_1 - mem_1 |
| mem_2 | 0 | 6000 | GAUGE | mem_2 - mem_2 |
| mem_3 | 0 | 6000 | GAUGE | mem_3 - mem_3 |
| temp_0 | 0 | 100 | GAUGE | temp_0 - temp_0 |
| temp_1 | 0 | 100 | GAUGE | temp_1 - temp_1 |
| temp_2 | 0 | 100 | GAUGE | temp_2 - temp_2 |
| temp_3 | 0 | 100 | GAUGE | temp_3 - temp_3 |
最終的に「Data Source Item」は下図のようになる

「DataTemplate」で定義した「Unix - nvidia」を使ってグラフ(テンプレート)を作ります
左ペインの「Templates」から「Graph」を選択します

表示された「Graph Templates」画面にて、右端の「Add」リンクをクリックします

ここではGPUカードの温度をグラフ化したいと思います。
Name欄を「Unix - nvidia - temperature」とします。

これ以降の入力欄はリストで説明します。
以上を定義して、画面下部の「create」ボタンを押下する。
すると画面上部に「Graph Template Items」と「Graph Item Inputs」欄が表示される。

まず「Graph Template Items」の右端にある「Add」リンクを押下して、
「Graph Template Items [edit graph: Unix - nvidia - temperature]」画面を表示させます。
この画面で、下記のように入力して、画面下部の「create」ボタンを押下します。

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

次に、凡例を定義します。同じく「Graph Template Items」の右端にある「Add」リンクを押下して、下表のように入力します
| Graph Item Type | Data Source | Consolidation Function | CDEF Function | VDEF Function | GPRINT Type | Text Format | Insert Hard Return |
| GPRINT:LAST | Unix - nvidia - (temp_0) | LAST | none | none | Normal | Current: | off |
| GPRINT:MIN | Unix - nvidia - (temp_0) | MIN | none | none | Normal | Min: | off |
| GPRINT:MAX | Unix - nvidia - (temp_0) | MAX | none | none | Normal | Max: | on |
入力が完了すると下図のようになる。

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

だいぶ長くなっているが、、、まだまだ作業はあります。
次に、この作った「Graph Templates」を「Device Template」に登録します。
左メニューの「Templates」から「Devices」を選択します。

右側には「Device Templates」画面が表示される。ここで「Net-SNMP Device」を選択します。

すると、「Net-SNMP Device」を対象に適用可能な「Graph Templates」が表示されている。ここに先ほど作った「Unix - nvidia - temperature」を追加させる。
画面下部の「Add Graph Template」から「Unix - nvidia - temperature」を選択して、「Add」ボタンを押下します。

表に追加されたら、画面下部の「save」ボタンを押下します。
*既存の「Net-SNMP Device」への波及がうまく行かない場合、この「Net-SNMP Device」にチェックを付けて、「Sync Devices」を実行する必要があります。

次に、既に登録されているデバイス(マシン)に作ったテンプレートを適用します。
左メニューの「Management」から「Devices」を選択します。

そして、右側に表示されたデバイス(マシン)からnvidiaカードを搭載したマシンを選びます。
「Associated Graph Templates」欄に「Unix - nvidia - temperature」が提示されているかを確認します。

もしなければ、「Sync Devices」を行ってください
そして、選択した「Devices」の画面上部にある「*Create Graphs for this Device」リンクをクリックします。

作成可能グラフの一覧から「Unix - nvidia - temperature」を有効にして、画面下部の「Create」ボタンを押下します。

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

各種のグラフの中に、nvidiaカードの温度のグラフが見えます。

このマシンは1枚しかカードがないので、1つの折れ線のみです。