Wie erhöhe ich den maximalen Auslagerungsspeicher unter Mac OS X?

14

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.plistaber ich sehe die Geheimnummer dort nicht. In der Manpage für dynamic_pagerwird lediglich der Name und der Speicherort der Auslagerungsdateien festgelegt. Es gibt eine ältere Version derselben Manpage, die eine -SOption 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.

Mark Adler
quelle
Ich habe diese Frage auch auf apple.stackexchange.com gestellt, aber dort wurde keine Antwort gegeben.
Mark Adler
1
Der Grund, warum Sie mallocmehr 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.
Strg-Alt-Delor
Ich kann nicht verstehen, warum du denkst, dass Absatz 5 wahr ist, er folgt nicht aus Absatz 4 (obwohl du ihn mit „so“ beginnst). Haben Sie auch versucht, viel Swap hinzuzufügen? (Die Frage ist hier nicht klar, obwohl ich vermute, dass die Antwort ja ist).
Strg-Alt-Delor
@richard Ja, ich weiß warum 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.
Mark Adler
@richard Weil die Kernelmeldung "low swap" lautet. Nein, das habe ich nicht getan, weil ich nicht weiß, wie. Das ist genau diese Frage. Wie füge ich Swap Space hinzu? Natürlich fügt der Kernel Swap Space automatisch hinzu, aber nur bis zu einer bestimmten Grenze. Daher die Wurzel der Frage: Wie erhöhe ich das Swap-Space-Limit des Kernels?
Mark Adler

Antworten:

4

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.

Datenlos
quelle
2
Großartige Idee! Ich hatte große Hoffnungen. Leider wurden sie gegen das raue Ufer der Realität geschleudert. Das Verfahren wurde noch durch den Kernel für große Mengen an Swapping getötet, nach wie vor ( „low swap“ Konsolenmeldung), auch wenn es eine Datei wurde mit mir zu Verwendung als virtueller Speicher geschaffen hatte mmap().
Mark Adler
Entschuldigung, die meiste Erfahrung habe ich mit Linux gemacht. Aber vielleicht liegt das Problem darin, dass der Kernel nicht in die Datei zurückgespült wird und sie stattdessen im RAM hält. Was ist, wenn Sie regelmäßig anrufen msync(), um dies zu erzwingen?
Datum
0

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:

  1. Bearbeiten Sie die Datei / etc / rc, und lesen Sie den gesamten Kommentar zum Auslagerungsbereich aus. füge die Zeile hinzumount -vat swap
    • bedeutet, dass alle Swap-Partitionen in / etc / fstab gemountet werden
  2. Lauf pdisk /dev/disk? -dump
    • "?" Ist die Festplattennummer Ihres Festplattenlaufwerks die Nummer neben der Swap-Partition?
  3. Bearbeiten oder erstellen Sie / etc / fstab (es existiert wahrscheinlich nicht) und fügen Sie eine Zeile hinzu wie /dev/disk?s?? none swap sw 0 0
    • ? ist deine Festplatte.
    • ?? ist die Nummer der Swap-Partition.
  4. neustarten.
Maximale Kraft
quelle