# Linuxメモリ回収
## 定義
Linuxは、システムの利用可能メモリが減ってきたとき、逼迫度に応じて複数の手段を順に切り替えてメモリを開放する。まずフリーリスト(すぐにアロケーションに回せる未使用ページのリスト。通常はNUMAごとに1つのフリーページリストとして実装される)が消費される。次に、スワッピネスパラメータ(0〜100、デフォルト60。値が高いほどページングによるメモリ開放が優先される)に従って、ページキャッシュ(ファイルシステムキャッシュ)の破棄とスワッピング(ページアウトデーモンkswapdによる無名ページのページング)のバランスが取られる。さらに逼迫すると、リーピング(主にカーネルのスラブアロケータキャッシュから、すぐに再利用できるメモリの開放をカーネルモジュールに指示する処理。シュリンクとも呼ばれる)が行われる。最後の手段がOOMキラー(Out Of Memory killer)で、select_bad_process()で見つけたプロセスをoom_kill_process()で強制終了してメモリを開放する。カーネルのページアウトデーモンkswapdは、フリーメモリと3段階のしきい値(最小限/ロー/ハイ)に基づいて目覚め、非アクティブ/アクティブのLRUページリストをスキャンしてページを開放する。フリーメモリが最小限のしきい値に達すると同期的にメモリを開放する直接破棄(direct-reclaim)に切り替わる。最小限のしきい値はvm.min_free_kbytesでチューニングでき、ローは2倍、ハイは3倍にスケーリングされる。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] §7.3.2.1〜§7.3.2.4)
## 横断的知見
(このセクションは複数ソースの突き合わせで得られる知見を蓄積する。現時点では本概念に触れたソースが1件のため、蓄積を今後の ingest に委ねる。)
## 未解決の問い
- Netflixクラウドの「スワップを構成せずOOMキラーに任せる」方針(Source: 本章§7.3.2.1)は、レイテンシSLAが厳しいAI推論ワークロードのようなメモリ使用量が急増しやすい環境にも一般化できるか、それとも段階的なページングによる緩衝の方が有利な場面があるか。
- vm.watermark_scale_factorとvm.watermark_boost_factorによる積極的なkswapdスキャンのチューニングは、高頻度メモリアロケーションを行うワークロード(例: GPU推論サーバーのバッチ処理)でCPUオーバーヘッドとメモリプレッシャー低減のどちらを優先すべきか、経験的な閾値はあるか。
- cgroup v2下でのメモリ回収(PSIによる観測を含む)は、ホスト全体のkswapdの挙動とどのように協調/独立しているか。
## 関連
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] — 本概念の原典解説(図7-6, 図7-8, 図7-9)。
- [[仮想メモリとページング]] — ページング・デマンドページング・オーバーコミットの基礎概念。
- [[メモリアロケータ]] — リーピングが開放するスラブキャッシュを管理するカーネルアロケータ。
- [[詳解 システム・パフォーマンス 第2版]] — 書籍ハブ。
## 出典
- [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 7 メモリ]] §7.3.2.1〜§7.3.2.4