Ich benutze Unix schon seit geraumer Zeit, und in den letzten Jahren hatte ich das Gefühl, dass Swap ein Anachronismus ist, aber ich wäre neugierig, was andere Leute darüber denken.
Mein Argument ist in etwa so (unter der Annahme, dass kein globales ulimit oder an den OOM-Einstellungen herumgewirbelt wird):
There is little value in swap because if you need to swap out to disk,
odds are it's going to be a vicious cycle where an app will continue
to eat not only real memory, but swap as well until it gets OOM
reaped (_if_ it gets OOM reaped).
If you have swap enabled, it will only prolong this death march to
the detriment of other processes - and in the worst case where the
process is not OOM reaped in a timely manner, grind the system to
a halt.
Without swap, it will probably get OOM reaped sooner (if at all)
Für jeden Dienst, der auf Leistung getrimmt ist, würde ich denken, dass das Verständnis der Obergrenzen seiner Ressourcennutzung der Schlüssel zu seiner Optimierung wäre. In diesem Fall wissen Sie, wie viel Sie benötigen.
Ich kann mir nicht viele Situationen vorstellen (einige, aber nicht viele), in denen Sie einen laufenden Prozess anhalten und auslagern könnten, um Platz für andere Dinge zu schaffen, aber Sie würden immer noch Ihre Sockets verlieren, wenn Sie das tun, also a erzwingen Core-Dump über gcc oder das Kopieren des Speichers von Hand wäre funktional gleichwertig.
Ich möchte auf keinen Fall ein eingebettetes System austauschen (auch wenn es möglicherweise einen kleineren verfügbaren Arbeitsspeicher hat). Wenn Ihnen der Arbeitsspeicher ausgeht, würde ich lieber meinen Prozess sterben lassen, als einen Flash-Speicher mit einer Million Schreibvorgängen pro Sektor zu zerreißen Fahren Sie über ein Wochenende, indem Sie die Sektoren bis auf den Kern nivellieren.
Irgendwelche Unix-Bärte da draußen haben irgendwelche zwingenden Gründe, um weiter herumzutauschen?
UPDATE Antworten &&Analyse:
-
BESTÄTIGT? – fork() benötigt für den Kindprozess genauso viel Speicher wie der Elternprozess
Modern fork() ist Copy-on-Write für Kinder unter POSIX (allgemein), aber speziell für Linux und FreeBSD, und ich gehe extrapoliert von OSX aus. Ich betrachte dies als Teil des anachronistischen Gepäcks, das der Tausch mit sich führt.
Seltsamerweise behauptet dieser Solaris-Artikel, dass Sie, obwohl Solaris Copy-on-Write mit fork() verwendet, mindestens 2x (!) haben sollten die übergeordnete Prozessgröße im freien virtuellen Speicher, damit die fork() nicht in der Mitte scheißt. Während das Solaris-Element etwas widerlegt das Argument, dass Swap ein Anachronismus ist – ich denke, dass genug Betriebssysteme CoW korrekt so implementieren, dass es wichtiger ist, den Mythos zu zerstreuen, als ihn als weitere Rechtfertigung für Swap zu markieren. Seit. Seien wir ehrlich. Zu diesem Zeitpunkt sind die Leute, die Solaris tatsächlich verwenden, wahrscheinlich nur Oracle-Leute. Nichts für ungut, Solaris!
-
BESTÄTIGT – tmpfs/ramfs-Dateien können bequem ausgetauscht werden, wenn tmpfs/ramfs voll ist
Verwenden Sie keine no-limit tmpfs/ramfs! Definieren Sie immer explizit die Menge an RAM, die tmpfs/ramfs verwenden soll.
-
PLAUSABLE – Haben Sie einen kleinen Tausch, „nur für den Fall“
Einer meiner alten Chefs hatte einmal ein tolles Sprichwort:„Man weiß nicht, was man nicht weiß“ – im Grunde kann man keine Entscheidung auf der Grundlage von Informationen treffen, die man noch nicht hat. Dies ist jedoch für mich ein plausibles Argument für swap – ich vermute, dass die Art von Dingen, die Sie tun würden, um festzustellen, ob Ihre Anwendung auslagert oder nicht, schwerer wäre, als zu prüfen, ob malloc() erfolgreich ist, oder die Ausnahme abzufangen ein fehlgeschlagenes new().
Dies kann in Fällen nützlich sein, in denen Sie einen Desktop ausführen und eine Reihe zufälliger Dinge am Laufen haben, aber selbst wenn etwas verrückt wird, würde ich lieber OOM ernten, als in die Tauschhölle einzutauchen. Das bin nur ich.
-
AUSGEFALLEN! – Auf Solaris , tauschen ist aus mehreren Gründen wichtig
tmpfs – gibt an Die Menge an freiem Speicherplatz, die tmpfs zur Verfügung steht, hängt von der Menge an nicht zugeordnetem Auslagerungsspeicher im System ab. Die Größe eines tmpfs-Dateisystems wächst, um die darin geschriebenen Dateien aufzunehmen, aber es gibt einige inhärente Kompromisse für intensive Benutzer von tmpfs. Tmpfs teilt Ressourcen mit den Daten- und Stapelsegmenten ausführender Programme. Die Ausführung sehr großer Programme kann beeinträchtigt werden, wenn tmpfs-Dateisysteme nahe an ihrer maximal zulässigen Größe liegen. Es steht Tmpfs frei, den gesamten Auslagerungsbereich des Systems bis auf 4 MB zuzuweisen.
Solaris-Fakten und -Mythen über Swap – Staaten Virtual Memory besteht heute aus der Gesamtsumme von physischem RAM und Swap-Speicherplatz auf der Festplatte. Solaris erfordert KEINE Konfiguration von Auslagerungsspeicher. Wenn Sie diese Option wählen, können Sie keine neuen Prozesse mehr starten, sobald der Arbeitsspeicher voll ist. .
Ich bin mir nicht sicher, ob dies bedeutet, dass die maximale virtuelle Karte, die Sie erstellen können, ram+swap ist , oder wenn Sie immer noch so etwas wie mmap() eine Datei größer als ram machen und sich auf die verzögerte Initialisierung von mmap() verlassen könnten. Während Sie Solaris heutzutage wahrscheinlich ohne Swap ausführen können, scheint es, als wäre es weniger freundlich als andere POSIXy-Betriebssysteme.
-
AUSGEFALLEN! Beliebte Linux-Hibernation-Tools scheinen sich auf Swap zu verlassen
Standardmäßig sieht TuxOnIce so aus, als wäre es für den Ruhezustand auf Swap angewiesen – obwohl es andere Backends gibt. Wenn Sie jedoch keine Box betreiben, die in den Ruhezustand versetzt werden muss, würde ich immer noch hinter der Aussage stehen, dass „Swap unter Linux anakronistisch ist“
Akzeptierte Antwort:
Verwechseln Sie nicht (das) Swap (als Festplattenbereich) und (to) Swap (als Methode, um Speicherseiten vom RAM auf die Festplatte und umgekehrt zu verschieben).
Exzessives Auslagern sollte aus Leistungsgründen vermieden werden, aber einen Auslagerungsbereich zu haben ist nicht unbedingt ein Problem.
Auf Systemen wie Linux, die Arbeitsspeicher überschreiben, d. h. die Prozessen erlauben, mehr Arbeitsspeicher als verfügbar zuzuweisen, wird der OOM-Killer ausgelöst, wenn der Arbeitsspeicher ausgeht und nicht genügend Swap vorhanden ist, um die Situation zu bewältigen. Sie müssen dem Algorithmus vertrauen, der verwendet wird, um den „richtigen“ Prozess zum Beenden auszuwählen, und akzeptieren, dass einer oder mehrere Ihrer Prozesse beendet werden, ohne dass Sie die Möglichkeit haben, ordnungsgemäß herunterzufahren. Hier ist eine berühmte Analogie, die erklärt, warum der OOM-Killer überhaupt keine gute Idee ist.
Auf Systemen wie Solaris, die Speicher nicht überschreiben, d. h. sicherstellen, dass eine Speicherreservierung immer durch virtuellen Speicher unterstützt wird, sei es im RAM oder auf der Festplatte, ist es unbedingt erforderlich, über einen ausreichenden Auslagerungsbereich zu verfügen, da sonst ein möglicherweise erheblicher Teil des RAM vorhanden ist verschwendet.
Verwandte:Linux – Partitionsgröße für 4 GB RAM tauschen?