第18章 電源管理

目次

18.1. 省電力機能
18.2. ACIP(詳細設定と電源インタフェース)
18.3. ハードディスクの休止
18.4. トラブルシューティング
18.5. 詳細情報

電源管理はラップトップコンピュータで特に重要ですが、他のシステムでも役に立ちます。ACPI(Advanced Configuration and Power Interface)は、最近のすべてのコンピュータ(ラップトップ、デスクトップ、サーバ)で使用できます。電源管理テクノロジでは、適切なハードウェアとBIOSルーチンを必要とします。ほとんどのラップトップと多くの新型デスクトップおよびサーバは、これらの必要条件を満たしています。電源の節約や騒音の低減のために、CPU周波数を制御することもできます。

18.1. 省電力機能

省電力機能はラップトップをモバイル使用する場合に限らず、デスクトップシステムでも重要です。ACPIの主要な機能と、その使用目的は、以下のとおりです。

スタンバイ

サポートされていない。

サスペンド(メモリに保存)

このモードでは、システム状態をすべてRAMに書き込みます。その後、RAMを除くシステム全体がスリープします。この状態では、コンピュータの消費電力が非常に小さくなります。この状態の利点は、ブートやアプリケーションの再起動をせずに、数秒でスリープ前の作業をスリープの時点から再開できることです。この機能は、ACPI状態S3に対応します。この状態のサポートはまだ開発中なので、ハードウェアに大幅に依存します。

ハイバーネーション(ディスクに保存)

この動作モードでは、システム状態がすべてハードディスクに書き込まれ、システムの電源がオフになります。すべてのアクティブデータを書き込むには、少なくともRAMの大きさのスワップパーティションが必要です。この状態から再開するには、30~90秒かかります。サスペンド前の状態が復元されます。メーカの中には、このモードを便利なハイブリッド仕様にして提供するものもあります(たとえば、IBM ThinkpadのRediSafe)。対応するACPI状態は、S4です。Linux環境では、suspend to diskはACPIから独立したカーネルルーチンにより実行されます。

バッテリモニタ

ACPIは、バッテリをチェックして、充電ステータスに関する情報を提供します。また、システムは、重要な充電ステータスに達した時点で実行するようにアクションを調整します。

自動電源オフ

シャットダウンの後、コンピュータの電源が切れます。これは、バッテリが空になる直前に自動シャットダウンが行われる場合に特に重要です。

プロセッサ速度の制御

CPUとの接続では、次の3つの方法で省エネできます: 周波数と電圧の調節(PowerNow!またはSpeedstep)、スロットリング、およびプロセッサをスリープ状態(C-states)にすること。コンピュータの動作モードによっては、この3つの方法を併用することもできます。

18.2. ACIP(詳細設定と電源インタフェース)

ACPIは、オペレーティングシステムが個々のハードウェアコンポーネントをセットアップし、制御できるように設計されています。ACPIは、PnP(Power Management Plug and Play)とAPM(Advanced Power Management)の両方に優先します。また、ACPIはバッテリ、ACアダプタ、温度、ファン、および close lid battery low などのシステムイベントに関する情報も提供します。

BIOSには個々のコンポーネントとハードウェアアクセス方法についての情報が入ったテーブルがあります。オペレーティングシステムは、この情報を使用して、割り込みまたはコンポーネントの有効化と無効化などのタスクを実行します。BIOSに格納されているコマンドを、オペレーティングシステムが実行するとき、機能はBIOSの実装方法に依存します。ACPIが検出可能で、ロードできるテーブルは、/var/log/boot.msgにレポートされます。ACPIに生じた問題のトラブルシューティングについては、18.2.3項 「トラブルシューティング」を参照してください。

18.2.1. CPUパフォーマンスの制御

CPUには、3つの省エネ方法があります。

コンピュータの動作モードによっては、この3つの方法を併用することもできます。また、省電力とは、システムの温度上昇が少なく、ファンが頻繁にアクティブにならないことを意味します。

周波数調節とスロットリングに意味があるのは、プロセッサがビジー状態の場合だけです。これは、プロセッサがアイドル状態のときには、常に、最も経済的なC-stateが適用されるからです。CPUがビジー状態の場合、省電力方式として周波数調節を使用することをお勧めします。通常、プロセッサは部分的な負荷でのみ動作します。この場合は、低周波数で実行できます。通常、カーネルのオンデマンドガバナによって動的に制御される動的な周波数調節が最良のアプローチです。

スロットリングは、システムが高負荷であるにもかかわらずバッテリ使用時間を延長する場合など、最後の手段として使用する必要があります。ただし、スロットリングの割合が高すぎると、スムーズに動作しないシステムがあります。さらに、CPUの負荷が小さければ、CPUスロットリングは無意味です。

18.2.1.1. 周波数と電圧の調節

PowerNow!Speedstepは、AMD社とIntel社が使用するこのテクノロジの名称です。ただし、このテクノロジは他のメーカのプロセッサにも適用されます。CPUのクロック周波数とそのコア電圧が同時に低下し、段階的な省エネよりも大きな効果が得られます。つまり、周波数が半分になると(半分のパフォーマンス)、消費電力も半分以下になります。このテクノロジは、ACPIには依存していません。

CPU周波数の調節には、カーネル自体(カーネル内ガバナを含むCPUfreqインフラストラクチャ )による実行と、ユーザスペースによる実行という2つの主要アプローチがあります。カーネル内ガバナは、さまざまな基準(一種の事前設定されたCPU電力スキーマ)に基づいてCPU周波数を変更できるポリシーガバナです。CPUfreqサブシステムでは、次のガバナを使用できます。

パフォーマンスガバナ

CPU周波数をできるだけ高く静的に設定して、パフォーマンスの最大化を図ります。したがって、節電が、このガバナーの重点ではありません。

省電力ガバナ

CPU周波数をできるだけ低く静的に設定します。このガバナを使用すると、プロセッサがどのくらいビジーになっても、システム周波数はこれ以上にならないので、パフォーマンスがひどく損なわれることがあります。

オンデマンドガバナ

動的なCPU周波数ポリシー: ガバナはプロセッサの使用率をモニタします。ガバナは、使用率が一定のしきい値を越えると、周波数を可能な最大限度に設定します。使用率がしきい値より低い場合は、2番目に低い周波数が使用されます。さらに使用率が低い状態が続くと、周波数は再度引き下げられ、可能な最低周波数に設定されます。

保守的ガバナ

オンデマンドガバナと同様に、このガバナも、プロセッサの使用率に基づいて周波数を調節します。ただし、このガバナではより漸進的に電力を増加できます。このガバナは、プロセッサ使用率が一定のしきい値を超えると、ただちに可能な最高の周波数に切り替える(オンデマンドガバナの場合)ことはせず、2番目に高い周波数に切り替えます。

カーネルガバナに関するファイルは、/sys/devices/system/cpu/cpu*/cpufreq/に格納されています。コンピュータに複数のCPUがある場合は、/sys/devices/system/cpu/の下に、各プロセッサのサブディレクトリが保持されます(cpu0cpu1など)。現在、オンデマンドガバナまたは保守的ガバナを使用している場合は、cpufreq内に、それらのガバナのパラメータを含む別個のサブディレクトリが存在しています。

18.2.1.2. クロック周波数のスロットリング(T-states)

このテクノロジでは、CPUのクロック信号インパルスが一定割合だけ省略されます。25%のスロットリングでは、4回に1回の割合でインパルスが省略されます。87.5%では、プロセッサにインパルスが届くのは8回に1回だけになります。ただし、省エネ度が減速の割合に比例して増えることはありません。通常、スロットリングが使用されるのは、周波数調節を使用できない場合、または省電力を最大限に使用する場合だけです。この技術も、特別なプロセスで制御する必要があります。プロセッサのT-states(Throttling States)のシステムインタフェースは、/proc/acpi/processor/*/throttlingです。

18.2.1.3. プロセッサのスリープ状態への切り替え(C-states)

最近のプロセッサには、C-statesと呼ばれるいくつかの省電力モードがあります。これらは、使用されていないコンポーネントをオフにして電力を節約するアイドルプロセッサの機能を反映するモードです。オペレーティングシステムは、活動していないプロセッサを常にスリープ状態にします。この場合、オペレーティングシステムはCPUにhaltコマンドを送信します。次の3つのアイドル状態があります: C1C2、およびC3。最も経済的な状態C3では、プロセッサキャッシュとメインメモリとの同期も停止します。そのため、この状態を適用できるのは、バスマスタアクティビティを介してメインメモリの内容を変更している他のデバイスが存在しない場合だけです。一部のドライバは、C3の使用を阻止します。現在の状態は、/proc/acpi/processor/*/powerに表示されます。

詳細については、「C-States (Processor Operating States)」 (第11章 Power Management, ↑System Analysis and Tuning Guide (システム分析およびチューニングガイド))を参照してください。

18.2.2. ツール

CPUfreqサブシステムの現在の設定を表示または調節するには、そのためにcpufrequtilsによって提供されているツールを使用します。cpufrequtilsパッケージをインストールしたら、cpufreq-infoを使用して、CPUfreqのカーネル情報を取得してください。cpufreq-setコマンドを使用すると、CPUfreqの設定を変更できます。たとえば、次のコマンドをrootとして実行して、実行時にオンデマンドガバナをアクティブにします。

cpufreq-set -g ondemand

詳細情報と使用可能なオプションについては、cpufreq-infocpufreq-setのマニュアルページを参照するか、cpufreq-info --helpまたはcpufreq-set --helpをそれぞれ実行じてください。

総合的ニ呼べるACPIユーティリティには、バッテリ充電レベルや温度などの情報を\'95\'5c示するだけのツール(acpi、klaptopdaemon、など)、 /proc/acpi 内の\'8d\'5c造へのアクセスを容易にするツール、変化の監視を補助するツール(akpi、acpiw、gtkacpiw)、BIOS内のACPIテーブルを編集するためのツール(パッケージ pmtools )などが含まれています。

18.2.3. トラブルシューティング

問題を2つに大別できます。1つはカーネルのACPIコードに、未検出のバグが存在する可能性があることです。この場合は、いずれ修正プログラムがダウンロードできるようになります。ただし、問題の多くはBIOSが原因になっています。また、場合によっては、他の広く普及しているオペレーティングシステムにACPIを実装した場合にエラーが起きないよう、BIOSにおけるACPIの指定を故意に変えていることがあります。ACPIに実装すると重大なエラーを生じるハードウェアコンポーネントは、ブラックリストに記録され、これらのコンポーネントに対してLinuxカーネルがACPIを使用しないようにします。

問題に遭遇したときに最初に実行することは、BIOSの更新です。コンピュータがまったくブートしない場合、次のブートパラメータは有用です。

pci=noacpi

PCIデバイスの設定にACPIを使用しません。

acpi=ht

単純なリソース設定のみを実行します。ACPIを他の目的には使用しません。

acpi=off

ACPIを無効にします。

[Warning]ACPIなしに起動できない場合

一部の新型のコンピュータは(特に、SMPシステムとAMD64システム)、ハードウェアを正しく設定するためにACPIが必要です。これらのコンピュータでACPIを無効にすると、問題が生じます。

コンピュータは時折、USBまたはFireWireを介して接続されたハードウェアと混同されることがあります。コンピュータが起動を拒否した場合、必要のないハードウェアのプラグをすべてはずして再試行してください。

システムのブートメッセージを調べてみましょう。そのためには、ブート後にコマンドdmesg | grep -2i acpiを使用します(または、問題の原因がACPIだとは限らないので、すべてのメッセージを調べます)。ACPIテーブルの解析時にエラーが発生した場合は、最も重要なテーブルDSDT(Differentiaed System Description Table)を改善されたバージョンと置き換えることができます。この場合、BIOSで障害のあるDSDTが無視されます。具体的な手順については18.4項 「トラブルシューティング」を参照してください。

カーネルの設定には、ACPIデバッグメッセージを有効にするスイッチがあります。ACPIデバッグを有効にした状態でカーネルをコンパイルし、インストールすると、詳細な情報を表示するエラーのエキスパート検索がサポートできるようになります。

BIOSまたはハードウェアに問題がある場合は、常にメーカに連絡することをお勧めします。特に、Linuxに関するサポートを常に提供していないメーカには、問題を通知する必要があります。なぜなら、メーカは、自社の顧客の無視できない数がLinuxを使用しているとわかってやっと、問題を真剣に受け止めるからです。

18.2.3.1. 詳細情報

18.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

メモリ全体の中でダーティページの割合がこの値を超えると、プロセスは書き込みを続けずに、短時間でダーティバッファを書き込むように強制されます。

[Warning]データの完全性に関する障害

pdflushデーモンの設定を変更すると、データの完全性が損なわれる可能性があります。

これらのプロセスとは別に、ReiserFSExt3Ext4などのジャーナリングファイルシステムは、それらが持つメタデータをpdflushとは無関係に書き込むので、ハードディスクがスピンダウンしなくなります。モバイル機器では、これを避けるために特別なカーネル拡張が開発されています。その拡張を利用するには、laptop-mode-toolsパッケージをインストールし、詳細について、/usr/src/linux/Documentation/laptops/laptop-mode.txtを参照してください。

もう1つの重要な要因は、アクティブプログラムが動作する方法です。たとえば、優れたエディタは、変更中のファイルを定期的にハードディスクに自動バックアップし、これによってディスクがウェイクアップされます。データの完全性を犠牲にすれば、このような機能を無効にできます。

この接続では、メールデーモンpostfixが変数POSTFIX_LAPTOPを使用します。この変数をyesに設定すると、postfixがハードディスクにアクセスする頻度は大幅に減少します。

SUSE Linux Enterprise Desktopでは、これらのテクノロジはlaptop-mode-toolsで制御されます。

18.4. トラブルシューティング

すべてのエラーメッセージおよびアラートはファイル/var/log/messagesに記録されます。以下のセクションでは、最も頻繁に起こる問題について解説します。

18.4.1. ACPIはハードウェアサポートで有効になっていますが、各機能を使用できません。

ACPIに問題がある場合は、dmesg|grep -i acpiコマンドを使用して、dmesgの出力を調べ、ACPI固有のメッセージを検索します。

問題を解決するためにBIOSのアップデートが必要になる場合があります。ラップトップメーカのホームページにアクセスし、BIOSの更新バージョンを検索してインストールします。メーカに最新のACPI仕様に準拠していることを確認してください。BIOSの更新後もエラーが継続する場合は、以下の手順に従い、BIOS内で問題が発生しているDSDTテーブルを更新されたDSDTに置き換えます。

手順18.1 BIOSでのDSDTテーブルの更新

以下の手順の場合、次のパッケージがインストールされていることを確認してください: kernel-sourceacpica、およびmkinitrd

  1. http://acpi.sourceforge.net/dsdt/index.phpからシステムに適したDSDTをダウンロードします。以下に示すようにファイルを解凍し、コンパイル後ファイル拡張子が.aml (ACPI machine language)になっていることを確認します。拡張子が.amlの場合はステップ3に進みます。

  2. ダウンロードしたテーブルのファイル拡張子が.asl (ACPI source language)である場合は、次のコマンドを実行してファイルをコンパイルします。

    iasl -sa file.asl
  3. (結果の)ファイルDSDT.amlを任意の場所(/etc/DSDT.amlを推奨)にコピーします。

  4. /etc/sysconfig/kernelを編集し、DSDTファイルに応じてパスを変更します。

  5. mkinitrdを起動します。カーネルをインストールし、mkinitrdを使用してinitrdファイルを作成するたびに、システムのブート時に、変更されたDSDTが組み込まれ、ロードされます。

18.4.2. CPU周波数調節が機能しません。

カーネルのソースを参照して、ご使用のプロセッサがサポートされているか確認してください。CPU周波数制御を有効にするには特別なカーネルモジュールまたはモジュールオプションが必要になる場合があります。kernel-sourceパッケージがインストールされている場合は、この情報を/usr/src/linux/Documentation/cpu-freq/*で入手できます。

18.4.3. サスペンドとスタンバイが機能しません。

ACPIシステムでは問題のあるDSDTを実装していることにより(BIOS)、サスペンドとスタンバイに関する問題が発生する可能性があります。そのような場合は、BIOSをアップデートしてください。

システムが不具合のあるモジュールをアンロードしようとすると、システムは停止するか、またはサスペンドイベントがトリガされません。また、サスペンドに入らない原因となるモジュールをアンロードしない、またはそうしたサービスを停止しない場合、同様の状態に陥る可能性があります。どちらの場合でも、スリープモードに入らない原因となっている障害モジュールを識別してください。ログファイル/var/log/pm-suspend.logには、エラーのの内容と場所に関する詳細情報が含まれます。/usr/lib/pm-utils/defaultsSUSPEND_MODULES変数を変更し、サスペンドまたはスタンバイがトリガされる前に問題のあるモジュールをアンロードします。

http://old-en.opensuse.org/Pm-utilsおよびhttp://en.opensuse.org/SDB:Suspend_to_RAMで、サスペンドを変更してプロセスを再開する方法についての詳細情報を参照してください。

18.5. 詳細情報