ラベル kernel の投稿を表示しています。 すべての投稿を表示
ラベル kernel の投稿を表示しています。 すべての投稿を表示

2007年4月26日木曜日

OOM Killer

● 概要

 Out Of Memory Killerのこと。Linuxのデフォルトの動作では、プロセスがメモリを要求した場合、総メモリ使用量が実メモリ+swap以上であっても、ある程度許可するようになっている。これは、各プロセスが要求したメモリをすべて使うわけではないという経験的な法則により、できるだけ多くのプロセスを起動するためにそのように動作になっているようである。そのため、あるプロセスが確保できたはずのメモリを使おうとし、実際にメモリが足りない場合カーネルが適当なプロセスを選択し、そのプロセスをkillしてしまうことをOut Of Memory Killerという。

● 特定プロセス除外

このOOM Killerで重要なプロセスを除外するためには、/proc/(プロセスID)/oom_adjに-17を書き込む。

$ echo -17 > /proc/(プロセスID)/oom_adj

● OOM Killer停止

 また、/proc/sys/vm/overcommit_memoryの値でLinuxの動作そのものを変更することもできる。

値説 明
0メモリ確保要求があった場合、カーネルが現在未使用のメモリ量から経験的手法で判断する。(デフォルト)
1メモリ確保要求は全て許可する。
2メモリ確保要急がswapメモリ + (物理メモリ * /proc/sys/vm/overcommit_ratio / 100)まで許可する。

 2に設定することで実メモリ以上のメモリ確保要求は失敗するため、OOM Killerは動作しない。

● 参考 カーネルソース

overcommit_memory定義値

(include/linux/mman.h )
#define OVERCOMMIT_GUESS 0
#define OVERCOMMIT_ALWAYS 1
#define OVERCOMMIT_NEVER 2


int __vm_enough_memory(long pages, int cap_sys_admin)
mm/mmap.c
OOM Killerを実行するか判定を行う。

unsigned long badness(struct task_struct *p, unsigned long uptime)
mm/oom_kill.c
OOM Killerの対象プロセスを判定する

■ 参考資料

OOM Killer とは:IPpro
路地裏 ソース解読研究所: Number -17
OOM Killer によるプロセスの強制終了を防ぐ
JF: Linux Kernel 2.6 Documentation: vm.txt
memologue Linux Memory Overcommit