Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
適用先 openSUSE Leap 15.7

12 電源管理 Edit source

概要

電源管理機能は、電力や冷却システムに対する運用コストを下げるためのものだけでなく、それと同時に現在の要件に適合したレベルの性能を維持するために必要な機能です。そのため電源管理機能は、必要な性能の維持と省電力のバランスを常に取る必要があることになります。電源管理機能はシステム内の様々なレベルで実装され使用されています。デバイスやオペレーティングシステムの電源管理機能の仕様集は、 Advanced Configuration and Power Interface (ACPI) として規定されています。サーバ環境での省電力は主にプロセッサレベルで実現されていますが、本章では主な考え方と分析に使用するツール類、そして影響するパラメータについて説明しています。

12.1 CPU レベルでの電源管理 Edit source

CPU のレベルでは、様々な方法で電力使用量を制御することができます。たとえばアイドル (待機) 状態での電力使用量の調整 (C-ステート) や、 CPU の動作周波数変更 (P-ステート) 、そして CPU の減速 (T-ステート) があります。下記のセクションには、それぞれのアプローチに対する簡潔な説明と、電力使用量にもたらす影響度合いを示しています。詳しい仕様をお読みになりたい場合は、 https://uefi.org/sites/default/files/resources/ACPI_Spec_6_4_Jan22.pdf (英語) を参照してください。

12.1.1 C-ステート (プロセッサの待機状態) Edit source

新しいプロセッサであれば、 C-ステート と呼ばれる省電力モードに対応しています。この設定は、使用していないコンポーネントの電源を落としておくことで、待機状態のプロセッサの消費電力を減らすための仕組みです。

プロセッサが C0 状態に設定されている場合、そのプロセッサは何らかの処理を実行していることになります。 C0 以外の状態であれば、アイドル (待機) 状態にあることになります。 C の後ろの番号が大きければ大きいほど、より CPU が深く休眠し、より多くのコンポーネントを休止させることで、電力の消費を抑えていることになります。ただし、 C の後ろの番号が大きければ大きいほど、遅延を生み出す結果になります。つまり、 CPU が C0 に戻るまでに時間が必要になります。処理内容 (スレッドが起動して CPU の使用を開始し、再度休眠状態に入るまでの時間など) やハードウエア (たとえばネットワークデバイスの割り込み状況) にも依存しますが、深い休眠状態を無効化すれば、全体の性能は高くなります。 C-ステートの設定方法について、詳しくは 12.3.2項 「cpupower によるカーネル内のアイドル状態の表示」 をお読みください。

また、ステートによってはサブモードが規定され、さらに細かい省電力レベルが用意されていることもあります。 C-ステートやサブモードの対応状況は、プロセッサによって異なります。ただし、 C1 については必ず提供されています。

表12.1「C-ステート」 には、主な C-ステートの概要を示しています。

表 12.1: C-ステート

モード

定義

C0

動作状態を表します。 CPU の機能が全て有効化されています。

C1

最初のアイドル状態です。ソフトウエアを介して CPU のメイン内部クロックを停止させている状態です。バスインターフェイスユニットと APIC はフルスピードで動作し続けています。

C2

ハードウエアを介して CPU のメイン内部クロックを停止させている状態です。ソフトウエアから参照できる全ての状態を維持していますが、割り込みでの再動作にはしばらくの時間を要するようになります。

C3

全ての CPU 内部クロックを停止させている状態です。プロセッサ内のキャッシュの一貫性 (コヒーレンシー) についても維持を行う必要のない状態ですが、その他の状態については維持し続けています。また、プロセッサによっては C3 ステートのバリエーションが用意され、割り込みによる再動作にかかる時間が異なる設定が用意されているものがあります。

不要な電力消費を避けるため、深い休眠状態を有効化した場合と無効化した場合で、必要な負荷に対する処理速度を確認しておくことをお勧めします。詳しくは 12.3.2項 「cpupower によるカーネル内のアイドル状態の表示」 を参照するか、もしくは cpupower-idle-set(1) のマニュアルページをお読みください。

12.1.2 P-ステート (プロセッサの性能状態) Edit source

プロセッサが動作している状態 (C0 ステート) にある場合、 CPU はいずれかの性能状態 (P-ステート) にあります。 C0 を除く C-ステートがアイドル (待機) 状態を表すのに対して、 P-ステート は CPU の動作周波数と電圧に関連する動作状態を表します。

P の後ろの数値が大きければ大きいほど、より低い動作周波数および電圧でプロセッサが動作していることになります。 P-ステートの番号体系と実装には様々なものがありますが、 P0 は (12.1.3項 「Turbo 機能」 を除く) 最高の性能状態を表す意味になっています。 P の後ろの番号が大きいほど、プロセッサの速度が落ちていて、かつ電力消費も少ないモードであることになります。たとえば P3 の状態は、 P1 の状態に比べて遅く、省電力で動作しています。また、 P-ステートは C0 ステートで動作している (つまり、全ての機能を動作させ、休眠状態に無い) 場合にのみ使用されるものでもあります。 CPU の P-ステートは ACPI 仕様でも定義されています。詳しくは https://uefi.org/sites/default/files/resources/ACPI_Spec_6_5_Aug29.pdf をお読みください。

なお、 C-ステートと P-ステートは、互いに独立して提供される仕組みです。

12.1.3 Turbo 機能 Edit source

Turbo 機能を利用することで、動作中の CPU コアの動作速度を動的に 引き上げ ながら、動作していない CPU コアを深い休眠状態にすることができます。これにより、熱設計電力 (Thermal Design Power (TDP)) の制限を守りながら、動作中のスレッドの性能を上げることができます。

しかしながら、 CPU コアが Turbo 機能に対応できるかどうかは、アーキテクチャによって異なります。このような新しい機能の効率を調べたい場合は、 12.3項 「cpupower ツール」 を参照してください。

12.2 カーネル内ガバナー Edit source

カーネル内のガバナー (統治する仕組み) は、 Linux カーネルの CPUfreq インフラストラクチャに属するもので、動作中に動的にプロセッサの動作周波数を変更するために使用することができます。ガバナーは CPU 側であらかじめ設定された電力スキームを表すものとして考えることができます。 CPUfreq は P-ステートを使用して周波数や消費電力を統治します。動的なガバナーの仕組みによって、 CPU の周波数を使用されている状況に応じて切り替えることができます。これにより、性能への影響を少なくしたまま、省電力を実現できることになります。

CPUfreq サブシステムでは、下記のガバナーが提供されています:

Performance ガバナー

最大限の性能を発揮するため、 CPU の動作周波数を設定可能な最大値に固定します。そのため、このガバナーでは電力消費量の削減は行わないことになります。

12.4.1項 「P-ステート向けのチューニングオプション」 もお読みください。

Powersave ガバナー

CPU の動作周波数を設定可能な最小値に固定します。これにより、プロセッサがどれだけ忙しい状態であっても、周波数を上げることがなくなりますので、性能には大きな影響が現れます。ただし、 intel_pstate については例外で、既定値が powersave モードになっていますが、こちらはハードウエア固有の仕組みによって設定されているものであり、実際には on-demand ガバナーのように動作することに注意してください。

また、このガバナーを利用して最大限の省電力を実現しようとしても、実環境では C-ステートによる待機時の電力消費削減のほうが効果が大きくなってしまい、期待通りの省電力にはならないことがありますので、あらかじめご注意ください。さらに、 Powersave のガバナーでは周波数が低くなることから、処理にかかる時間も長くなります。つまり、 C-ステートの変化も遅くなります。

チューニングオプション: ガバナーで調整する最小限の周波数を設定することができます (cpupower コマンドラインツールなどで行うことができます) 。

On-demand ガバナー

動的な CPU 周波数制御を行うカーネル実装です。このガバナーではプロセッサの使用状況を確認して、ある特定の閾値を超過すると指定可能な最大の周波数に設定します。逆に使用状況が閾値を下回ると、指定可能な次の低い周波数に設定します。さらに使用されない状態が続くと、最も低い周波数になるまで少しずつ低く設定します。

重要
重要: ドライバとカーネル内ガバナーの関係性について

全てのドライバがカーネル内のガバナーを利用して動的な周波数調整を行っているわけではありません。たとえば intel_pstate ドライバでは、独自に周波数を調整しています。お使いのドライバが何であるのかを調べたい場合は、 cpupower frequency-info と入力して実行してください。

12.3 cpupower ツール Edit source

cpupower ツールは、 Turbo 機能 (もしくはブースト機能) を含め、マシン内で利用できる 全ての CPU 消費電力関連のパラメータを取得したり設定したりすることのできるツールとして設計されています。このツールを使用することで、カーネル関連の CPUfreq や cpuidle システムのほか、周波数調整やアイドル状態とは直接関係のない様々な設定を表示したり、変更したりすることができます。また、統合されている監視フレームワークでは、カーネル関連のパラメータとハードウエアの統計情報の両方にアクセスする機能を提供します。そのため、性能のベンチマークを行う用途に適した仕組みです。このほか、 Turbo やアイドル状態の依存関係の調査を行うこともできます。

cpupower パッケージをインストールしたら、 cpupower --help を実行することで、利用可能な cpupower のサブコマンド一覧を表示することができます。また、全体のマニュアルページには man cpupower と入力して実行することで評議することができるほか、サブコマンド向けのマニュアルページを表示したい場合は、 man cpupower-サブコマンド と入力して実行してください。

12.3.1 cpupower による現在設定の表示 Edit source

cpupower frequency-info のように入力して実行すると、カーネル内で使用されている cpufreq ドライバの統計情報を表示することができます。これに加えて、 BIOS 内で Turbo (ブースト) 機能が有効化されているかどうかも表示することができます。何もオプションを指定しないで実行すると、下記のような出力が現れます:

例 12.1: cpupower frequency-info の出力例
# cpupower frequency-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 0.97 ms.
  hardware limits: 1.20 GHz - 3.80 GHz
  available cpufreq governors: performance, powersave
  current policy: frequency should be within 1.20 GHz and 3.80 GHz.
                  The governor "powersave" may decide which speed to use
                  within this range.
  current CPU frequency is 3.40 GHz (asserted by call to hardware).
  boost state support:
    Supported: yes
    Active: yes
    3500 MHz max turbo 4 active cores
    3600 MHz max turbo 3 active cores
    3600 MHz max turbo 2 active cores
    3800 MHz max turbo 1 active cores

全ての CPU に対する現在の値を表示するには、 cpupower -c all frequency-info コマンドを使用します。

12.3.2 cpupower によるカーネル内のアイドル状態の表示 Edit source

idle-info サブコマンドは、カーネル内で使用されている cpuidle ドライバの統計情報を表示することができます。 cpuidle カーネルフレームワークを使用していれば、どのようなアーキテクチャでも動作します。

例 12.2: cpupower idle-info の出力例
# cpupower idle-info
CPUidle driver: intel_idle
CPUidle governor: menu

Analyzing CPU 0:
Number of idle states: 6
Available idle states: POLL C1-SNB C1E-SNB C3-SNB C6-SNB C7-SNB
POLL:
Flags/Description: CPUIDLE CORE POLL IDLE
Latency: 0
Usage: 163128
Duration: 17585669
C1-SNB:
Flags/Description: MWAIT 0x00
Latency: 2
Usage: 16170005
Duration: 697658910
C1E-SNB:
Flags/Description: MWAIT 0x01
Latency: 10
Usage: 4421617
Duration: 757797385
C3-SNB:
Flags/Description: MWAIT 0x10
Latency: 80
Usage: 2135929
Duration: 735042875
C6-SNB:
Flags/Description: MWAIT 0x20
Latency: 104
Usage: 53268
Duration: 229366052
C7-SNB:
Flags/Description: MWAIT 0x30
Latency: 109
Usage: 62593595
Duration: 324631233978

プロセッサがどのアイドル状態に対応しているのかを cpupower idle-info で調べたあとは、 cpupower idle-set コマンドを使用することで、個別のステートを無効化することができます。一般的には最も深い休眠状態を無効化することになるかと思いますが、このような場合は下記のように入力して実行します:

# cpupower idle-set -d 5

レイテンシが 80 と等しいか、それより大きいものを全て無効化したい場合は、下記のように入力して実行します:

# cpupower idle-set -D 80

12.3.3 cpupower によるカーネルとハードウエアの統計情報の表示 Edit source

monitor サブコマンドを使用することで、プロセッサのトポロジ情報を表示することができるほか、特定の時間内における周波数やアイドル状態の統計を表示することができます。既定の間隔は 1 秒ですが、 -i オプションを使用することで自由に変更することができます。また、ツール内ではプロセッサのスリープ (休眠) 状態と周波数のカウンタは独立して実装されています。これらのうちのいくつかはカーネルの統計情報から、残りはハードウエアレジスタから取得しています。利用可能な監視機能は、お使いのハードウエアとシステムによって異なります。利用可能な監視機能を表示したい場合は、 cpupower monitor -l と入力して実行してください。また、各モニタに関する詳細は、 cpupower-monitor のマニュアルページをお読みください。

monitor サブコマンドでは、性能を測定するためのベンチマーク機能にも対応しています。特定の処理におけるハードウエアの統計情報を比較したい場合は、その処理のコマンドを末尾に付けて実行します。たとえば下記のようになります:

cpupower monitor db_test.sh
例 12.3: cpupower monitor の出力例
# cpupower monitor
|Mperf                   || Idle_Stats
 1                         2 
CPU | C0   | Cx   | Freq || POLL | C1   | C2   | C3
   0|  3.71| 96.29|  2833||  0.00|  0.00|  0.02| 96.32
   1| 100.0| -0.00|  2833||  0.00|  0.00|  0.00|  0.00
   2|  9.06| 90.94|  1983||  0.00|  7.69|  6.98| 76.45
   3|  7.43| 92.57|  2039||  0.00|  2.60| 12.62| 77.52

1

Mperf はブーストした周波数を含む、 CPU の平均動作周波数を表示します。これに加えて、 CPU が動作中 ( C0 ) であった割合と、休眠中であった割合 ( Cx ) を、時間比で表示することができます。 Turbo 機能は BIOS で管理されている機能であるため、その場での周波数を取得することができませんが、 Mperf 監視を使用することで、過去にどのような動作状況であったのかを確認することができます。

2

Idle_Stats は cpuidle カーネルサブシステムの統計情報を表示します。カーネルはアイドル状態に入ったり出たりするごとに、それらの値を更新していきます。なお、測定の開始と終了時にはアイドル状態の変化が発生するため、その分だけ値が不正確になることに注意してください。

上述の (一般的な) 監視機能とは別に、アーキテクチャ依存の監視機能も使用することができます。詳しい説明については、 cpupower-monitor のマニュアルページをお読みください。

個別のモニタで出力された値を比較することで関係性や依存性を見つけることができるほか、特定の処理に対してどれだけ省電力機能が正しく働いたのかを確認することもできます。たとえば 例 12.3 では CPU 0 がほぼアイドル状態 (つまり Cx がほぼ 100%) になっていますが、それにも関わらず高い動作周波数になってしまっています。これは CPU 01 が同じ周波数しか設定できないことによるもので、これを依存性と称しています。

12.3.4 cpupower による設定の変更 Edit source

rootcpupower frequency-set コマンドを実行することで、現在の設定を変更することができます。ガバナーが設定する最小/最大 CPU 動作周波数のほか、新しいガバナーを作成することもできます。また -c オプションを指定することで、どのプロセッサに対する設定を変更するのかを指定することもできます。これにより、個別のプロセッサに対して調整を行うことなく、全てのプロセッサに対して一貫したポリシーを適用できるようになっています。詳細と利用可能なオプションについて、詳しくは cpupower-frequency-set のマニュアルページをお読みになるか、 cpupower frequency-set --help と入力して実行してください。

12.4 特殊なチューニングオプション Edit source

下記の章では、主な設定について説明しています。

12.4.1 P-ステート向けのチューニングオプション Edit source

CPUfreq サブシステムでは、 P-ステート向けのチューニングオプションがいくつか提供されています。オプションにはガバナーの切り替えのほか、使用すべき最小/最大の CPU 周波数と、ガバナー別のパラメータの変更などがあります。

ガバナーを変更したい場合は、 cpupower frequency-set コマンドに -g オプションを付けて実行します。たとえば root で下記のように入力して実行すると、 Performance ガバナーに切り替えることができます:

# cpupower frequency-set -g performance

ガバナーが使用すべき最小および最大の CPU 周波数を指定したい場合は、それぞれ -d-u のオプションで設定します。

12.5 トラブルシューティング Edit source

BIOS オプションが有効化されていますか?

C-ステートや P-ステートを使用するには、 BIOS 側での確認が必要です:

  • C-ステートを使用するには、まず CPU C State などのオプションを有効化して、アイドル時の省電力を有効化する必要があります。

  • P-ステートや CPUfreq のガバナーを使用するには、 Processor Performance States などのオプションを設定します。

  • P-ステートや C-ステートが利用可能である場合でも、プラットフォーム側のファームウエアで CPU の動作周波数を管理していることがあります。これは準最適とも呼べる仕組みで、たとえば pcc-cpufreq を読み込むことで、 OS 側からファームウエアにヒントを提示することができます。ファームウエア側ではその情報が無視される場合もあります。このような仕組みは、 BIOS のセットアップで CPU の周波数を "OS Management" などの選択を行うことで、解決できることもあります。 BIOS 側で設定を変更すれば、代替ドライバが使用されるようになりますので、そこから最適化をやり直すことができます。

CPU をアップグレードしているような場合は、 BIOS 側についてもアップグレードを行う必要があることがあります。 BIOS 側でも新しい CPU に対応させる必要があり、周波数の設定などもここから採取することがあるためです。

ログファイル内に何か現れていませんか?

まずは systemd のジャーナル (詳しくは 第11章 「journalctl : systemd ジャーナルへの問い合わせコマンド をお読みください) をお読みのうえ、 CPUfreq サブシステムに関する出力が現れていないかどうかを確認してください。ただし、ここには致命的なエラーのみが記録されます。

お使いのマシンで CPUfreq サブシステムの問題を調査したい場合は、デバッグ出力を有効化して調べる方法があります。デバッグ出力を有効化するには、カーネルのコマンドラインパラメータに cpufreq.debug=7 を指定するか、もしくは下記のコマンドを root で実行します:

# echo 7 > /sys/module/cpufreq/parameters/debug

このコマンドを実行すると、 CPUfreq での状態遷移など、さらに詳しい情報を dmesg に出力するようになります。これを元に調査を行ってください。ただし、かなり広範囲なログの出力を行いますので、明らかに問題があるような場合にのみお使いになることをお勧めします。

12.6 さらなる情報 Edit source

Baseboard Management Controller (BMC) の搭載されたプラットフォームであれば、このサービスプロセッサを通じて様々な電力管理設定にアクセスすることができます。これらの設定は製造元ごとに異なるものであるため、本章では説明していません。詳しくは製造元が提供するマニュアルをお読みください。

12.7 powerTOP による電力消費状況の監視 Edit source

powerTOP は電源消費が大きくなってしまっている理由を探すためのツールです。これは主に、電源消費が重要となるラップトップで有用なツールとなります。このツールは Intel および AMD の各プロセッサに対応しています。インストールを行うには、通常通り下記のようにして行います:

> sudo zypper in powertop

powerTOP は様々な情報源からのデータ (プログラムやデバイスドライバ、カーネルのオプションやスリープ状態の解除を行った割り込みの回数や生成源) を組み合わせて、それらをいくつかの方法で表示することができます。一般的には ncurses セッション内で、対話モードとして起動を行います (詳しくは 図12.1「対話モードでの powerTOP」 をご覧ください):

> sudo powertop
対話モードでの powerTOP
図 12.1: 対話モードでの powerTOP

powerTOP では、レポートを HTML 形式や CSV 形式で出力することができます。下記の例では、 240 秒間の統計情報を 1 つのレポートとして出力しています:

> sudo powertop --iteration=1 --time=240 --html=POWERREPORT.HTML

レポートを複数回に分けて出力させることもできます。下記の例では、 20 秒おきに合計で 10 回レポートを出力しています。なお、それぞれのレポートは別々の HTML レポートとして出力します:

> sudo powertop --iteration=10 --time=20 --html=POWERREPORT.HTML

上記を実行すると、下記のように日時付きのファイル名でレポートが生成されます:

powerreport-20200108-104512.html
powerreport-20200108-104451.html
powerreport-20200108-104431.html
[...]

HTML レポートは 図12.2「HTML での powerTOP レポート」 のような出力になります:

HTML での powerTOP レポート
図 12.2: HTML での powerTOP レポート

HTML レポート内の Tuning タブ、もしくは対話モードでの Tunables タブには、さまざまな電源設定を試すためのコマンドが提供されています。 HTML レポートの場合にはコマンドライン (例: echo '0' > '/proc/sys/kernel/nmi_watchdog') が書かれていますので、これを root のコマンドラインで実行すると、テストを行うことができます。 ncurses モードの場合はコマンドラインではなく、 Good (良い) もしくは Bad (悪い) が書かれた切り替えスイッチになっています。 Good は省電力の観点で適切な設定になっていることを、 Bad は省電力の観点で適切な設定になっていないことをそれぞれ示しています。 powerTOP で全ての省電力設定を適用したい場合は、下記のコマンドを実行します:

> sudo powertop --auto-tune

なお、これらの設定はシステムを再起動すると失われてしまいます。これらの設定を常に適用しておきたい場合は、 sysctludev を使用するか、もしくは systemd を利用して、起動時に必要なコマンドを実行するように設定してください。なお、 powerTOP には /usr/lib/systemd/system/powertop.service というファイルが提供されていて、これを有効化することで、システムの起動時に powerTOP の --auto-tune を自動的に実行することができます:

ExecStart=/usr/sbin/powertop --auto-tune

なお、 systemd のサービスを有効化する場合は、期待通りの結果になるのかをよくご確認ください。たとえば USB キーボードやマウスを接続している場合、これらは省電力モードに設定してもすぐに復帰してしまうため、省電力が適切に働かなくなってしまいます。また、テストや設定の編集を簡単に実施するため、 awk を利用して HTML レポートからコマンドを抽出するとよいでしょう:

> awk -F '</?td ?>' '/tune/ { print $4 }' POWERREPORT.HTML

また、 powerTOP にはキャリブレーション (較正) モードも用意されています。このモードはバックライトや CPU 、 Wi-Fi や USB デバイス、ディスクなどに対して異なる設定を施して、バッテリー消費が最適な状態になるようにします:

> sudo powertop --calibrate

より正確な較正を行うには、ワークロード (負荷) ファイルを作成して呼び出してもかまいません:

> sudo powertop --calibrate --workload=FILENAME --html=POWERREPORT.HTML

さらに詳しい情報を読みたい場合は、それぞれ下記を参照してください:

このページを印刷