第31章 電源管理

目次

31.1. 省電力機能
31.2. Advanced Configuration and Power Interface (ACPI)
31.3. ハードディスクの休止
31.4. トラブルシューティング
31.5. さらなる情報

電源管理は特にラップトップ型のコンピュータでは重要な機能ですが、他のコンピュータで あっても便利な仕組みです。その電源管理技術の 1 つである ACPI (Advanced Configuration and Power Interface) は、新しい製品であれば全てのもの (ラップトップ、デスクトップ、 サーバ) に搭載されています。電源管理技術には適切なハードウエア構成と BIOS ルーチンが 必要ですが、ほとんどのラップトップと多くの新しいデスクトップやサーバに搭載されて います。また電源管理技術では、 CPU の周波数を制御することで省電力を実現したり、 動作音を低減したりすることもできます。

31.1. 省電力機能

省電力の機能はラップトップ型コンピュータのモバイル使用に限らず、デスクトップシステム においても効果を発揮します。 ACPI での主な機能と用途は下記の通りです:

スタンバイ

未対応です。

サスペンド (メモリへの)

このモードでは、システム全体の状態を RAM に書き込みます。その後、 RAM を 除く全てのシステムはスリープ状態に入ります。この状態により、システム全体の 消費電力をとても抑えることができます。この状態の利点は数秒程度でスリープ 前の作業を再開できるという点にあり、アプリケーションの起動や再起動が不要 です。この機能は ACPI の S3 ステートと呼ばれる機能に 対応しています。この状態のサポートは現在開発中の段階で、ハードウエア側に 大きく依存した作りになっています。

ハイバネーション (ディスクへのサスペンド)

このモードでは、システム全体の状態がハードディスクに書き込まれ、システムの 電源が落とされます。このモードでは、最低でも RAM と同容量のサイズをスワップ パーティションに用意して、システム全体の状態を書き込むことができるように しなければなりません。この状態からの復帰には 30 秒から 90 秒程度の時間が 必要で、この復帰処理が完了すると元の状態に戻すことができます。製造元に よっては、このモードを組み合わせた機能、たとえば IBM Thinkpad では RediSafe と呼ばれるような機能が用意されている場合もあります。この機能は ACPI の S4 ステートと呼ばれる機能に対応しています。 Linux ではディスクへのサスペンドはカーネルルーチンが実施する仕組みに なっており、 ACPI とは別途の実装になっています。

バッテリーモニタ

ACPI はバッテリーの充電状態をチェックし、その情報を提供します。また、 残り容量が限界に達した場合の処理を行なうこともできます。

自動電源 OFF

シャットダウンに続いてコンピュータの電源を切ることができる機能です。これは 特に、バッテリーの容量が完全になくなる前に自動でシャットダウンを行なうような 場合に重要です。

プロセッサの速度制御

CPU については、 3 種類の異なる方法で省電力を実現することができます: 周波数と電圧の制御 (PowerNow!Speedstep として知られているもの), プロセッサに対する減速指定, スリープの指定 (C-ステート) があります。 コンピュータの動作モードによって、これらの方法を組み合わせることもできます。

31.2. Advanced Configuration and Power Interface (ACPI)

ACPI はオペレーティングシステムに対して個別のハードウエアコンポーネントを 設定し制御できるようにした仕組みです。また、 ACPI は Plug and Play (PnP) と Advanced Power Management (APM) に取って代わるもので、バッテリーや AC 電源、温度、冷却ファン、 ノート PC の蓋を閉じた 情報や バッテリーの残り容量が少ない など、システムイベント情報を 配信することができます。

BIOS では、個別のコンポーネントやハードウエアへのアクセス方法に関する情報を 含んだ一覧表を提供しています。オペレーティングシステムは、この情報を利用して 割り込みの割り当てやコンポーネントの有効化/無効化を設定します。 ACPI では オペレーティングシステムが BIOS 内に保存してあるコマンドを実行するため、 ACPI の機能は BIOS の実装に依存することになります。 ACPI が検出したり 読み込んだりすることができる表については、 /var/log/boot.msg にレポートが書き込まれます。 また、 ACPI の問題に対してトラブルシューティングを行なうには、 31.2.3項 「トラブルシューティング」 をお読みください。

31.2.1. CPU 性能の制御

CPU の省電力制御には 3 種類の方法があります:

コンピュータの動作モードにも依存しますが、これらの方法は組み合わせて使用する ことができます。また、省電力によってシステムの発熱を抑え、頻繁に冷却ファンが 動作したりしないようにする効果もあります。

周波数の制御と減速は、プロセッサが何も作業を行なっていない場合には最も経済的な C-ステートが適用されるため、何らかの作業を行なっている場合にのみ効果があります。 CPU が何らかの作業を行なっている場合は、省電力の実現にあたっては周波数の制御が お勧めです。プロセッサに対しては間欠的な負荷が与えられることがしばしばあるため、 周波数を下げることができるという仕組みです。通常、動的な周波数制御はオンデマンド の制御方法でカーネルが行なうのがベストです。

周波数の減速は、高い負荷にもかかわらずバッテリーの動作時間を延ばしたい場合などの 最終手段として利用すべきものです。しかしながら、システムによっては減速時に滑らか に動作しないこともあります。また、 CPU の減速は CPU が遅すぎる場合には意味を なさなくなります。

31.2.1.1. 周波数と電圧の制御

PowerNow!Speedstep は、それぞれ AMD や Intel が設計した 技術です。しかしながら、この技術は他の製造元のプロセッサに対しても適用される 場合があります。また CPU の周波数とコア電圧は同時に削減する場合があり、これに よって比例以上の省電力効果があります。たとえば周波数を半分に (性能も半分に) した場合、電力は半分以上に削減することができます。この技術は ACPI とは独立して いるものです。

CPU の周波数制御には、主に 2 つのアプローチ方法があります。カーネル自身が 行なう方法 (カーネル内のガバナー (調整器) と呼ばれるものを利用した CPUfreq インフラストラクチャ) と、ユーザスペース内で動作する アプリケーションから行なう方法です。カーネル内のガバナーはポリシーをベース にした仕組みで、それぞれ異なる尺度 (CPU に対し、事前に設定された電源管理) で CPU の周波数を制御します。 CPUfreq サブシステムでは、下記に示す ガバナーを利用することができます:

パフォーマンスガバナー (performance)

CPU の周波数を利用可能な最大値に固定します。そのため、省電力は 考慮されなくなります。

省電力ガバナー (powersave)

CPU の周波数を利用可能な最小値に固定します。これにより性能面で大きな影響 があり、いくらプロセッサの負荷が高くても周波数が上がらなくなります。

オンデマンドガバナー (ondemand)

動的な周波数制御のカーネル実装です: このガバナーではプロセッサの使用率を 監視し、特定の閾値を超過するとすぐに周波数を利用可能な最大値に設定します。 使用率が特定の閾値を下回ると、次に利用可能な小さい値に設定します。 さらにシステムでの使用率が閾値を下回る場合は、さらに利用可能な小さい値に 調整します。

保守ガバナー (conservative)

オンデマンドの実装に似ている実装で、このガバナーでもプロセッサの使用率に 応じて周波数を調整します。ただしこのガバナーではよりゆっくりした調整を 行ないます。プロセッサの使用率が特定の閾値を超える場合、ガバナーはすぐに 利用可能な最大値に設定したりすることはなく (この点がオンデマンドと異なる 点です) 、次に利用可能な高い値を設定します。

カーネルが提供するガバナーは、 /sys/devices/system/cpu/cpu*/cpufreq/ 以下の ファイルを閲覧することで確認できます。お使いのマシンに複数のプロセッサが 搭載されている場合、 /sys/devices/system/cpu/ には各プロセッサに対するサブディレクトリが存在するはずです (たとえば cpu0, cpu1 など) 。 また、お使いのシステムがオンデマンドまたは保守ガバナーを使用している 場合、 cpufreq 内にはガバナーのサブディレクトリが 作成され、ガバナーのパラメータが現われます。

31.2.1.2. Throttling the Clock Frequency (T-states)

This technology omits a certain percentage of the clock signal impulses for the CPU. At 25% throttling, every fourth impulse is omitted. At 87.5%, only every eighth impulse reaches the processor. However, the energy savings are a little less than linear. Normally, throttling is only used if frequency scaling is not available or to maximize power savings. This technology must be controlled by a special process, as well. The system interface for Processor Throttling States (T-states) is /proc/acpi/processor/*/throttling.

31.2.1.3. Putting the Processor to Sleep (C-states)

Modern processors have several power saving modes called C-states. They reflect the capability of an idle processor to turn off unused components in order to save power. The operating system puts the processor to sleep whenever there is no activity. In this case, the operating system sends the CPU a halt command. There are three idle states: C1, C2, and C3. In the most economic state, C3, even the synchronization of the processor cache with the main memory is halted. Therefore, this state can only be applied if no other device modifies the contents of the main memory via bus master activity. Some drivers prevent the use of C3. The current state is displayed in /proc/acpi/processor/*/power.

31.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 を実行してヘルプをお読みください。

システムでの電源消費を監視するのに便利なツールとして、 powerTOP というものが あります。 powertop パッケージを インストールすると、不用意に高い電力消費をもたらしている原因を調査することが できるようになる (たとえばプロセッサをアイドル状態から起こしている主な プロセスなど) ほか、このような問題を回避するためにシステムを最適化することも できるようになっています。このパッケージは Intel および AMD の両プロセッサに 対応しています。詳しくは powerTOP のプロジェクトページ http://www.lesswatts.org/projects/powertop/ をご覧ください。

上記のツールとは別に、下記のような ACPI ユーティリティを利用することもできます:

  • ただ単にバッテリーの充電レベルや温度を表示したりしたい場合であれば、 acpi コマンドをお使いください。 利用可能なオプションの一覧は acpi --help を実行することで 表示することができます。

  • BIOS 内の ACPI テーブルを編集するには、 acpica パッケージをインストールしてください。

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

電源管理周りの問題としては、 2 種類のものが考えられます。 1 つはカーネル側の ACPI コードにバグが存在していて、正しく認識されない問題です。この場合、解決 方法をダウンロードとして提供することができます。また、場合によっては BIOS 側 の原因で発生する場合もあります。また、他のよく使われているオペレーティング システムでエラーが発生しないようにするため、わざと BIOS 側の実装を ACPI 仕様から 逸脱させてエラーを回避している場合もあります。それ以外にも、 ACPI 実装に深刻な エラーが存在するようなハードウエアコンポーネントは、 Linux カーネル側で ブラックリストとして ACPI が動作しないようにもしています。

問題を発見したときに最初にやるべきことは、 BIOS を新しいものに更新することです。 それでも全く起動できない場合は、下記の起動パラメータを設定することで回避できる 場合があります:

pci=noacpi

PCI デバイスの設定について ACPI を使用しないようにします。

acpi=ht

シンプルなリソース設定だけを行ない、その他の目的では ACPI を 使用しないようにします。

acpi=off

ACPI を無効に設定します。

[Warning]ACPI 無しでの起動問題

新しいマシン (特にマルチプロセッサシステムや AMD 64 システム) によっては、 ハードウエアを正しく設定するのに ACPI が必要である場合があります。 このような場合は、 ACPI を無効に設定すると何らかの問題が発生します。

また、 USB や FireWire のハードウエアが接続されているマシンでは、マシン側が 混乱してうまく起動しない場合があります。うまく起動できない場合は、不要な ハードウエアを全て取り外してから再度起動を行なってみてください。

起動後は、 dmesg | grep -2i acpi コマンドを利用して起動メッセージを確認してください。 ACPI 以外の原因で発生して いる場合も考えられますので、メッセージ全てを確認してもかまいません。 ACPI テーブルを処理する際にエラーが発生した場合は、最も重要な DSDT (Differentiated System Description Table) テーブルを 改善版に置き換えることができます。これを行なうことで、問題のある BIOS 側の DSDT を無視することができます。手順については 31.4.1項 「ハードウエア側で ACPI が有効化されているのにうまく動作しない場合」 をお読みください。

カーネルの設定では、 ACPI デバッグメッセージを有効化するためのスイッチが存在 しています。カーネル側の ACPI デバッグ機能がコンパイルされていてインストール されている場合は、知識のあるユーザがエラーの原因を探るための情報を得ることが できます。

BIOS やハードウエアの問題に直面した場合は、製造元に尋ねるのがお勧めです。 特に製造元が Linux に対する支援を提供しない場合は、彼らにその問題点を提示して 解決してもらう必要があります。製造元は、 Linux を使用するユーザがある程度の 数以上存在すれば、その問題を深刻なものとしてとらえることでしょう。

31.2.3.1. さらなる情報

31.3. ハードディスクの休止

Linux では、不要であればハードディスクを完全にスリープ状態に移行させることも できるほか、省電力や静音モードに移行させることもできます。新しいラップトップ であれば、不要な時に自動で省電力や静音のモードに切り替わるため、ハードディスクの 電源を手作業で切ったりする必要はありません。しかしながら、最大限の省電力を実現 したい場合は、 hdparm コマンドを利用する下記の方法を試してみる ことをお勧めします。

このコマンドは様々なハードディスクの設定を行なうことができます。たとえば -y オプションを指定すると、 指定したハードディスクをすぐにスタンバイモードに移行することができます。 また、 -Y オプションではスリープ状態に移行することができます。 それ以外にも、 hdparm -S x コマンドでは、 一定時間の無動作でディスクの回転を止める設定を行なうことができます。 x の値はそれぞれ下記のように設定してください: 0 を設定すると機能を無効にし、常に回転し続けるようになります。 1 から 240 の値を指定すると、それぞれ 5 を掛けた値の秒数を指定したことになります。また、 241 から 251 の値を指定すると、それぞれ 30 分を単位として 1 から 11 倍の 時間を指定したことになります。

ハードディスク内部の省電力オプションを制御するには、 -B オプションを設定します。 0 から 255 までの値を設定し、小さければ小さいほど省電力を設定し、大きければ大きいほど性能を 上げる指定になります。この値は使用するハードディスクに依存するため、具体的に どれだけの省電力になるのかは不明です。ハードディスクの動作音を低くしたい場合は、 -M を設定してください。それぞれ 128 から 254 までの値で設定します。小さい値ほど静かになります。

ハードディスクをスリープ状態に移行させるのは簡単ではありません。 Linux では 様々なプロセスがハードディスクへの書き込みを行なうため、スリープを設定したと しても頻繁にスリープを解除させられる結果になります。そのため、 Linux が ハードディスクに書き込む必要のあるデータをどのように取り扱うのかについては、 知っておくことが重要です。何よりもまず、全てのデータは RAM 内にあるバッファ に保存されます。このバッファは pdflush デーモンが監視し、データが 置かれてから一定の時間が経過するか、もしくは一定量まで使用されると、バッファの 中身がハードディスクに書き込まれます。バッファサイズは動的に変化し、搭載されている メモリ量とシステムの負荷に依存して変動します。既定では pdflush は最大限の 整合性保持のため、短い時間間隔に設定されています。既定では、 5 秒おきに バッファが確認され、ハードディスクにデータが書き込まれます。それぞれ下記の 値で調整することができます:

/proc/sys/vm/dirty_writeback_centisecs

pdflush のスレッドが起動するまでの遅延時間 (1/100 秒単位)

/proc/sys/vm/dirty_expire_centisecs

ディスクに書き込むべきデータについて、メモリ上に待機させる時間を 指定します。既定は 3000 で、 30 秒を意味します。

/proc/sys/vm/dirty_background_ratio

pdflush がディスクに書き込むべきデータをメモリ上に保持する最大 割合を指定します。既定値は 5% です。

/proc/sys/vm/dirty_ratio

メモリ上に存在するディスクに書き込むべきデータと全体メモリ量の比較で、 この値を上回った場合は、そのプロセスに対してバッファへの書き込みを 継続させずにディスクへの書き込みを行なわせるようにします。

[Warning]データの整合性の損傷

pdflush デーモンの設定を変更すると、データの整合性が損なわれることがあります。

これらのプロセスとは別に、 ReiserFS, Ext3, Ext4 などのジャーナリング機能 付きのファイルシステムでは、 pdflush とは独立したメタデータの書き込みを行なう 機能が備わっています。そのため、これらのファイルシステムを利用することによって、 ハードディスクの回転停止が阻害される場合もあります。このような問題を回避する には、モバイルデバイス向けの特別なカーネル拡張を利用する必要があります。詳しくは laptop-mode-tools パッケージを インストールし、 /usr/src/linux/Documentation/laptops/laptop-mode.txt ファイルをお読みください。

また、それ以外にも動作中のプログラムがどのように振る舞うのかについても注意を 払う必要があります。たとえば気の利いたエディタであれば、現在編集中のファイル について、隠しファイルを利用した定期的なバックアップを行なっていたりすることが あります。このような動作があると、ハードディスクが定期的に動き出す結果になって しまいます。データの整合性は犠牲になりますが、省電力を求める際には、 このような機能は無効化しておくのがよいでしょう。

また、これに関連してメールデーモンである postfix には、 POSTFIX_LAPTOP という変数が存在しています。この 値を yes に設定すると、ハードディスクに対して頻繁に アクセスしたりしないようになります。

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

全てのエラーメッセージと警告は、 /var/log/messages ファイルに書き込まれます。本章ではよく発生する問題について記述しています。

31.4.1. ハードウエア側で ACPI が有効化されているのにうまく動作しない場合

ACPI について何らかの問題に直面した場合は、 dmesg コマンドの 出力から ACPI 固有のメッセージを検索してください。たとえば、 dmesg|grep -i acpi のように実行します。

また、問題を解決するには BIOS の更新が必要となる場合もあります。お使いのラップトップ の製造元 Web ページをご覧になり、 BIOS の更新版がないかどうかをご確認ください。 また、最新の ACPI 仕様に準拠しているかどうかも合わせてご確認ください。 BIOS を 交しかしても問題が解決しない場合は、下記の手順で問題のある BIOS 内の DSDT テーブル を更新してください:

手順31.1 BIOS 内の DSDT テーブルの更新

下記の手順を実行する前に、必要なパッケージがインストールされていることをご確認 ください。 kernel-source, acpica, mkinitrd の各パッケージが必要です。

  1. お使いのシステムに対応した DSDT を、 http://acpi.sourceforge.net/dsdt/index.php から ダウンロードします。ファイルが圧縮されている場合はそれを展開してください。 ファイルの拡張子が .aml (ACPI マシン言語) になっている 場合は手順 3 に移動してください。それ以外の場合は、次の手順を実施してください。

  2. ダウンロードしたテーブルのファイル拡張子が .asl (ACPI ソース言語) である場合は、下記のコマンドでコンパイルを行なってください。

    iasl -sa file.asl
  3. ファイル DSDT.aml を任意の場所 (/etc/DSDT.aml がお勧めです) にコピーします。

  4. /etc/sysconfig/kernel を編集し、 DSDT ファイルの パスを指定します。

  5. あとは mkinitrd コマンドを実行して initrd を作成すれば 完了です。新しいカーネルをインストールした場合は、mkinitrd コマンドを実行すると initrd が作成され、変更済みの DSDT が統合されてシステム起動時に読み込まれるようになります。

31.4.2. CPU の周波数制御がうまく働かない場合

カーネルのソースコードを参照し、お使いのプロセッサに対応しているかどうかを確認 してください。また、 CPU の周波数制御を働かせるためには特別なカーネルモジュールや モジュールオプションが必要になる場合もあります。 kernel-source パッケージがインストール されている場合、これらの情報は /usr/src/linux/Documentation/cpu-freq/* にあります。

31.4.3. サスペンドやスタンバイがうまく働かない場合

ACPI システムでは、誤った DSDT 実装 (BIOS) によってサスペンドやスタンバイに 問題が発生する場合があります。このような場合は、 BIOS を更新してください。

また、システムが不具合のあるモジュールの読み込みを解除する際には、システムが 停止してしまったり、サスペンドのイベントが動作しなかったりする場合があります。 同じようなことは、サスペンドを妨害するサービスを停止する際にも発生する場合が あります。いずれの場合とも、スリープモードへの移行を妨害しているものを調べて ください。ログファイル /var/log/pm-suspend.log には、 何が行なわれているのかを示す情報と、考えられるエラー情報がそれぞれ記載されて います。また、サスペンドやスタンバイに移行する前に読み込みを解除しておきたい モジュールがある場合は、 /usr/lib/pm-utils/defaults ファイル内の SUSPEND_MODULES 変数に設定を行なって ください。

なお、サスペンドとそこからの復帰処理について変更を行なうための方法は、 http://ja.opensuse.org/Pm-utils (日本語) または http://old-en.opensuse.org/Pm-utils (英語) 、および http://ja.opensuse.org/S2ram (日本語) または http://wiki.opensuse.org/SDB:Suspend_to_RAM (英語) をお読みください。

31.5. さらなる情報