TenForward

技術ブログ。はてなダイアリーから移転しました

Linux 3.10 で memory cgroup に追加された Memory Pressure 通知機能

3.8 リリース後は,コンテナに関連する Namespace, cgroup について,大きな変更はありませんが,それぞれ細かい改良が加えられて進化はしています.

3.10 では memory サブシステムに Memory Pressure 通知の機能が追加されました.従来からある eventfd を使った仕組みで使い方もほぼ同じです.

Memory Pressure のレベルは "low", "medium", "critical" と使用(可能)量に応じて 3 段階あります (ちょっとそれぞれが表す状態と単語から受ける印象が違うような...).

  • "low" は新しいメモリ割り当てを行うために回収が行われたりしている状態
  • "medium" は swap が発生したりして,アクティブなファイルキャッシュがページアウトしたりしている可能性がある状態
  • "critical" は文字通り,すぐにも OOM Killer が発動しそう or している状態

使い方は以下.

  1. eventfd を作成
  2. memory.pressure_level ファイルを open
  3. " " という文字列を cgroup.event_control に書く

試してみました.上記の作業を行うプログラムがカーネルに付属しています.(tools/cgroup/cgroup_event_listener.c)

# cd /sys/fs/cgroup/memory
# mkdir test01 (新しいグループの作成)
# cd test01/
# echo 2M > memory.limit_in_bytes (制限の設定)
# echo 2M > memory.memsw.limit_in_bytes (制限の設定(スワップ))
# echo 20121 > tasks (PID をグループに登録)
# cgroup_event_listener memory.pressure_level critical (critical を検出するようにプログラム起動した後,PID=20121のシェル上でメモリを使うアプリを起動)

memory.pressure_level critical: crossed

という風に検出ができています.

従来の memory サブシステムの通知 (OOM Killer 発動やメモリのしきい値をまたいだ通知) については,こちらにわかりやすい例が載っていますよ.Memory Pressure のプログラムも以下に載っているものを元に軽く修正すれば動きます.

詳しい解説はカーネル付属文書にあります.