Re: カーネルがプロセスを勝手にkill!?
かみきと申します。
詳しくないですけど、この話、もすこし突っ込みたいので。
# linux/mm/mmap.c のリソースチェックの計算式の意味が分からんです ...。
MOCHIDA Shuji <mochid@netside.co.jp> writes:
> | Linux 2.2以降では、/proc/sys/vm/overcommit_memory に1を書き込むと
> | overcommit動作をするようになりますが、デフォルトではovercommitしません。
...
>
> overcommit なしなら malloc() の時点でエラーになるので、
> "VM: killing process" は出ないですよね? > 詳しい方
少なくとも linux 2.4.18 では /proc/sys/vm/overcommit_memory が 0 でも
おおむね
「空き実メモリ + 空きスワップ領域」 > 確保しようとする領域
をチェックしてるだけです。
# overcommit_memory が 1 だとチェックもしないので、
# そういう意味では overcommit かどうかを定めるフラグになっていますが ...
mmap or malloc しても左辺は変わらないので、これを複数回繰り返すと
「実メモリ + スワップ」以上の領域が確保できてしまいます。
つまり "VM: killing process" が出ることがありえます。
... 元々の記事はそれだからこれが出てるんでは。
mmap(2) の MAP_NORESERVE の項:
MAP_NORESERVE
(MAP_PRIVATE とともに使用される。) このマッピングに対するスワップ空間の
ペ ー ジ を予約しない。スワップ空間を予約した場合は、このプライベートな
copy-on-write (書き込み時コピー)領域の変更が必ず成功することが保証さ れ
る。 予約を行わなかった場合は、メモリに空きがないと書き込み時に SIGSEGV
エラーを受け取ることがある。
「copy-on-write 領域の変更が必ず成功することが保証される」というのは、
暗黙のうちに「他のプロセスを殺してでも ...」ということも含んでるんでしょうか。
「予約」してもどのリソースも減ってないように見えるんですが ...
--
かみきいちや
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