pfSenseでのpowerd効果

pfSenseで設定できるFreeBSDでもお馴染みpowerdを検証

powerdについて

FreeBSDにある機能でpfSenseでも当然使えます
有効にするとCPUのクロック周波数や電圧を調整できるので
アイドル状態ではクロック周波数・電圧を抑えて
負荷がかかるとクロック周波数・電圧を上げるので
結果としてCPU温度と消費電力を下げれる機能

クロック周波数はCPU throttling(CPUスロットリング)
電圧はEIST(Enhanced Intel SpeedStep Technology)
と呼ばれる機能・技術を使用します

電圧に関してはEISTはIntel CPUの場合で
AMDの場合はPowerNow!やCool’n’Quietです

実はクロック周波数と電圧の2種類を操作するというのは
動作を理解する上で重要なポイントで
通常powerdは2種類を同時に操作するわけですが
電圧調整が認識できない場合はクロック周波数の調整のみ
つまりはCPU throttlingしか調整してくれません

そしてpowerdは省エネを実現するための機能ですが
CPU throttlingだけだと発熱を抑えることはできても消費電力はほぼ下がりません
同時にEISTを利用することで初めて実感できるほど消費電力が下がるのです

pfSenseでの設定

pfSenseで使う場合はSystem→Advanced
Miscellaneousタブへ移動してPower savings

Use PowerDにチェック入れるとpowerdが機能する

On AC Power Modeがコンセントが繋がれてる状態
On Battery Power Modeがバッテリー駆動している状態
On Unknown Power Modeが電源供給状態が不明な状態

minimumは最低クロック周波数に固定
adaptiveは省電力重視でクロック周波数変動
hiadaptiveは処理重視でクロック周波数変動
maximumは最高クロック周波数で固定

RCC-VE 4860だとACアダプタで稼働している状態でも
On AC Power ModeではなくOn Unknown Power Modeの設定が反応してました
どの設定が反映するかはminimum設定を使えば簡単に判別できます

現在のクロック周波数を確認する方法

使用しているCPUでどの程度、変動するか等を確認するためコマンドを実行

コマンドはSSHでもいいですしWEBGUIからも確認可能です
WEBGUIでの確認方法はDiagnostics→Command Prompt
Execute Shell commandに「sysctl dev.cpu | grep freq」を入力しExecuteボタンを押す
すると上部に結果が出ます 右が切れてますが実際はスクロールして確認可能

実行結果

$ sysctl dev.cpu | grep freq
dev.cpu.0.freq: 1200
dev.cpu.0.freq_levels: 2400/8 2200/0 2000/0 1800/0 1600/0 1400/0 1225/0 1200/0 1050/0 900/0 750/0 600/0 450/0 300/0 150/0

dev.cpu.0.freqは現在の値
dev.cpu.0.freq_levelsが変動幅です

今回の場合、RCC-VE 4860で使われているのはIntelのAtom C2558で2.40GHzですが
最低クロック周波数は150MHz 最高が2400MHzになります

WEBGUIのダッシュボードにも10秒おきの更新になりますが
CPU Typeでの表記で確認できます
Currentが現在の値でdev.cpu.0.freqの値と同じ意味
最大クロック周波数で稼働している場合はCurrentの行が消えます

RCC-VE 4860におけるpowerd

インストール後の初期状態ではCurrent 1200MHzでした
実はpowerdを有効にしなくてもクロック周波数が調整されているようです

そこでCPUの状態を細かく確認するため先ほどのコマンド結果を見直します

$ sysctl dev.cpu | grep freq
dev.cpu.0.freq: 1200
dev.cpu.0.freq_levels: 2400/8 2200/0 2000/0 1800/0 1600/0 1400/0 1225/0 1200/0 1050/0 900/0 750/0 600/0 450/0 300/0 150/0

ということで15段階で変動してくれるはずなのですが
Current 1200MHzから変化はなく下がってくれません

最初に解説したようにpowerdはクロック周波数と電圧の2種類を調整する機能があり
dev.cpu.0.freq_levelsで表示されている段階は
CPU throttlingで対応しているクロック周波数で
同じ15段階でEISTを調整してくれるわけではありません

そこでEISTの調整可能幅を確認します

$ sysctl -a|grep dev.est
dev.est.%parent: 
dev.est.0.%desc: Enhanced SpeedStep Frequency Control
dev.est.0.%driver: est
dev.est.0.%location: 
dev.est.0.%pnpinfo: 
dev.est.0.%parent: cpu0
dev.est.0.freq_settings: 2400/8 2200/0 2000/0 1800/0 1600/0 1400/0 1200/0
dev.est.1.%desc: Enhanced SpeedStep Frequency Control
dev.est.1.%driver: est
dev.est.1.%location: 
dev.est.1.%pnpinfo: 
dev.est.1.%parent: cpu1
dev.est.1.freq_settings: 2400/8 2200/0 2000/0 1800/0 1600/0 1400/0 1200/0
dev.est.2.%desc: Enhanced SpeedStep Frequency Control
dev.est.2.%driver: est
dev.est.2.%location: 
dev.est.2.%pnpinfo: 
dev.est.2.%parent: cpu2
dev.est.2.freq_settings: 2400/8 2200/0 2000/0 1800/0 1600/0 1400/0 1200/0
dev.est.3.%desc: Enhanced SpeedStep Frequency Control
dev.est.3.%driver: est
dev.est.3.%location: 
dev.est.3.%pnpinfo: 
dev.est.3.%parent: cpu3
dev.est.3.freq_settings: 2400/8 2200/0 2000/0 1800/0 1600/0 1400/0 1200/0

Atom C2558の場合、EISTが対応してるのは7段階だとわかります
つまりCurrentが1200MHz以下にならないのはEISTの最低クロック周波数が1200だからで
そしてCPU throttlingは1200MHz以下も対応してますがそれ以下には下げたところで
消費電力はほぼ下がりませんので発熱差以外はするだけ無駄ということです

実際に設定しながら効果を検証

RCC-VE 4860の場合は普通に回線速度テストやセッション数を消費するぐらいだと
CPUはピーク値でも20%以下で済んでしまうのもあり
ここからの検証はCPU負荷を意図的に上げたりしての確認はしてません

室温は22度

powerdを無効
インストール後の初期状態がこの状態になる
最低クロック周波数は1200MHzみたいでそれ以下に下がりません
CPU温度は44度
WEBGUIの反応も普通に使える
回線速度テストでのピーク値はCPU使用率12%で計測結果もほぼ問題なし
計測中も1200MHzから動きなし
以降の消費電力はこれを基準にしてます

minimum設定
最低クロック周波数の150MHzに固定になりました
CPU温度は44度
WEBGUIもすごく重い
回線速度テストでのピーク値はCPU使用率は46%
計測結果は57MB/sぐらいで頭打ちしてるようです
消費電力はアイドル・計測中共に変わらず

adaptive設定
クロック周波数は確認できる中で一番低いのは300MHzでしたが
300MHzなんて一瞬なるぐらいでほぼ1050MHz前後で処理
CPU温度は44度
WEBGUIはたまに反応悪いときもあるって感じで使えなくはない
回線速度テストでのCPU使用率はピークで18%
計測結果はpowerd無効と同じレベルだが
計測中は最大クロック周波数の2400MHzまで上がるので
CPU温度も45度になります
消費電力は計測中に何回か一瞬+1Wになる程度

hiadaptiv設定
クロック周波数は確認できる中で一番低いのは1600MHz
WEBGUIはpowerd無効時の1.2GHzより高いのもあって当然問題なし
しかしアイドルで既にCPU温度は45度となる
回線速度テストでのCPU使用率はピークで10%
計測結果はpowerd無効と同じレベル
計測中の最大クロック周波数は2400MHzになるも
CPU温度は45度のまま
消費電力は計測中に何回か一瞬+1Wになる程度

maximum設定
最高クロック周波数の2400MHzに固定になりました
CPU温度は45度
WEBGUIも問題ないどころか気持ち軽く感じる
回線速度テストでのピーク値はCPU使用率は5%
計測結果はpowerd無効と同じレベルでCPU温度も45度
消費電力は計測中に何回か一瞬+1Wになる程度

検証結果

結果だけ見るとクロック周波数本当に下げてる?ってなりそうですが
事前のCPU throttlingとEISTを理解してると結果にも納得でしょう
powerdが無効であってもEISTが使われているので
minimum設定での150MHzと1200Mhzだと
消費電力に目に見える変化はないのです
そしてCPUの発熱もこの程度のCPU・処理内容じゃ1度以下の差です
そのくせ回線速度テストではきっちり差が出ます

adaptive・hiadaptiv・maximumの設定だと
簡単に最高クロック周波数の2400Mhzまで上がるので
発熱も1度上がり消費電力も1W上昇をちらほら見せる展開となる

特にadaptiveあたりは最低クロック周波数が低いので
WEBGUIの初動にもたつきが感じられます
WEBGUIだけならいいのですが他の処理にも当然影響し
それはネットワーク用途における重要なレスポンス性能にも影響します
なので最低クロック周波数の落とし過ぎには注意した方がいいです
メリットもほぼ無いですし

実用を考えるとキビキビ動くmaximumかバランスのpowerd無効の2択
現状で処理速度に不満はないのでpowerd無効でいくことになりました

あとがき

今回はpowerdを設定する上でいろいろ他サイトも見てたんですが
案外dev.cpu.0.freqだけを見てクロック周波数下がったから
その下げ幅を見て消費電力も同じように下がったと
思い込んでるサイトが多かったのにビックリです

これはクロック周波数と消費電力は比例するという認識からくるようですが
実はCPU throttlingでのクロック周波数調整は実際に落としてるわけではないようで
それが今回の結果に繋がってるようです

もちろんちゃんと計測しながら設定しているサイトの方も当然いまして
そういう人たちはハード構成が違えどほぼ同じ傾向でした

こういう設定する際はワットチェッカー等で実測して効果を確認するのが大事ですね