😴

Linux上でスリープを管理する低レベルインターフェース: /sys/power/state

2022/08/19に公開

たまたま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は常にサポートされているが、shallowdeepはプラットフォームがサポートしていない場合があり、そういった場合は/sys/power/mem_sleepに表示されない。

実際にこのファイルを見てみる。

$ cat /sys/power/mem_sleep
s2idle [deep]

この場合はs2idledeepがサポートされている。さらにdeep[]で囲まれており、/sys/power/statememが書き込まれた場合にはこの状態が適用される。また、この/sys/power/mem_sleepに別の状態の文字列 (今回はs2idleしか選択肢はないが。) を書き込むと、その状態が次に適用されることになる。

特定のスリープ状態にするには

ここまでで分かるかもしれないが、例えばSuspend-To-Idleに移行するには次の2つの方法がある。

  • /sys/power/statefreezeと書き込む。
  • /sys/power/mem_sleeps2idleと書き込んでから、/sys/power/statememと書き込む。

一方でSuspend-To-RAM状態にする方法は1つしかない。

  • /sys/power/mem_sleepdeepと書き込んでから、/sys/power/statememと書き込む。

それぞれのスリープ状態の説明

最後にそれぞれのスリープ状態がどういったものか概要だけ書く。スリープ状態により消費電力の削減量に違いがあるが、電力節約が大きくなると復帰時間の長さにデメリットがあり、一長一短といった印象。

Suspend-To-Idle (s2idle)

一般的なシステムスリープ状態。軽量。ユーザー空間をフリーズし、全てのI/Oデバイスを低電力状態にすることで消費電力を削減する。他のスリープ状態をサポートしていないプラットフォームでも使用することができる。

Power-On Suspend (shallow, standby)

中程度の電力削減が可能。Suspend-To-Idleのようなユーザー空間のフリーズやI/Oデバイスの低電力状態化に加え、ブートしないCPUをオフラインにし、低レベルなシステム機能をサスペンドする。

Suspend-To-RAM (deep)

システムとデバイスのデータをメモリに保存し、メモリ以外の全てを低電力状態にする。このため大幅な電力削減になる。メモリはセルフリフレッシュモードでデータを保持する。

消費電力の削減が大きいため、充電されていない状態のラップトップのふたが閉じられたときにはこの状態に自動移行することが推奨される。

Suspend-To-Disk (disk)

Suspend-To-RAMの操作と似ているが、メモリではなくディスク (のスワップ領域) にデータが保存される。最大の電力削減になる。hibernateとも呼ばれる。

おわり

間違った記述やより良い情報があれば教えていただけると非常に助かります。

参照

Discussion