FIELD NOTE / SINGLE ENTRYNO SIGNAL / NO PROBLEM

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 NASNetdata Agent(跑在 NAS 上):20489/api/v1/allmetricsnetdata-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/allmetricsnetdata-ai-server
PrometheusTrueNAS App:30104,15 秒 scrape + recording rules—
GrafanaTrueNAS App:30037,共用 tariff 變數 1.50 HKD/kWh—
三個 exporter + 一個 Prometheus + 一個 Grafana

前置條件

  • 三台主機都能被 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,補上面板前先確認標籤與單位。
  • 用牆插功率計做一次校準,把模型假設收掉。
  • 若要整戶階梯帳單估算,先定案分級與燃料費計算方式再建模。

小結

這套監控的價值不在「知道用了多少電」,而在把每個數字分成三層:感測器實測、模型估算、缺失不顯示。三層分清楚,電費數字才有意義;混在一起看,面板只會給一個看起來很精確的猜測。

pixel cat

貓說:先讓系統安靜地跑起來。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *