linux:kernel:cgroup:memory.txt翻訳

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
linux:kernel:cgroup:memory.txt翻訳 [2013/04/03 08:10] – [8.3. TODO] tenforwardlinux:kernel:cgroup:memory.txt翻訳 [2013/08/21 15:43] (現在) – [11. メモリプレッシャー] tenforward
行 1: 行 1:
-<color red>自分用の適当翻訳ですので細かい所は間違いがあると思います.原文をお読みください.</color>+<color red>自分用の適当翻訳ですので細かい所は間違いがあると思います.原文 (Documentation/cgroups/memory.txt) をお読みください.</color> 
 + 
 +多分,3.10 ベース.
  
 ====== メモリリソースコントローラ ====== ====== メモリリソースコントローラ ======
行 36: 行 38:
   * タスクを移動することによりカウントの移動 (再カウント) が選択可能   * タスクを移動することによりカウントの移動 (再カウント) が選択可能
   * 使用量のしきい値の通知   * 使用量のしきい値の通知
 +  * メモリプレッシャーの通知
   * oom-killer が knob と oom-notifier を無効にすること   * oom-killer が knob と oom-notifier を無効にすること
   * root cgroup には制限のコントロールがない   * root cgroup には制限のコントロールがない
行 61: 行 64:
  memory.use_hierarchy            # カウントの階層構造の有効/無効を設定する/表示する  memory.use_hierarchy            # カウントの階層構造の有効/無効を設定する/表示する
  memory.force_empty              # 親グループへチャージを強制移動するトリガ  memory.force_empty              # 親グループへチャージを強制移動するトリガ
 + memory.pressure_level           # メモリプレッシャー通知を設定する
  memory.swappiness               # vmscan の swappiness パラメータを設定する/表示する  memory.swappiness               # vmscan の swappiness パラメータを設定する/表示する
                                  (See sysctl's vm.swappiness)                                  (See sysctl's vm.swappiness)
行 499: 行 503:
   * oom_kill_disable 0 or 1 (1 の時,oom-killer は無効化されている)   * oom_kill_disable 0 or 1 (1 の時,oom-killer は無効化されている)
   * under_oom 0 or 1 (1 の時,メモリ cgroup は OOM 状態にあり,タスクは停止している可能性がある)   * under_oom 0 or 1 (1 の時,メモリ cgroup は OOM 状態にあり,タスクは停止している可能性がある)
 +
 +===== 11. メモリプレッシャー =====
 +
 +プレッシャーレベルの通知はメモリアロケーションのコストをモニタリングするのに使う事ができる.これはプレッシャーをもとにしており,アプリケーションは自身のメモリリソースに様々な管理戦略を実装することが可能になる.プレッシャーレベルは以下のように定義される.
 +
 +"low" レベルは,システムが新しいアロケーションのためにメモリを回収している事を意味する.この回収の動きをモニタリングする事はキャッシュレベルを良好に保つのに役に立つ可能性がある.通知があると,プログラム (一般的には "アクティビティ・マネージャ") は vmstat を解析し,あらかじめ何らかの動作を行う事が可能になる (例えば,早めに重要でないサービスを停止するなど).
 +
 +"medium" レベルは,システムが中位のメモリプレッシャー状態にあることを意味する.システムは swap し,アクティブなファイルキャッシュをページアウトするなどしている可能性がある.このイベントで,アプリケーションは vmstat/zoneinfo/memcg や,簡単に再構築できたりディスクから再読み込みすれば良い内部的なメモリ使用の統計値と空きリソースのさらなる解析を決定する可能性がある.
 +
 +"critical" レベルは,システムが頻繁にスラッシングを起こしている事を意味する.これはまさに out of memory(OOM) しようとしているところであるか,OOM killer が起動しようとしている所である.アプリケーションは,システムを助ける事ができることなら何でもすべきである.この状態では vmstat や他の統計値の状態を見るには遅すぎであり,すぐに何らかのアクションを起こす事が賢明である.
 +
 +イベントは,処理されるまで上流に伝搬する.すなわちイベントは貫通はしないということである.これがどういうことかを以下にしめす.例えば,3 つの cgroup A->B->C が存在するとする.さてここで cgroup A, B, C にイベントリスナーを設定し,グループ C がある種のプレッシャー状態にあるとする.この状況で,グループ C のみが通知を受け取る.すなわち A, B は通知を受け取らない.これはメッセージの過度の「ブロードキャスティング」を防ぐためである.過度のブロードキャスティングは,システムの稼働を阻害し,メモリが少なかったりスラッシング状態にある場合に特に悪い影響を与える.なので,cgroup をきちんと構造化したり,イベントを手動で伝搬するようにする (もしくは,パススルーイベントを自分で実装するように求めたり,なぜ必要なのかの説明を求めたりする).
 +
 +memory.pressure_level ファイルは eventfd を設定するためだけに使われる.通知を登録するために,アプリケーションは
 +
 +  - eventfd(2) を使って eventfd を作成する
 +  - memory.pressure_level を open する
 +  - "<event_fd> <fd of memory.pressure_level> <level>" というような文字列を cgroup.event_control に write する
 +
 +アプリケーションは,メモリプレッシャーが指定したレベル (か高いレベル) に達した時,eventfd を通して通知を受け取る.memory.pressure_level に対する read/write 操作は実装されていない.
 +
 +テスト:
 +
 +ここに小さなサンプルスクリプトがある.これは新しい cgroup を作成し,メモリリミットを設定し,cgroup に通知を設定し,それから子供の cgroup に対して深刻なプレッシャーを与えるスクリプトである.
 +
 +<code>
 +# cd /sys/fs/cgroup/memory/
 +# mkdir foo
 +# cd foo
 +# cgroup_event_listener memory.pressure_level low &
 +# echo 8000000 > memory.limit_in_bytes
 +# echo 8000000 > memory.memsw.limit_in_bytes
 +# echo $$ > tasks
 +# dd if=/dev/zero | read x
 +</code>
 +
 +(多数の通知が予測され,最終的には oom-killer が発動するだろう)
 +
 +
 +===== 12. TODO =====
 +
 +  - huge ページのアカウンティングサポート (分離したコントローラとして)
 +  - cgroup ごとのスキャナーが最初に共有されていないページを回収するようにする
 +  - コントローラに共有ページに対するアカウントを教える
 +  - 制限には達していないが,使用量が制限に近づいている時に,バックグラウンドで回収を開始する
 +
 +===== Summary =====
 +
 +全体的に,メモリコントローラは stable なコントローラであり,コミュニティ内で広く議論とコメントがなされてきた
 +
 +===== References =====
 +
 +  - Singh, Balbir. RFC: Memory Controller, http://lwn.net/Articles/206697/
 +  - Singh, Balbir. Memory Controller (RSS Control), \\ http://lwn.net/Articles/222762/
 +  - Emelianov, Pavel. Resource controllers based on process cgroups http://lkml.org/lkml/2007/3/6/198
 +  - Emelianov, Pavel. RSS controller based on process cgroups (v2) http://lkml.org/lkml/2007/4/9/78
 +  - Emelianov, Pavel. RSS controller based on process cgroups (v3) http://lkml.org/lkml/2007/5/30/244
 +  - Menage, Paul. Control Groups v10, http://lwn.net/Articles/236032/
 +  - Vaidyanathan, Srinivasan, Control Groups: Pagecache accounting and control subsystem (v3), http://lwn.net/Articles/235534/
 +  - Singh, Balbir. RSS controller v2 test results (lmbench), http://lkml.org/lkml/2007/5/17/232
 +  - Singh, Balbir. RSS controller v2 AIM9 results http://lkml.org/lkml/2007/5/18/1
 +  - Singh, Balbir. Memory controller v6 test results, http://lkml.org/lkml/2007/8/19/36
 +  - Singh, Balbir. Memory controller introduction (v6), http://lkml.org/lkml/2007/8/17/69
 +  - Corbet, Jonathan, Controlling memory use in cgroups, http://lwn.net/Articles/243795/
  
  • linux/kernel/cgroup/memory.txt翻訳.1364976651.txt.gz
  • 最終更新: 2013/04/03 08:10
  • by tenforward