自宅Lab

Linux OS上で消費電力を確認したい ~RAPL(Running Average Power Limit)とは?~

自宅にサーバとして複数PCを置いているのですが,電気代が高くなっており,そろそろ電力消費も考えないとなーと思ってます.ただ,現状コンセント直挿ししているので,そもそもどれぐらい電力を使用しているのかがわかりません.

以下のようなワットチェッカー的なものを導入するのが一番確実だとは思いますが,PCが複数ある場合,PCごとの消費電力を測るためにはPCごとのワットチェッカーor個別で測れるものが必要です.それは金銭面で厳しい.
https://amzn.asia/d/7c2IwIK

電源タップの大元でまとめて電力を測っても良いが,できればもっと粒度を細かくしたい.ソフトウェア的に扱いやすい,APIで叩けて可視化とかできるものがほしい.

ということで,OS上から消費電力取れないかなっということで色々調べていると,CPUやDRAMの電力消費を調べることができるRAPL (Running Average Power Limit) なるインタフェースがあるらしいので,それを使えないかなーと考えてみました.

RAPL (Running Average Power Limit)とは?

  • プロセッサの電力使用量の計測や電力制限を行う機能
  • 2011年,IntelのSandyBridgeアーキテクチャで導入
  • CPUの性能カウンタや温度から消費電力を推定する
  • 電力値は,​MSR (Model Specific Register、モデル固有レジスタ)を介してユーザに提供される

取れる値はCPUにもよりますが,Intel CPUだとRAPLは以下のドメインをサポートしています.

  • Package : CPUのCore,内部GPU,L3キャッシュやメモリコントローラを含むCPUパッケージ全体.Status読み取りはMSR_PKG_ENERGY_STATUS.
  • PP0 (Power Plane 0): CPUのコア部分の電力消費.Status読み取りはMSR_PP0_ENERGY_STATUS.
  • PP1 (Power Plane 1): 統合GPUやLLCといったUncoreなデバイスの電力消費量.Status読み取りはMSR_PP1_ENERGY_STATUS.
    • (※プラットフォームによって異なり,サーバプラットフォームではサポートされない)
  • DRAM: DRAMの電力消費.Status読み取りはMSR_DRAM_ENERGY_STATUS.

詳しくは,「Intel® 64 and IA-32 Architectures Software Developer’s Manual」の「Package PAL Domain」に書かれています.

AMDのRAPL

Ryzen CPUにもRAPLが実装されていますが,ソケット単位とCore単位でDRAM等は用意されていません.

  • MSR_CORE_ENERGY_STATUS: コア単位の消費電力
  • MSR_PACKAGE_ENERGY_STATUS: ソケット単位の消費電力

詳しくは,以下を参照.
https://rocm.docs.amd.com/projects/amdsmi/en/latest/doxygen/docBin/html/group__tagEnergyInfo.html#ga10285cd03b81236b689102ac1f3da136

perfで見てみる

RAPLの値を読み取るために,まずperfを利用してみます.

sudo apt install linux-tools-generic

CPUはCeleron J4125です (自宅にあったCPUの殆どはRyzenなので,Intel CPUは Celeronぐらいしかなかった.orz).

$ sudo perf stat -a -e power/energy-pkg/,power/energy-cores/,power/energy-gp
u/,power/energy-ram/ sleep 60

 Performance counter stats for 'system wide':

            123.96 Joules power/energy-pkg/                                                     
              6.90 Joules power/energy-cores/                                                   
              0.00 Joules power/energy-gpu/                                                     
              3.34 Joules power/energy-ram/                                                     

      60.002572909 seconds time elapsed

なお,各項目は以下のようにマッピングされています.
(定義自体はこちら)

  • energy-pkg: Package domain
  • energy-cores: PP0 Domain
  • energy-gpu: PP1 Domain
  • energy-ram: DRAM Domain

energy-pkgが,123[J]だったので,123[J]/60[s]≒2.3 [W].コアだけなら,約0.1[W].
Celeron J4125のTDPは 10Wだが,CPU使用率 1-2%なので,こんなもん?

IntelのTDPの説明によると,すべてのコアがアクティブで複雑なワークをさせて測っているのがTDPなので,消費電力はそんなもんっぽい.

Thermal Design Power (TDP) represents the average power, in watts, the processor dissipates when operating at Base Frequency with all cores active under an Intel-defined, high-complexity workload. Refer to Datasheet for thermal solution requirements.
https://www.intel.com/content/www/us/en/products/sku/197305/intel-celeron-processor-j4125-4m-cache-up-to-2-70-ghz/specifications.html

s-tui

もっとリッチに確認したいということでs-tuiを使います.s-tuiは,CPUの温度,周波数,利用率,消費電力をターミナルでグラフ表示してくれます.この消費電力がRAPLで読み取った値です.

以下は,Celeron J4125の場合.

実際の消費電力と比べてみる

ワットチェッカーを一つだけ持っているので,適当にRyzen 5825Uで測ってみます.(Celeronだと消費電力少なすぎたのでRyzenで.DRAM読み取れないのは許して…)

RAPLの値は,2.6 ~ 3.5 あたりを推移.

PC手前でもチェッカーを入れてみると,5 ~ 6 あたり.

コンセント付近だと,6.8 ~ 7.5Wあたり.

(ほとんどアイドル状態の)Ryzen 5825UだとRAPLと実際の消費電力は4 ~ 5Wぐらい?.変換効率のロスとか,他の部分での電力消費を考えると,RAPLからPC全体を測るにはPC個別のモデルが必要ですね...

RAPLが読み取れないCPU

RAPLの値を読み取るためには,ハードウェアのサポートとLinuxカーネルのサポートが必要です.サポートされないCPUも多くあり,家に置いてあるPCたちでだと,Intel N100, Intel N95あたりは読み取れませんでした.

結論

消費電力の参考にはなると思うが,家の全PCの消費電力を把握するぞという目的には使えないかもという印象です.どのPCが一番多く使ってるかみたいな形で使うしかないかなーと.

参考文献

コメント

タイトルとURLをコピーしました