cgroupにより実行プロセスにメモリ使用制限を設ける

メモリをあまり使ってほしくないときに。

一応動かしたいんだけど、メモリ使いすぎてOOMKillerさんに大事なプロセスの方を殺されたくない方へ。

もしくは、プロセス自体を殺されたくない方へ。

前回同様cgroupにより制限を設ける。

前回:実行プロセスにCPU使用制限を設ける https://hacknote.jp/archives/34351/

まずはメモリの制限。こちらは前回のCPUの項目のように以下のように書く

group hoge {
    memory {
        memory.limit_in_bytes = 100M;
        memory.memsw.limit_in_bytes = 200M;
        }
    }

これで、メモリを100M、スワップ領域と合わせて最大200Mの制限を設けることになる。 ちなみにこれを超えるとOOMKillerさんが登場、悪い子を殺してくれる。

OOMKillerに殺されたくない方は

# echo 1 > /cgroup/hoge/memory.oom_control

のように設定すれば、OOMKillerは働かず、メモリが解放されるまでおとなしく待つ。 ただ、OOMKillerが働かないということはシステム自体が死ぬことにつながりかねないので、 「このプロセスに関してはこのメモリの量でやってほしいけど、無理なときには死なないで待ってほしい」ってときには

group hoge {
    memory {
        memory.limit_in_bytes = 100M;
        memory.memsw.limit_in_bytes = 200M;
        memory.oom_control = 1;
    }
}

こんな感じに書けばよい・・・はず。

ちなみに、この記事を書くきっかけとなったプロセスにメモリ容量の制限をきつく書いたら動作が完了しないままゾンビが生まれたので、諦めてメモリの制限を使わないことにしました。

ので、OOMKillerさんが有効な場合にちゃんとグループの中から悪い子を選んで殺してくれるかな?とか、 グループのOOMKillerを無効化した場合には、グループの中だけで無効で、他のがメモリ食ったときにはちゃんと殺してくれるよね?とかそこら辺の検証まで行く前に頓挫しました。

多分大丈夫だと思うけれど使う場合にはしっかり調べてね。