Wenn ich unter Mac OS X Yosemite 10.10.5 versuche, eine Berechnung auszuführen, bei der 128 GB Arbeitsspeicher zugewiesen und verwendet werden müssen (dies ist ein in C geschriebenes Befehlszeilenprogramm), bricht der Kernel meinen Prozess mit äußersten Vorurteilen ab. Dieser Konsolenprotokolleintrag ist ein Beispiel für eine Instanz:
9/25/15 7: 08: 40.000 PM kernel [0]: low swap: töte pid 6202 (huffgrp)
Die Berechnung funktioniert einwandfrei und in angemessener Zeit, wenn 64 GB Arbeitsspeicher zugewiesen und verwendet werden. Mein Mac verfügt über 32 GB RAM und Beaucoup-Speicherplatz auf der Festplatte. Ich habe dies auch auf einem anderen Mac mit 8 GB RAM versucht, auf dem die 64-GB-Berechnung ebenfalls gut läuft, was natürlich länger dauert, aber die 128-GB-Berechnung wird vom Kernel auf die gleiche Weise abgebrochen.
Übrigens, es wird malloc()
nie ein Fehler zurückgegeben, egal wie viel Speicherplatz ich benötige. Der Kernel bricht den Prozess nur dann ab, wenn zu viel Speicher tatsächlich vom Prozess verwendet wird, was zu einem starken Austausch auf die Festplatte führt.
Es scheint also eine geheime Swap-Speicherbegrenzung zwischen 64 GB und 128 GB zu geben.
Meine Frage ist: Wie konfiguriere ich den Kernel neu, um mehr Swap-Speicherplatz zu ermöglichen? Ich habe eine vielversprechend aussehende Datei gefunden, /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
aber ich sehe die Geheimnummer dort nicht. In der Manpage für dynamic_pager
wird lediglich der Name und der Speicherort der Auslagerungsdateien festgelegt. Es gibt eine ältere Version derselben Manpage, die eine -S
Option zum Festlegen der Größe der erstellten Swap-Dateien dokumentiert . Ich habe versucht, 160 GB Swap-Dateien anzufordern, aber es hatte keine Wirkung. Die Swap-Dateien hatten jeweils noch 1 GB, und der Prozess wurde vom Kernel immer noch abgebrochen.
malloc
mehr können als Sie haben, ist, dass commit_limit sehr hoch ist (wahrscheinlich unendlich). Daher wird das Betriebssystem Speicher zuweisen, über den es nicht verfügt (dies ist eine Wette, dass der Prozess es nicht verwendet, das Betriebssystem gewinnt normalerweise diese Wette). Möglicherweise möchten Sie das Festschreibungslimit so anpassen, dass es dem Speicherlimit entspricht. Auf diese Weise schlägt der Prozess vorzeitig fehl.
malloc()
das so ist. Ich habe mögliche Kommentare zu jemandem abgelenkt, der denkt, ich überprüfe nicht den Rückgabewert von malloc()
. Mein Ziel ist es übrigens nicht, früher zu scheitern. Mein Ziel ist es, erfolgreich zu sein.