HomeLab 三機功耗監控:Netdata + Prometheus + Grafana 與電費估算

上期中電帳單 1,274 度、總費用約 $1,935,平均每度約 $1.519。「用了多少電」是一回事,「哪台機器用掉的」是另一回事。這套 Grafana 總覽把 TrueNAS、Windows PC 和 Ubuntu AI Server 放在同一頁:即時估算瓦數、每日電費、30 日電費預測,資料每 15 秒更新一次,共 43 個面板、36 個 PromQL 查詢。
分工要講清楚:Grafana 只負責顯示,Prometheus 負責儲存與查詢。每台主機在自己的作業系統層讀感測器、暴露指標端點,Prometheus 每 15 秒抓取並執行 recording rules;Grafana 只查 Prometheus,不直接連三台主機。面板重繪時不會增加主機的採集負擔。
環境與資料來源
| 主機 | 本機採集程式 | 端點 | Prometheus job |
|---|---|---|---|
| TrueNAS NAS | Netdata Agent(跑在 NAS 上) | :20489/api/v1/allmetrics | netdata-truenas |
| Windows PC | 自寫 HomeLabPowerEstimate Windows Service | :9186/metrics(Prometheus text) | windows-pc-power |
| Ubuntu AI Server | 官方 Netdata Agent 2.12.0(systemd 啟動) | :19999/api/v1/allmetrics | netdata-ai-server |
| Prometheus | TrueNAS App | :30104,15 秒 scrape + recording rules | — |
| Grafana | TrueNAS App | :30037,共用 tariff 變數 1.50 HKD/kWh | — |
前置條件
- 三台主機都能被 Prometheus 抓到(各自的 exporter 端點可達)。
- Linux 側要有 RAPL 讀值(CPU package、DRAM),Windows 側要有 NVML(GPU 功耗)。
- Grafana 已有一個 Prometheus datasource;本例的 datasource UID 固定,面板直接引用它。
- 要知道自己的電價:單一
HKD/kWh變數,或另行建模階梯費率。
資料流
[三台主機:本機採集]
TrueNAS Netdata :20489 /api/v1/allmetrics?format=prometheus&source=average
Windows power service :9186 /metrics
AI Server Netdata :19999 /api/v1/allmetrics?format=prometheus&source=average
\ | /
v Prometheus :30104 15 秒 scrape + recording rules
|
v PromQL
Grafana :30037 面板 + tariff 變數
步驟 1:讓每台主機暴露指標
Netdata 的 source=average 很重要:走 15 秒平均值,而不是瞬間值,這樣 recording rules 算出來的功率曲線才不會全是毛刺。
curl -s "http://<host>:19999/api/v1/allmetrics?format=prometheus&source=average" | grep -E 'nvidia_smi|cpu_user|mem_used'
Windows 端要自己寫 service:優先讀 CPU package sensor(LibreHardwareMonitor / RAPL),GPU 用 NVML 讀功耗、溫度、使用率,並把今日與本月電能 ledger 寫到本機 JSON 檔案。
步驟 2:scrape job 與 power recording rules
# prometheus.yml(片段)
scrape_configs:
- job_name: netdata-ai-server
scrape_interval: 15s
metrics_path: /api/v1/allmetrics
params: { format: [prometheus], source: [average] }
static_configs:
- targets: ["<ai-server>:19999"]
# recording rules(概念,非可直接套用檔)
ai_server_cpu_package_watts = RAPL package
ai_server_memory_watts = max(raw_dram_watts, 18)
ai_server_estimated_wall_watts = (CPU + GPU + RAM + platform) / 0.88
步驟 3:功耗公式與每台假設
P_internal = P_cpu + P_gpu + P_ram + P_storage + P_board + P_fan + P_nic
P_wall_AC = P_internal / η_psu
E_kWh = Σ(P_wall_AC × Δt_seconds) / 3,600,000
Cost_HKD = E_kWh × tariff_HKD_per_kWh
每台可用的 component 不同,所以假設要寫死在 rules 裡,才不會變成「憑空的猜測」:
- TrueNAS:Netdata 給 CPU/RAM/coretemp/磁碟/網路;主板、風扇、HDD 屬 power estimation rules 建模。
- Windows:CPU 20+主板、RAM、2×NVMe、SATA SSD、HDD、風扇等常數項,再除以 0.88 PSU 效率;低/高情境另用 0.82/0.92。
- AI Server:GPU board power 已含 VRAM,不能再加一份顯存功率。平台初值 40W(主板 28、風扇 8、NIC 2、SSD 2)。
時間換算有兩種,而且不能相加:Windows service 用實際採樣間隔與 monotonic elapsed time 累加成今日/本月 ledger;Linux 兩台的每日與 30 日數字是 avg_over_time(P[24h]) × 24 / 1000 的 rolling 預測。預測是預測,不是實際累計。
步驟 4:缺資料時不要顯示 0W
這是整套系統最容易做錯的地方。target up=0、CPU/GPU sensor 缺失、sample invalid 時,不發布不完整的整機瓦數;總覽顯示「資料缺失/未採集」,而不是補成零。Exporter 在線也不代表感測器一定可用,所以「在線狀態」與「可用功耗台數」要分開顯示。缺一台時總值留空,其他台仍可各自看。
電價:平均價與邊際價是兩件事
帳單是階梯費率加浮動燃料調整費,Grafana 用的是單一 1.50 HKD/kWh,兩者用途不同:帳單上的平均約 $1.519/kWh,而「多開一台機器會多付多少」要用第三級基本費率加燃料費,約 $1.685/kWh 才是增量估算的依據。若要按整戶階梯計費,得先取得月度分級與 fuel adjustment 的明確算法,再獨立建模。
實際踩到的坑
- TrueNAS 的 DRAM RAPL 只有 0.17–0.21W,對六條 DIMM 明顯不相稱 → 改成
max(raw_dram, 18W),同時保留 raw 指標與來源旗標,不假裝它是實測。 - GPU board power 已包含 VRAM:Netdata
nvidia_smi的讀值是板卡總功率,再加一份顯存功率會重複計算。 - Windows 沒有 GPU sensor 就不發布整機瓦數:寧可顯示不完整,也不要拿 idle model 硬撐。
- Grafana 資源格式不一致:TrueNAS 既有面板是 v1、新加的是 v2,直接 diff 會誤判。做法是把兩者轉成共同語義表示再比對。
- TrueNAS 的 RAM 顯示不含 cached/buffers,也不是 ZFS ARC 深度分析;TrueNAS 目前沒有 GPU 指標、Windows service 不提供 RAM/VRAM,這些要標「不適用」。
驗證結果(已測 / 未測)
- 已測:三個 Prometheus targets 皆 UP;36 個面板查詢全部回傳預期序列;
promtool test rules跑 6 種正常/缺資料/重複序列案例、33 項斷言全過。 - 已測:部署前後面板、查詢、版面、顯示與費率設定一致,Prometheus 設定與規則檔雜湊未變,Grafana/Prometheus 不需重啟。
- 未測:沒有登入後的瀏覽器截圖,所以沒有視覺渲染驗證;模型也沒有牆插電表校準,風扇、主板、PSU 效率仍是假設。
下一步
- 把共用 tariff 依實際用途設成合適的值——估算增量用邊際價,估算帳單用平均價。
- Windows 補 RAM/VRAM exporter,補上面板前先確認標籤與單位。
- 用牆插功率計做一次校準,把模型假設收掉。
- 若要整戶階梯帳單估算,先定案分級與燃料費計算方式再建模。
小結
這套監控的價值不在「知道用了多少電」,而在把每個數字分成三層:感測器實測、模型估算、缺失不顯示。三層分清楚,電費數字才有意義;混在一起看,面板只會給一個看起來很精確的猜測。

貓說:先讓系統安靜地跑起來。
發佈留言