Mac OS X Yosemite 10.10.5では、128 GBのメモリ(Cで記述されたコマンドラインプログラム)を割り当てて使用する必要がある計算を実行しようとすると、カーネルは極端な偏見でプロセスを強制終了します。このコンソールログエントリは、1つのインスタンスの例です。
9/25/15 7:08:40.000 PMカーネル[0]:低スワップ:PID 6202(huffgrp)の強制終了
64 GBのメモリを割り当てて使用すると、計算は正常に機能し、妥当な時間内に動作します。Macのハードドライブには32 GBのRAMとbeaucoupスペースがあります。8 GBのRAMを搭載した別のMacでもこれを試してみました。64GBの計算も同様にうまく動作しますが、もちろん時間がかかりますが、128 GBの計算はカーネルによって同様に殺されます。
ところで、malloc()
どれだけのスペースを要求しても、エラーが返されることはありません。カーネルは、プロセスが実際に使用するメモリが多すぎるとプロセスを強制終了します。その結果、ハードドライブへの大量のスワップが発生します。
そのため、64 GBから128 GBの間に秘密のスワップスペース制限があるようです。
私の質問は次のとおりです。より多くのスワップ領域を許可するようにカーネルを再構成するにはどうすればよいですか?有望なファイルを見つけました/System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
が、秘密の番号はそこにありません。のマニュアルページにdynamic_pager
は、スワップファイルの名前と場所を設定するだけであると書かれています。-S
作成されたスワップファイルのサイズを設定するオプションを文書化した同じマニュアルページの古いバージョンがあります。160 GBのスワップファイルを要求してみましたが、効果はありませんでした。スワップファイルはそれぞれ1 GBのままであり、プロセスは依然としてカーネルによって強制終了されました。
malloc
持っている以上のことができるのは、commit_limitが非常に高い(おそらく無限)ためです。そのため、OSは所有していないメモリを割り当てます(プロセスが使用しないことを賭けているため、通常はOSがこの賭けに勝ちます)。コミット制限をメモリ制限に調整すると、プロセスが早期に失敗する可能性があります。
malloc()
はわかっています。の戻り値をチェックしていないと考えている人にコメントを寄せていましたmalloc()
。ちなみに、私の目標は早く失敗することではありません。私の目的は成功することです。