Mac OS X Yosemite 10.10.5で、128 GBのメモリを割り当てて使用する必要がある計算を実行しようとすると(Cで記述されたコマンドラインプログラムです)、カーネルがプロセスを強制終了し、非常に偏見があります。このコンソールログエントリは、1つのインスタンスの例です。
9/25/15 7:08:40.000 PM kernel [0]:low swap:killing pid 6202(huffgrp)
64 GBのメモリを割り当てて使用すると、計算は適切に、妥当な時間内に機能します。私のMacには32 GBのRAM=とハードドライブのbeaucoup領域があります。64GBの計算でも問題なく実行される、8 GBのRAMを搭載した別のMacでもこれを試してみましたもちろん、128 GBの計算は同じ方法でカーネルによって強制終了されます。
ちなみに、malloc()
は、どの程度のスペースを要求しても、エラーを返すことはありません。カーネルがプロセスを強制終了するのは、そのメモリの多くが実際にプロセスによって使用されているためです。その結果、ハードドライブに大量のスワッピングが発生します。
したがって、64 GBから128 GBの間に秘密のスワップ領域の制限があるようです。
私の質問は、カーネルを再構成してより多くのスワップ領域を許可するにはどうすればよいですか?有望なファイル/System/Library/LaunchDaemons/com.Apple.dynamic_pager.plist
を見つけましたが、そこに秘密の番号がありません。 dynamic_pager
のマニュアルページには、スワップファイルの名前と場所を設定するだけであると記載されています。作成されたスワップファイルのサイズを設定するための-S
オプションについて説明している同じmanページの古いバージョンがあります。 160 GBのスワップファイルを要求してそれを試しましたが、効果がありませんでした。スワップファイルはそれぞれ1 GBのままで、プロセスはカーネルによって強制終了されました。
あなたが求めた答えではありませんが、適切なサイズの独自のファイルを作成し、それをプロセスにmmapしてから、このアドレススペースで計算を実行すると、スワップファイルと同じ効果が得られ、使用可能なRAM /スワップについて他のプロセスと競合するのではなく、スペースがあります。
また、データを上書きする頻度にもよりますが、移植性ははるかに高くなります。
私のMac情報はかなり古くなっているので、これを行うためのカーネルマジックはもうないかもしれません。このため、このプログラムにはLinuxを使用することをお勧めします。この場合、フォルダーまたはパーティションのいずれかを非常に簡単にスワップとしてマウントできます。
動的スワップフォルダーを使用することの不確実性を排除します。物理スワップパーティションを作成します(Linuxの場合、16進コード0x82
です。スワップ用のディスクテーブルタイプコードを含む、空のフォーマットされていないパーティションです。)次に、次のようにします。
mount -vat swap
を追加しますpdisk /dev/disk? -dump
を実行します/dev/disk?s?? none swap sw 0 0
のような行を追加します