Linux上でスリープを管理する低レベルインターフェース: /sys/power/state
たまたまLinuxのスリープ管理について調べることがあったのでこれについて書く。スリープ管理にはいろんなインターフェースがあるが、この記事ではLinuxカーネルが管理する低レベルなインターフェースについて書く。
Linuxのシステムスリープ管理インターフェース
Linuxカーネルはシステムスリープの状態として最大4つの状態をサポートしている。この内3つはプラットフォームのサポートに依存しているので使えない場合もある。
mem
standby
freeze
disk
これらの状態は、読み書き可能な/sys/power/state
ファイルにて文字列で表現される。言い換えると、使用可能なスリープ状態の一覧がこのファイルから読むことができ、またこのファイルに該当の文字列を書き込めばそのスリープ状態に入る。
実際に私のLinux上で/sys/power/state
の中身を見てみると次のようになった。
$ cat /sys/power/state
freeze mem disk
スペースを挟んで3つの文字列が並んでいる。これらが私のOSでサポートされているスリープ状態の一覧。この/sys/power/state
に3状態の内のどれか一つを書き込めば、そのスリープ状態に入る。(rootでログインして実験した。)
# echo mem > /sys/power/state
スリープから復帰すると/sys/power/state
は元の内容に戻っていた。
4つのスリープ状態について
上記の4つのスリープ状態の内、3つは常に同じものを表現している。
-
standby
: Power-On Suspend -
freeze
: Suspend-To-Idle -
disk
: hibernation (Suspend-To-Disk)
(それぞれの状態の概要は後述する。)
ではmem
はなにかというと、/sys/power/mem_sleep
によって制御される。/sys/power/mem_sleep
にも以下のスリープ状態の内、サポートされているものが並んでいる。
-
s2idle
: Suspend-To-Idle -
shallow
: Power-On Suspend -
deep
: Suspend-To-RAM
s2idle
は常にサポートされているが、shallow
とdeep
はプラットフォームがサポートしていない場合があり、そういった場合は/sys/power/mem_sleep
に表示されない。
実際にこのファイルを見てみる。
$ cat /sys/power/mem_sleep
s2idle [deep]
この場合はs2idle
とdeep
がサポートされている。さらにdeep
は[]
で囲まれており、/sys/power/state
にmem
が書き込まれた場合にはこの状態が適用される。また、この/sys/power/mem_sleep
に別の状態の文字列 (今回はs2idle
しか選択肢はないが。) を書き込むと、その状態が次に適用されることになる。
特定のスリープ状態にするには
ここまでで分かるかもしれないが、例えばSuspend-To-Idleに移行するには次の2つの方法がある。
-
/sys/power/state
にfreeze
と書き込む。 -
/sys/power/mem_sleep
にs2idle
と書き込んでから、/sys/power/state
にmem
と書き込む。
一方でSuspend-To-RAM状態にする方法は1つしかない。
-
/sys/power/mem_sleep
にdeep
と書き込んでから、/sys/power/state
にmem
と書き込む。
それぞれのスリープ状態の説明
最後にそれぞれのスリープ状態がどういったものか概要だけ書く。スリープ状態により消費電力の削減量に違いがあるが、電力節約が大きくなると復帰時間の長さにデメリットがあり、一長一短といった印象。
s2idle
)
Suspend-To-Idle (一般的なシステムスリープ状態。軽量。ユーザー空間をフリーズし、全てのI/Oデバイスを低電力状態にすることで消費電力を削減する。他のスリープ状態をサポートしていないプラットフォームでも使用することができる。
shallow
, standby
)
Power-On Suspend (中程度の電力削減が可能。Suspend-To-Idleのようなユーザー空間のフリーズやI/Oデバイスの低電力状態化に加え、ブートしないCPUをオフラインにし、低レベルなシステム機能をサスペンドする。
deep
)
Suspend-To-RAM (システムとデバイスのデータをメモリに保存し、メモリ以外の全てを低電力状態にする。このため大幅な電力削減になる。メモリはセルフリフレッシュモードでデータを保持する。
消費電力の削減が大きいため、充電されていない状態のラップトップのふたが閉じられたときにはこの状態に自動移行することが推奨される。
disk
)
Suspend-To-Disk (Suspend-To-RAMの操作と似ているが、メモリではなくディスク (のスワップ領域) にデータが保存される。最大の電力削減になる。hibernateとも呼ばれる。
おわり
間違った記述やより良い情報があれば教えていただけると非常に助かります。
Discussion