かなりVibe Codingでやっつけたので説明は雑ですが、一応できました。緑色は元々仕込んでたNVIDIA向けGPUのかんしテンプレートから引っ張った情報。青いグラフは今回実装したものになります。

xpu-smiを仕込む
まず大前提として、XPU Managerのインストールが必要ですので、これを仕込みます。バージョンは2.1.0としてます。

ここからダウンロードをしたdebパッケージを指定する形で apt install を実行します。
sudo apt install xpu-smi_2.1.0+26.33.6468cec-1.24.04_amd64.debxpu-smiが動けば、それに依存するコンポーネントも概ね入ってるんじゃ無いかなと思われ。
# xpu-smi
+----------------------------------------------+----------------------------+------------------------+
| Intel XPU-SMI v2.1 Driver: 64290D8E349F41730D761F4 Level Zero: 1.28.6 |
+----------------------------------------------+----------------------------+------------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
+----------------------------------------------+----------------------------+------------------------+
| 0 Intel(R) Arc(TM) Pro B Off | 0000:03:00.0 Off | Disabled |
| 70 Graphics | | |
| 0% 52C 51W / 250W | 172MiB / 32656MiB | 0% Default |
+----------------------------------------------+----------------------------+------------------------+
+-------+----------+--------+----------------+-------------------------------------------------------+
| Processes: |
| GPU PID Type Process Name GPU Memory Usage |
+-------+----------+--------+----------------+-------------------------------------------------------+
| 0 627613 C llama-server 294 MiB |
+-------+----------+--------+----------------+-------------------------------------------------------+スクリプトを作る
実はxpu-smiはこんな構文で決められた項目だけ出力することが可能になってます。
$ xpu-smi dump --device 0 --metrics 3,4,0,5,1,19,20 --number 1 --format=csv,noheader,nounits
04:24:01.947, 0, 53.00, 56.00, 0.00, 0.53, 52.80, 469, 83metricは名前で指定しても良いのですが、今回項目を多めに出すことを想定しているため敢えて番号指定で出してます。それぞれの項目はこんな感じです。
# 3 = temperature.gpu
# 4 = temperature.memory
# 0 = utilization.gpu
# 5 = utilization.memory
# 1 = power.draw
# 19 = pcie.rx.throughput.kbs
# 20 = pcie.tx.throughput.kbsそこで、こんなスクリプトを仕込んで、/usr/local/bin/xpu_smi_metrics.sh として保存しました。
#!/usr/bin/env bash
set -u
set -o pipefail
export LC_ALL=C
DEVICE="${1:-0}"
XPU_SMI="/usr/bin/xpu-smi"
# xpu-smiへ渡すメトリクスの順序。
# 3 = temperature.gpu
# 4 = temperature.memory
# 0 = utilization.gpu
# 5 = utilization.memory
# 1 = power.draw
# 19 = pcie.rx.throughput.kbs
# 20 = pcie.tx.throughput.kbs
METRICS="3,4,0,5,1,19,20"
fail() {
printf '%s\n' "$*" >&2
exit 1
}
trim() {
local value="${1-}"
value="${value#"${value%%[![:space:]]*}"}"
value="${value%"${value##*[![:space:]]}"}"
printf '%s' "$value"
}
is_number() {
[[ "$1" =~ ^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?$ ]]
}
if [[ ! "$DEVICE" =~ ^[0-9]+$ ]]; then
fail "Invalid GPU device number: $DEVICE"
fi
if [[ ! -x "$XPU_SMI" ]]; then
fail "xpu-smi was not found or is not executable: $XPU_SMI"
fi
if ! OUT="$(
sudo "$XPU_SMI" dump \
--device "$DEVICE" \
--metrics "$METRICS" \
--interval 1 \
--number 1 \
--format=csv,noheader,nounits \
2>/dev/null
)"; then
fail "xpu-smi execution failed"
fi
# 改行コードを除去し、最初の空でない行だけを使用する。
LINE="$(
printf '%s\n' "$OUT" |
tr -d '\r' |
awk 'NF { print; exit }'
)"
if [[ -z "$LINE" ]]; then
fail "xpu-smi returned an empty result"
fi
# 期待する形式:
# Timestamp,DeviceId,v3,v4,v0,v5,v1,v19,v20
IFS=',' read -r ts dev v3 v4 v0 v5 v1 v19 v20 extra <<< "$LINE"
ts="$(trim "$ts")"
dev="$(trim "$dev")"
v3="$(trim "$v3")"
v4="$(trim "$v4")"
v0="$(trim "$v0")"
v5="$(trim "$v5")"
v1="$(trim "$v1")"
v19="$(trim "$v19")"
v20="$(trim "$v20")"
extra="$(trim "${extra-}")"
if [[ -z "$ts" || -z "$dev" ||
-z "$v3" || -z "$v4" || -z "$v0" || -z "$v5" ||
-z "$v1" || -z "$v19" || -z "$v20" ]]; then
fail "Unexpected CSV field count: $LINE"
fi
if [[ -n "$extra" ]]; then
fail "Unexpected extra CSV field: $extra"
fi
for value in "$v3" "$v4" "$v0" "$v5" "$v1" "$v19" "$v20"; do
if ! is_number "$value"; then
fail "Non-numeric metric value returned by xpu-smi: $value"
fi
done
printf \
'{"device":%s,"temperature_gpu":%s,"temperature_memory":%s,"utilization_gpu":%s,"utilization_memory":%s,"power_draw":%s,"pcie_rx_throughput_kbs":%s,"pcie_tx_throughput_kbs":%s}\n' \
"$DEVICE" \
"$v3" \
"$v4" \
"$v0" \
"$v5" \
"$v1" \
"$v19" \
"$v20"で、visudoで以下のを追加しときました。xpu-smiがrootじゃないと動かないためです。
zabbix ALL=NOPASSWD: /usr/bin/xpu-smiZABBIXエージェントへの仕込み
/etc/zabbix/zabbix_agent2.conf に仕込みます。
UserParameter=intel.gpu.metrics.raw[*],/usr/local/bin/xpu_smi_metrics.sh "$1"終わったら zabbix-agent2 を再起動します。
systemctl restart zabbix-agent2ZABBIXサーバ側の仕込み
まず、Data Collection→Templateへ移動し、以下のように進めていきます。
- Create Templateをクリックする
- テンプレート名を任意に入力した後、Macrosタブクリック
- 数のようにマクロ行を1つ追加し、 {$INTEL_GPU_DEVICE}=0 を設定する
- Updateをクリックする

続いて、マスターアイテムというものを作ります。このアイテムは通常のアイテムとして作ります。このテンプレートの行にある「items」をクリックし、画面右上の「Create Item」をクリックします。

パラメータは以下の通りです。(私は後で監視間隔のみ15sに変更しています。)終わったら「Update」をクリックしてください。
| 項目 | 設定値 |
|---|---|
| 名前 | Intel GPU metrics raw |
| タイプ | Zabbix agent |
| キー(選択ではなく、直接入力して設定する) | intel.gpu.metrics.raw[{$INTEL_GPU_DEVICE}] |
| データ型 | Text |
| 監視間隔 | 20s |
| ヒストリ | 1d |
| トレンド | 0 |
これが所謂ひな形になり、それ以降は、アイテムの・・・をクリックすると以下のようにメニューがポップアップされます。このなかの「Create dependent item」をクリックして従属するアイテムをつくって行くことになります。

各アイテムの設定値は以下の通りです。
| 名前 | キー | JSONPath | データ型 | 単位 |
|---|---|---|---|---|
utilization.gpu | intel.gpu.metrics[{$INTEL_GPU_DEVICE},0] | $.utilization_gpu | Numeric float | % |
temperature.gpu | intel.gpu.metrics[{$INTEL_GPU_DEVICE},3] | $.temperature_gpu | Numeric float | C |
temperature.memory | intel.gpu.metrics[{$INTEL_GPU_DEVICE},4] | $.temperature_memory | Numeric float | C |
utilization.memory | intel.gpu.metrics[{$INTEL_GPU_DEVICE},5] | $.utilization_memory | Numeric float | % |
power.draw | intel.gpu.metrics[{$INTEL_GPU_DEVICE},1] | $.power_draw | Numeric float | W |
pcie.rx.throughput.kbs | intel.gpu.metrics[{$INTEL_GPU_DEVICE},19] | $.pcie_rx_throughput_kbs | Numeric float | kB/s |
pcie.tx.throughput.kbs | intel.gpu.metrics[{$INTEL_GPU_DEVICE},20] | $.pcie_tx_throughput_kbs | Numeric float | kB/s |
ここで、JSONPathと言う記述がありますけれども、これはアイテム設定画面の Preprocessing のタブをクリックしてください。ここで、ステップを「Add」をクリックして1つ作成し、「Name」に「JSONPath」を選択した上で、その右のParameters欄に指定の内容を書くと良いです。rawdataから対応するIndexの値を拾ってくるようになります。

こうして出来上がったテンプレートを、Intel ARCを搭載した監視対象に適用することで、監視が可能になります。あと、可能であればこれに対応するタグを付与しておくことをお勧めします。いざこのテンプレートの検索をするときに便利です。

あとはテンプレート内にトリガーを作るなどの工夫をすることで、温度監視・通知も可能になってくると思います。それは行く行くやろうかなと思いますが、今のところその気力はありませんです、はい。



コメント