35 電源管理 #
IBM Z この章で説明する機能とハードウェアは、IBM Zには存在しないため、この章はこれらのプラットフォームに関係ありません。
電源管理はラップトップコンピュータで特に重要ですが、他のシステムでも役に立ちます。ACPI (Advanced Configuration and Power Interface)は、最近のすべてのコンピュータ(ラップトップ、デスクトップ、サーバ)で使用できます。電源管理テクノロジでは、適切なハードウェアとBIOSルーチンを必要とします。ほとんどのラップトップと多くの新型デスクトップおよびサーバは、これらの必要条件を満たしています。電源の節約や騒音の低減のために、CPU周波数を制御することもできます。
35.1 省電力機能 #
省電力機能はラップトップをモバイル使用する場合に限らず、デスクトップシステムでも重要です。ACPIの主要な機能と、その使用目的は、以下のとおりです。
- スタンバイ
サポートされていません。
- サスペンド(メモリに保存)
このモードでは、システム状態をすべてRAMに書き込みます。その後、RAMを除くシステム全体がスリープします。この状態では、コンピュータの消費電力が小さくなります。この状態の利点は、ブートやアプリケーションの再起動をせずに、数秒でスリープ前の作業をスリープの時点から再開できることです。この機能は、ACPI状態
S3
に対応します。- ハイバーネーション(ディスクに保存)
この動作モードでは、システム状態がすべてハードディスクに書き込まれ、システムの電源がオフになります。すべてのアクティブデータを書き込むには、少なくともRAMの大きさのスワップパーティションが必要です。この状態から再開するには、30~90秒かかります。サスペンド前の状態が復元されます。メーカの中には、このモードを便利なハイブリッド仕様にして提供するものもあります(たとえば、IBM ThinkpadのRediSafe)。対応するACPI状態は、
S4
です。Linux環境では、suspend to diskはACPIから独立したカーネルルーチンにより実行されます。注記:mkswap
でフォーマットするとスワップパーティションのUUIDが変更される可能であれば、
mkswap
で既存のスワップパーティションを再フォーマットしないでください。mkswap
で再フォーマットすると、スワップパーティションのUUIDの値が変更されます。YaSTで再フォーマットするか(/etc/fstab
が更新されます)、/etc/fstab
を手動で調整します。- バッテリモニタ
ACPIは、バッテリをチェックして、充電ステータスに関する情報を提供します。また、システムは、重要な充電ステータスに達した時点で実行するようにアクションを調整します。
- 自動電源オフ
シャットダウンの後、コンピュータの電源が切れます。これは、バッテリが空になる直前に自動シャットダウンが行われる場合に特に重要です。
- プロセッサ速度の制御
CPUとの接続では、次の3つの方法で省エネできます: 周波数と電圧の調節(PowerNow! またはSpeedstep)、スロットリング、およびプロセッサをスリープ状態(C-states)にすること。コンピュータの動作モードによっては、この3つの方法を併用することもできます。
35.2 ACPI (詳細設定と電源インタフェース) #
ACPIは、オペレーティングシステムが個々のハードウェアコンポーネントをセットアップし、制御できるように設計されています。ACPIは、PnP(Power Management Plug and Play)とAPM(Advanced Power Management)の両方に優先します。また、ACPIはバッテリ、ACアダプタ、温度、ファン、および 「close lid 」や 「battery low 」などのシステムイベントに関する情報も提供します。
BIOSには個々のコンポーネントとハードウェアアクセス方法についての情報が入ったテーブルがあります。オペレーティングシステムは、この情報を使用して、割り込みまたはコンポーネントの有効化と無効化などのタスクを実行します。BIOSに格納されているコマンドを、オペレーティングシステムが実行するとき、機能はBIOSの実装方法に依存します。ACPIが検出可能で、ロードできるテーブルは、journaldにレポートされます。ジャーナルログメッセージの表示の詳細については、第21章 「journalctl
: systemd
ジャーナルのクエリ」を参照してください。ACPIに生じた問題のトラブルシューティングについては、35.2.2項 「トラブルシューティング」を参照してください。
35.2.1 CPUパフォーマンスの制御 #
CPUには、3つの省エネ方法があります。
周波数と電圧の調節
クロック周波数のスロットリング(T-states)
プロセッサのスリープ状態への切り替え(C-states)
コンピュータの動作モードによっては、この3つの方法を併用することもできます。また、省電力とは、システムの温度上昇が少なく、ファンが頻繁にアクティブにならないことを意味します。
周波数調節とスロットリングに意味があるのは、プロセッサがビジー状態の場合だけです。これは、プロセッサがアイドル状態のときには、常に、最も経済的なC-stateが適用されるからです。CPUがビジー状態の場合、省電力方式として周波数調節を使用することをお勧めします。通常、プロセッサは部分的な負荷でのみ動作します。この場合は、低周波数で実行できます。カーネルのオンデマンドガバナによって制御される動的な周波数調節が最良のアプローチです。
スロットリングは、システムが高負荷であるにもかかわらずバッテリ使用時間を延長する場合など、最後の手段として使用する必要があります。ただし、スロットリングの割合が高すぎると、スムーズに動作しない特定のシステムがあります。さらに、CPUの負荷が小さければ、CPUスロットリングは無意味です。
詳細については、Chapter 12, Power managementを参照してください。
35.2.2 トラブルシューティング #
問題を2つに大別できます。1つはカーネルのACPIコードに、未検出のバグが存在する可能性があることです。この場合は、いずれ修正プログラムがダウンロードできるようになります。ただし、問題の多くはBIOSが原因になっています。また、場合によっては、他の広く普及しているオペレーティングシステムにACPIを実装した場合にエラーが起きないよう、BIOSにおけるACPIの指定を故意に変えていることがあります。ACPIに実装すると重大なエラーを生じるハードウェアコンポーネントは、ブラックリストに記録され、これらのコンポーネントに対してLinuxカーネルがACPIを使用しないようにします。
問題に遭遇したときに最初に実行することは、BIOSの更新です。コンピュータがブートしない場合、次のブートパラメータは有用です。
- pci=noacpi
PCIデバイスの設定にACPIを使用しません。
- acpi=ht
単純なリソース設定のみを実行します。ACPIを他の目的には使用しません。
- acpi=off
ACPIを無効にします。
特定の新型のコンピュータは(特に、SMPシステムとAMD64システム)、ハードウェアを正しく設定するためにACPIが必要です。これらのコンピュータでACPIを無効にすると、問題が生じます。
コンピュータは時折、USBまたはFireWireを介して接続されたハードウェアと混同されることがあります。コンピュータが起動を拒否した場合、必要のないハードウェアのプラグをすべて外して再試行してください。
システムのブートメッセージを調べてみましょう。そのためには、ブート後にコマンドdmesg
-T
| grep -2i acpi
を使用します(または、問題の原因がACPIだとは限らないので、すべてのメッセージを調べます)。ACPIテーブルの解析時にエラーが発生した場合は、最も重要なテーブルDSDT (Differentiated System Description Table)を改善されたバージョンと置き換えることができます。この場合、BIOSで障害のあるDSDTが無視されます。具体的な手順については35.4項 「トラブルシューティング」を参照してください。
カーネルの設定には、ACPIデバッグメッセージを有効にするスイッチがあります。ACPIデバッグを有効にした状態でカーネルをコンパイルおよびインストールすると、詳細情報が発行されます。
BIOSまたはハードウェアに問題がある場合は、常にメーカに連絡することをお勧めします。特に、Linuxに関するサポートを常に提供していないメーカには、問題を通知する必要があります。なぜなら、メーカは、自社の顧客の無視できない数がLinuxを使用しているとわかってやっと、問題を真剣に受け止めるからです。
35.2.2.1 詳細情報 #
https://tldp.org/HOWTO/ACPI-HOWTO/ (詳細なACPI HOWTO、DSDTパッチが含まれています)
https://uefi.org/specifications (Advanced Configuration and Power Interface: 詳細設定と電源インタフェース)
35.3 ハードディスクの休止 #
Linux環境では、不要な場合にハードディスクを完全にスリープ状態にしたり、より経済的な静止モードで動作さることができます。最近のラップトップの場合、ハードディスクを手動でオフに切り替える必要はありません。不要な場合は自動的に経済的な動作モードになります。ただし、最大限に省電力したい場合は、次の方法をhdparm
コマンドでテストしてください。
このコマンドを使用すると、ハードディスク設定を変更できます。-y
オプションは、簡単にハードディスクをスタンバイモードに切り替えます。-Y
を指定すると、スリープ状態になります。hdparm
-S
Xを使用すると、一定時間アクティビティがなければハードディスクが回転を停止します。Xは、次のように置換します: 。0
を指定するとこの機構が無効になり、ハードディスクは常時稼働します。1
から240
までの値を指定すると、指定した値x 5秒が設定値になります。241
から251
は、30分の1倍から11倍(30分から5.5時間)に相当します。
ハードディスクの内部省電力オプションは、オプション-B
で制御できます。0
(最大限の省電力)~255
(最大限のスループット)の値を選択します。結果は使用するハードディスクに応じて異なり、査定するのは困難です。ハードディスクを静止状態に近づけるにはオプション-M
を使用します。128
(静止)~254
(高速)の値を選択します。
ハードディスクをスリープにするのは、多くの場合簡単ではありません。Linuxでは、複数のプロセスがハードディスクに書き込むので、ウェイクアップが常に繰り返されています。したがって、ハードディスクに書き込むデータを、Linuxがどのように処理するかを理解することは重要です。はじめに、すべてのデータがRAMにバッファされます。このバッファは、pdflush
デーモンによって監視されます。データが一定の寿命に達するか、バッファがある程度一杯になると、バッファの内容がハードディスクにフラッシュされます。バッファサイズはダイナミックであり、メモリサイズとシステム負荷に対応して変化します。デフォルトでは、データの完全性を最大まで高めるように、pdflushの間隔が短く設定されています。pdflushデーモンはバッファを5秒おきにチェックし、データをハードディスクに書き込みます。次の変数が使用できます。
/proc/sys/vm/dirty_writeback_centisecs
pdflushスレッドが起動するまでの遅延(100分の1秒台)を含みます。
/proc/sys/vm/dirty_expire_centisecs
ダーティページが次に最新の変更を書き込まれるまでの時間枠を定義します。デフォルト値は
3000
(つまり 30秒)です。/proc/sys/vm/dirty_background_ratio
pdflushが書き込みを始めるまでのダーティページの最大割合。デフォルトは
5
パーセントです。/proc/sys/vm/dirty_ratio
メモリ全体の中でダーティページの割合がこの値を超えると、プロセスは書き込みを続けずに、短時間でダーティバッファを書き込むように強制されます。
pdflush
デーモンの設定を変更すると、データの完全性が損なわれる可能性があります。
これらのプロセスとは別に、Btrfs
、Ext3
、Ext4
などのジャーナリングファイルシステムは、それらが持つメタデータをpdflush
とは無関係に書き込むので、ハードディスクがスピンダウンしなくなります。
もう1つの重要な要因は、アクティブプログラムが動作する方法です。たとえば、優れたエディタは、変更中のファイルを定期的にハードディスクに自動バックアップし、これによってディスクがウェイクアップされます。データの完全性を犠牲にすれば、このような機能を無効にできます。
この接続では、メールデーモンpostfixが変数 POSTFIX_LAPTOP
を使用します。この変数をyes
に設定すると、postfixがハードディスクにアクセスする頻度は大幅に減少します。
35.4 トラブルシューティング #
すべてのエラーメッセージとアラートは、journalctl
コマンドで問い合わせ可能なシステムジャーナルに記録されます(詳細については、第21章 「journalctl
: systemd
ジャーナルのクエリ」を参照してください)。以下のセクションでは、最も頻繁に起こる問題について解説します。
35.4.1 CPU周波数調節が機能しない #
カーネルのソースを参照して、ご使用のプロセッサがサポートされているか確認してください。CPU周波数制御を有効にするには特別なカーネルモジュールまたはモジュールオプションが必要になる場合があります。kernel-source
パッケージがインストールされている場合は、この情報を/usr/src/linux/Documentation/cpu-freq/*
で入手できます。