Mac OS Xで最大スワップスペースを増やすにはどうすればよいですか?


14

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のままであり、プロセスは依然としてカーネルによって強制終了されました。


また、この質問をapple.stackexchange.comに投稿しましたが、まだ回答がありません。
マークアドラー

1
malloc持っている以上のことができるのは、commit_limitが非常に高い(おそらく無限)ためです。そのため、OSは所有していないメモリを割り当てます(プロセスが使用しないことを賭けているため、通常はOSがこの賭けに勝ちます)。コミット制限をメモリ制限に調整すると、プロセスが早期に失敗する可能性があります。
ctrl-alt-delor

なぜパラグラフ5が正しいと思うのかわかりませんが、パラグラフ4からは続きません(ただし、「so」で始めます)。また、たくさんのスワップを追加しようとしましたか?(これに関する質問は明確ではありませんが、答えはイエスだと思います)。
ctrl-alt-delor

@richardはい、そうする理由malloc()はわかっています。の戻り値をチェックしていないと考えている人にコメントを寄せていましたmalloc()。ちなみに、私の目標は早く失敗することではありません。私の目的は成功することです。
マークアドラー

@richardカーネルメッセージに「低スワップ」と表示されているため。「大量のスワップを追加する」ことに関しては、私はそれをやったことがありません。それがまさにこの質問です。 スワップ領域を追加するにはどうすればよいですか?もちろん、カーネルは自動的にスワップ領域を追加しますが、制限はありません。したがって、質問の根源:カーネルのスワップ領域の制限を増やすにはどうすればよいですか?
マークアドラー

回答:


4

あなたが求めた答えではありませんが、適切なサイズの独自のファイルを作成し、それをプロセスにmmapし、このアドレス空間で計算を実行すると、スワップファイルと同じ効果があり、保証されます使用可能なRAM /スワップを求めて他のプロセスと競合するのではなく、スペースを確保します。

また、データを上書きする頻度にもよりますが、速度は遅くなる可能性がありますが、はるかに移植性が高いはずです。


2
いい案!希望がありました。悲しいかな、彼らは現実の厳しい海岸に対して打ち砕かれました。プロセスがして、まだそれは私がして、仮想メモリとして使用することに作成したファイルを使用していたにも関わらず、単に(「低スワップ」コンソールメッセージ)以前のように、スワップ大量のためのカーネルによって殺されましたmmap()
マークアドラー

申し訳ありませんが、私の経験のほとんどはLinuxに関するものです。しかし、おそらく問題は、カーネルがファイルにフラッシュバックせず、代わりにRAMに保持していないことです。定期的に呼び出しmsync()て強制的に呼び出すとどうなりますか?
データレス

0

私のMac情報はかなり古く、これを行うためのカーネルの魔法はもうないかもしれません。そのため、このプログラムにはLinuxを使用することをお勧めします。このプログラムでは、フォルダーまたはパーティションを非常に簡単にスワップとしてマウントできます。

動的スワップフォルダーの使用の不確実性を排除します。物理スワップパーティションを作成します(スワップ用のディスクテーブルタイプコードを含む、空の未フォーマットパーティションのみ、Linuxでは16進コード0x82です)。

  1. / etc / rcファイルを編集して、swapセクションですべてコメントアウトします。行を追加mount -vat swap
    • すべてのスワップパーティションを/ etc / fstabにマウントすることを意味します
  2. 走る pdisk /dev/disk? -dump
    • 「?」hdレコードのディスク番号は、スワップパーティションの横の番号です
  3. / etc / fstabを編集または作成し(おそらく存在しない)、次のような行を追加します /dev/disk?s?? none swap sw 0 0
    • ?あなたのディスクです。
    • ?スワップパーティションの番号です。
  4. リブート。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.