Re: カーネルがプロセスを勝手にkill!?
前田です.
MOCHIDA Shuji <mochid@netside.co.jp> writes:
> http://search.luky.org/fol.2001/msg00337.html
>
> にありますが、
>
> | Linux 2.2以降では、/proc/sys/vm/overcommit_memory に1を書き込むと
> | overcommit動作をするようになりますが、デフォルトではovercommitしません。
>
> とあるように、/proc/sys/vm/overcommit_memory を 1 にしなければいいのかも
> 知れません。
> # またデフォルト変わったんでしょうか?
や,その時にも出ていた話題だと思いますが,2.2.xカーネルでは,fork(2)につい
てはovercommitを完全に止めることはできないのでした.
http://search.luky.org/fol.2001/msg00348.html
2.4.19以降では改善されて,forkもちゃんとチェックされているようです.
また,より厳しくチェックするモードがつきました.
Documentation/vm/overcommit-accountingによると,
0 - Heuristic overcommit handling. (あからさまなovercommitは拒否.
でも,後で死ぬかも.)
1 - No overcommit handling. (チェックしない.)
2 - strict overcommit. (ほとんど全ての場合overcommitしないはず.)
3 - paranoid overcommit. (絶対overcommitしない.ページにアクセスしてプロ
セスがkillされたらバグなので報告してください.)
だそうです.
> > 1つ1つのプロセスのリソースが溢れそうになるのを事前に察知
> > する事はできるのでしょうか?
>
> overcommit の場合はそれは難しいです。
1つ1つのプロセスのリソースの問題でなく,システム全体の合計の問題なので,
個々のプロセスがローカルに知るのは難しいです.カーネルがチェックしない
と.2.2.xではどうやっても無理です.
> overcommit なしなら malloc() の時点でエラーになるので、
> "VM: killing process" は出ないですよね? > 詳しい方
2.2.xでは残念ながら,他のプロセスのせいでメモリが足りなくなって,罪の
ないプロセスが殺されてしまうことは防げません.
2.4.19以降を使って,さらに,確実にするには,
# echo 3 > /proc/sys/vm/overcommit-memory
または,
# /sbin/sysctl -w vm.overcommit-memory=3
として下さい.(スワップ領域は十分に取って下さい.)
前田敦司
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735