Hello!!! Adachinです。
最近お酒飲んでます。飲まなくなると酔ってしょうがないですが、
段々と強くなってきました。
今回はKernelの部分!
友人とOOM Killerのお話で盛り上がったのでブログします。
■OOM Killerとは
そもそもなんの略なのか。(Out Of Memory Killer)です!
システムが実メモリーと仮想メモリー空間(スワップ領域)を使い切り、
必要なメモリー領域を新たに確保できない場合に、プロセスを強制終了させて空きメモリーを確保するKernelの仕組み。
さらに!
空きメモリーが確保できないことでシステム自体が停止するという最悪の事態を避けるために用意されている。
■OOM Killerのチューニング
そうならないためにOOMさんの頻度を下げる必要があります。
サイトによって様々ですので、参考になるものをまとめてみました。
あと表が表示されなくてごめんなさいw→枠が出なくてキレそう。。。
カーネルパラメータ | 設 定 値 |
説明 |
vm.overcommit_memory | 0 | デフォルト設定。カーネルがメモリの空き容量を概算し、明らかに無効な要求を失敗させることで、ヒューリスティックなメモリオーバーコミット処理を実行します。 残念ながら、メモリは厳密なアルゴリズムではなくヒューリスティックなアルゴリズムを使用して割り当てられるため、この設定でシステム上のメモリの空き容量がオーバーロードとなる場合があります。 |
1 | カーネルはメモリオーバーコミット処理を行いません。 この設定では、メモリのオーバーロードの可能性が高くなりますが、メモリ集約型のタスクのパフォーマンスも向上します。 |
|
2 | 利用可能なスワップと overcommit_ratio で指定されている物理 RAM の割合の合計とメモリが同等もしくはそれよりも大きい場合の要求を拒否します。メモリのオーバーコミットのリスクを減らしたい場合は、この設定が最適です。 | |
overcommit_ratio | (0~100?) | overcommit_memory が 2 に設定されている場合に考慮される物理 RAM の割合を指定します。 デフォルト値は 50 です。 |
カーネルパラメータ | 設 定 値 | 説明 |
vm.overcommit_memory | 2 | Linuxでは、mallocによりメモリを確保する時に、実際の要求より多めにメモリを確保しよう(オーバーコミット)とする。更に悪いことに、mallocが成功を返しても、実際にメモリを確保できてないことがあり、その場合、既にその領域は使用されているため、kernelにより強制終了となる。 その解決法として、Linux 2.6以降でのみ、メモリをオーバーコミットさせないようにすることが可能。この時、malloc量の上限は、vm.overcommit_ratioにて指定する。 |
vm.overcommit_ratio | n | mallocにより確保するメモリ量の上限(n%)。malloc_limit[MB] = swapサイズ[MB] + (物理メモリ量[MB] * overcommit_ratio / 100) |
vm.overcommit_memory | 0 | オーバーコミット有効。 一回の malloc で確保できるのは実際に利用可能なメモリの大きさまで |
1 | どんなときでもオーバーコミット可 一回の malloc で実際に利用可能なメモリを越える大きさでも確保可能 |
|
2 | オーバーコミット無効 malloc で割り当てられるメモリの総量は (スワップの大きさ)+(物理メモリの大きさ)* vm.overcommit_ratio / 100 |
■設定方法
・例
1 |
# echo 2 /proc/sys/vm/overcommit_memory |
1 |
# echo 90 /proc/sys/vm/overcommit_ratio |
■OOM Killerの対象から除外
1 |
# echo -17 /proc/〈プロセスID〉/oom_adj |
■ちなみにオーバーコミットとは
mallocによりメモリを確保する場合、実際の要求より多めにメモリを確保しよう(オーバーコミット)とする。
■まとめ
そんな感じで去年勉強しましたが、
チューニングはむずい。。。
あとはちゃんと原因の切り分けができるかが大事ですね。
0件のコメント