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.
quelle
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 vonmalloc()
. Mein Ziel ist es übrigens nicht, früher zu scheitern. Mein Ziel ist es, erfolgreich zu sein.Antworten:
Nicht die Antwort, nach der Sie gefragt haben, aber wenn Sie eine eigene Datei mit einer geeigneten Größe erstellen, ordnen Sie sie Ihrem Prozess zu und führen Sie dann Ihre Berechnung in diesem Adressraum aus. Dies sollte den gleichen Effekt haben wie eine Auslagerungsdatei, und Sie werden garantiert haben den Raum, im Gegensatz zu anderen Prozessen für verfügbaren RAM / Swap zu konkurrieren.
Es kann auch langsamer sein, je nachdem, wie oft Sie die Daten überschreiben, sollte aber viel portabler sein.
quelle
mmap()
.msync()
, um dies zu erzwingen?Meine Mac-Informationen sind veraltet, möglicherweise gibt es dafür nicht mehr die Kernelmagie. Als solches empfehle ich Linux für dieses Programm, wo Sie entweder einen Ordner oder eine Partition ganz einfach als Swap mounten können.
Beseitigen Sie die Unsicherheiten bei der Verwendung eines dynamischen Auslagerungsordners. Erstellen Sie eine physische Swap-Partition (nur eine leere unformatierte Partition mit Festplattentabellencode für Swap, in Linux ist es Hex-Code
0x82
). Dann:mount -vat swap
pdisk /dev/disk? -dump
/dev/disk?s?? none swap sw 0 0
quelle