-
ESXi5.1の省電力設定
Posted on 1月 9th, 2013 はおりん No comments昨年はほとんど高性能処理用サーバを停止していたんだけど、年末にMinecraftのサーバをこの中に入れようと思って電源を入れたら、入らない。パーツを交換したりして修理して動作はしたんだけど、今度は電気代が5000円も上がった。このままでは存続の危機なので、省電力設定を徹底的にやってみようと思った。
結論から言っておくと、失敗しました。ただ、設定方法と方針はどうやら合ってるようで、省電力にならないのはハード的な問題っぽいので、詳しい設定内容は記事に起こすことにします。
前置き
この記事はVMware ESXi ハイパーバイザーを使用していない方にはほぼ無意味です。
省電力設定を細かくカスタムしたい方、標準の「低電力」設定では満足できない方にオススメの記事です。
または、「電力管理」が裏で何をやってるのかを知りたい方にもオススメかもしれません。
BIOSの設定でC1ステートと、C3ステートと、EISTを有効にしておく必要があります。
うちのCPUはIntelのCore i7ですが、たぶんAMDでも方針と方法は同じです。
ESXのCLIはあまり詳しくないので、vSphereClientからの設定を行っています。
CステートとPステートの確認をする際に、ESXiにSSHで接続するか、コンソールシェルが使えるようにしておく必要があります。準備
前置きにも書いたが、まずはESXiホスト(ESXiを動作させているサーバマシン)のBIOS設定でCPUのC1ステートと、C3ステート、さらにはPステートを有効にする必要がある。
Cステートとは、CPUのスリープ状態のことで、C0~C7まである。
C0:CPUが動作している状態。またはすぐに動ける状態。人間で言えば「立っている状態」
C1:起きてはいるがすぐには動けない状態。人間で言えば「座っている状態」。動くには立ち上がらなければならない。
C2:座っていて部屋のドアも閉じてる状態。
C3:部屋に鍵までかけてる。
C4:電気も消してほぼ寝てる。C4から復帰するためには、まず電気を付けて(C4→C3、VCC電圧を通常電圧に変更)、部屋の鍵を開けて(C3→C2、クロック生成機を動作開始)、ドアを開けて(C2→C1、バスクロックを供給)、立ち上がらなければならない(C1→C0、CPUクロックを供給)。実際にはC4からC0まで順序よく実施されるのでは無いと思うが。
で、C4まで行くとかなり消費電力が落ちる。そりゃそうだ、CPUがほぼ寝てるんだから。で、マルチコアCPUの場合、このCステートをコアごとにそれぞれ制御できるはずなのである。つまり、1コアにだけ負荷がかかっている場合、他のコアは寝ていられる。寝ているだけなら発熱は抑えられる。負荷のかかっているコア以外の熱源が無いなら、ちょっとばかり1コアに無理をさせても大丈夫、という理論で特定コアだけオーバークロックしてシングルスレッド処理を高速化するのはCoreシリーズのTurboBoostである。
次にPステートだが、これは単純に動作周波数を落とす機能である。動作周波数が高いとそれだけ電力を食う。なので負荷が軽いときには周波数を落としてしまおうと言うことで、モバイルPCなんかだと超常識機能である。こちらはP0~P8まであり、P0が最大周波数だ。
で、このCステートはBIOSで無効になっていることがある。特に、高パフォーマンスを重視したマザーボードなんかだと無効になっているみたいだ。設定項目はBIOSによってマチマチだが、「Enable C-State」とか「Use C1E」とか「C3/C6/C7 state」とか書いてあったりする。
Pステートの方はIntelCPUなら「EIST」と呼ばれているので、「Enable Intel EIST Technology」とかいう設定項目があったりするので、有効にしておこう。BIOSの設定が終わったら、どっかのPCにvSphereClientをインストールし、ESXiハイパーバイザの管理を行えるようにしておこう。
いざ、実践!
省電力設定を変えよう
まずは電力管理を確認してみよう。
テクノロジーの部分に「Enhanced Intel SpeedStep(R)」と書いてある。略すとEIST(最後のTはTechnology)なので、EISTは無事に機能している。
アクティブなポリシーは確か最初は「高パフォーマンス」になっていたような気がするが、今回は細かく設定していくので「カスタム」を選択する。変更方法は右上の「プロパティ」をクリックして「カスタム」に変更するだけだ。変更後に「更新」をしないと反映されないかもしれない。さぁ、いよいよお楽しみの時間だ。
まず、今のままの状態で、CPUがどういう風に動いているが見てみよう。
SSHかコンソールで以下のコマンドを入力する。esxtop
するとこんな画面になる。
これはよくある「top」と同じようなもので、プロセスの一覧や、仮想マシンのCPU使用率などが表示されている。この画面のまま、「p」キーを押す。
こんな画面に変わっただろうか?そう、これが、CPUの状態をコアごとに表示している画面である。
上の画面では1コア・2コア・3コアがC1ステートにおり、4コアはC0ステートで動作中だ。4コアに至ってはPステートもP0で、最大周波数で動作している。C2とC3ステートはまったく使用されていない。ちなみに現在はHyperThreadingを切っているので4コアに見えているが、HTを使用していると8コアに見える。ではこれを変更していこう。
「構成」タブの左側のメニューの一番下に「詳細設定」とあるはずだ。これをクリックするとこんな画面が開く。左側の一覧から「Power」を選ぶと、なんだかよく分からない項目がずらっと並ぶ。よく分からないでは設定できないので、1つ1つ説明していこう。
設定項目解説
なお、以下の設定の解説と、「最大パフォーマンス」「最省電力」の設定値は僕の予想なので、正確で無い可能性があります。
- Power.ChargeMemoryPct
デフォルト:20
実はこれだけ、よく分からなかった。デフォルトのまま放っておこう。 - Power.CStateMaxLatency
デフォルト:500
最大パフォーマンス:0
最省電力:1000000
Cステートの深度が深くなる(C0から遠くなる)ほど、復帰に時間がかかるのは想像に難くない。復帰に時間がかかると言うことは、急激な負荷をかけたときに一瞬重くなることがあるということだ。この設定は、その「重くなる一瞬の時間」をどれくらいの長さまで許すか、ということになる。0に設定すると常に「即時最大パフォーマンスが出せる状態」でCPUは待機するので消費電力は大きく、無駄も出る。デフォルトの500なら「0.0005秒以内に最高パフォーマンスに戻れる」状態でCPUは待機する。 - Power.CStatePredictionCoef
デフォルト:110479
これは非常に難しいパラメータなので、触らないのが無難である。
ESXiはCPUを眠らせるとき、「このCPUはどれくらいの時間、ヒマしてるだろうか?」の予測を立てる。長時間ヒマだと予想すればより深い眠りに、すぐに仕事があると予測すればより浅い眠りにつけようとする。その予測用のパラメータ(定数)である。数値をどう変えれば動作がどう変わるのか、よく分からない。 - Power.CStateResidencyCoef
デフォルト:5
最大パフォーマンス:1000000
最省電力:1 (または0)
これは非常に重要なパラメータである。CPUがどのくらいの頻度で眠るか、どの程度深く眠るかが、ほぼこのパラメータで決まると言って過言では無い
例えばESXiが「このCPUは10μsほどヒマになるな」と予測したとする。
CStateResidencyCoefが1の場合:復帰に10μs以上かかる眠りにはつけない
CStateResidencyCoefが5の場合:復帰に2μs以上かかる眠りにはつけない
CStateResidencyCoefが100の場合:復帰に0.1μs以上かかる眠りにはつけない
ということでCStateResidencyCoefの値を大きくすると、復帰までの時間の要求が厳しくなる。この値を小さくしておくと、より深い眠りにつけるのである。ちなみに僕は「0にすると0除算が起きたり、計算不可になったりするんじゃなかろうか」と思うんだが、何故か最低値は0となっている。 - Power.MaxCpuLoad
デフォルト:60
最大パフォーマンス:0
最省電力:100
CPU使用率がどのくらい低いときに周波数を落とすかを決定する。0に設定すると常に最大周波数で動作しようとする。逆に100に設定すると、隙あらば最低周波数になろうとする。 - Power.MinFreqPct
デフォルト:0
最大パフォーマンス:100
最省電力:0
周波数をどのくらい落とすかの設定だが、実は設定出来るPステートはCPUごとに決まっているので、この設定はあまり意味を持たない。 - Power.PerfBias
デフォルト:6
設定可能値:0,6,15
最大パフォーマンス:0
最省電力:15
IntelのEISTはCPU自身が負荷監視をして動作周波数を落としたり、電圧を下げたりする。その際に「どのくらいパフォーマンスを重視するのか」の設定がこちら。 - Power.PerfBiasEnable
デフォルト:1
設定可能値:0,1
先ほどの「PerfBias」をCPUに教えるかどうかを設定する。教えなくてもたぶん設定6あたりで勝手に動く。 - Power.TimerHz
デフォルト:100
Pステートを1秒間に何回設定するか。1秒間に1回にしておくと、1度最大周波数になったら1秒間下がらない。ただ、割り込みにもそれなりに処理能力を食うので、50くらいに落としておいても良いかと思われる。 - Power.UseCStates
デフォルト:0
設定可能値:0,1
Cステートを使用するためには「1」にしなければならない。省電力設定では欠かせない設定だ。 - Power.UsePStates
デフォルト:1
設定可能値:0,1
Pステートを使用するためには「1」にしなければならない。こちらも欠かせない設定であるが、最初から有効になっている。 - Power.UseStallCtr
デフォルト:0
CPUには「予測実行」という機能が存在する。1つのコアの中だけでも複数の演算ユニットがあり、それが複数コア分あると、同時に計算できる本数は10本をかるーく超える。現代では100くらい行ってるんじゃなかろうか。そんなに同時に計算できるのに、プログラムをいちいち上から順番に実行していったのでは非効率的なので、たとえば次に必要とされるであろうメモリの内容を先読みしてきたり、他の計算の結果を待たずに次の計算をしちゃったりして、「先読み実行」を行う。行うが、やっぱり「予測」しているだけあって、予測が外れることもある。予測が外れると予測の最初から全部やりなおしなのでCPUは「失速」する。
たとえばマルチコアCPUの場合、Aコアで計算している内容よりもBコアの動きが速すぎてAコアが「ちょ待った待った!」っていう状態になることがある。そういうときにBコアの周波数を落として、省電力と各コアの均衡を両立させようということらしい。
省電力的には「1」に設定しておいた方が良さそうだ。
実際にやってみよう
さて、ざっと説明してきたが、まず、なにはともあれ、UseCStatesとUsePStatesとUseStallCtrを1にしてesxtopを確認してみよう。
速攻、C3が多用されるようになった。これだけでも省電力効果は高い。しかし瞬間的なパフォーマンスを犠牲にしてでもより省電力を目指す僕は以下の設定にした。
CStateMaxLatency:1000000
CStateResidencyCoef:1
MaxCpuLoad:100
PerfBias:15
TimerHz:50ちなみにこのような設定をしても、継続的に負荷をかけ続ける場合には遺憾なく最高パフォーマンスを発揮してくれる。例えば動画エンコードとか、3Dレンダリングとか。逆に、例えば複数人での開発用に、みんなでSSH接続して使うサーバだとか、Windowsを動かしてリモートで常用する「仮想デスクトップ」だとかにすると、ところどころで引っかかりを感じることになると思われる。
下がらない
で、これでCPUはC3ステートにほぼ常時へばりついてることは確認したんだが、何故か消費電力が下がらない。しかし海外サイトなどで調べても省電力にするためにこの辺の設定をいじるという点は間違ってはいないらしい。これは・・・電源ユニットあたりに問題があるのかしらー?
ハードウェア Core i7, VMware2 Responses to “ESXi5.1の省電力設定”
-
電源の80プラスサポートで消費電力絞った時の
変換効率が落ちるのを大幅に防げる。電源ユニット50W総容量が増えたのにかかわらず。
毎時流れる電流が3割減ってにんまり。回しっぱなしのマシンには80プラスプラチナが良いね。
ワット数絞れば値段もお安く買えるしね。 -
80プラスサポートとな。
電源効率が問題だと判明したら導入してみましょう!
判明しなくても次に電源買うときはコレにしてみようかな
コメントを書く
- Power.ChargeMemoryPct