Linuxノードの温度管理のメモ
はじめに
物理サーバにProxmoxを導入している。
Proxmoxノードのハードウェアについて温度管理をしたい。
今回は、lm-sensors
、telegraf
、smartctl
、nvme
を利用してGrafanaで閲覧できるようにする。
lm-sensorsとは
lm-sensorsは、CPUやマザーボード上のセンサーチップから情報を取得し、以下のようなハードウェアの状態を確認できるツールです。
- CPU温度
- マザボ温度
- ファン回転数
- GPU温度
telegrafとは
InfluxDataが作成したツールで、以下のような用途でりようされます。
- システムリソースの監視(CPU、メモリ、ディスクなど)
- 外部アプリやサービスからのメトリクス取得
- 取得したデータの InfluxDB などへの転送
- スクリプト出力やログファイルの取り込みにも対応
smartctl・nvmeとは
smartctlは、SATA HDD/SSDなどのS.M.A.R.T対応デバイスの状態を確認できるツールです。 nvmeは、NVMeインターフェースのSSDに対応したデバイスの状態を確認できるツールです。
ツールの導入
監視に利用するツールをインストールしていきます。
# influxdata-archive_compat.key GPG fingerprint:
# 9D53 9D90 D332 8DC7 D6C8 D3B9 D8FF 8E1F 7DF8 B07E
wget -q https://repos.influxdata.com/influxdata-archive_compat.key
echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | tee /etc/apt/sources.list.d/influxdata.list
apt-get update
# ツールのインストール
apt install telegraf lm-sensors smartmontools nvme-cli
インストール後は、telegrafの設定を進めます。 lm-sensorsやsmartctlなどは、telegrafのプラグインとして利用しています。 今回はSATA SSDのみが対象であったため、nvmeは利用していません。 収集した状況はinfluxdbに追加しています。influxdbについてはこちらを参考にインストールしてください。
# コメントアウトされているものを有効に
[inputs.sensors](/posts/inputs.sensors)
[inputs.smart](/posts/inputs.smart)
devices = ["/dev/sda"]
attributes = true
[outputs.influxdb_v2](/posts/outputs.influxdb_v2)
urls = ["http://192.168.0.1:8086"]
token = "xxxxxxxxxxxxxxxxxxxxxxxx"
organization = "org"
bucket = "buc"
データ取得にsudo権限だが、sudoが利用できない環境のためrootで実行するように変更します。
User=root
設定が完了したので、telegrafを起動します。
systemctl start telegraf
systemctl status telegraf
ダッシュボードの作成
ダッシュボードはGrafanaに作成します。インストール方法はこちらを参考にしてください。 クエリとその結果が以下になります。
SELECT mean("temp_input") FROM "sensors" WHERE $timeFilter GROUP BY time($__interval) fill(previous)
SELECT mean("temp_c") FROM "smart_device" WHERE $timeFilter GROUP BY time($__interval) fill(previous)