Warum Diskussionen von „swappiness“ wirkt wie Informationen können nur zu einem Zeitpunkt an einem Ort sein?

StackOverflow https://stackoverflow.com/questions/147125

Frage

Ich habe auf Linux „swappiness“ abstimmbare Lesen auf, die steuert, wie aggressiv der Kernel auf der Festplatte ist das Gedächtnis über Swapping-Anwendungen, wenn sie nicht verwendet werden. Wenn Sie den Begriff Google, erhalten Sie viele Seiten wie dieser Diskussion der Vor- und Nachteile. Auf den Punkt gebracht, so das Argument wie folgt aus:

  

Wenn Ihr swappiness zu niedrig ist, inaktive Anwendungen werden alle auf den Systemspeicher in Beschlag nehmen, dass andere Programme verwenden möchten.

     

Wenn Ihr swappiness zu hoch ist, wenn Sie diese inaktiven Anwendungen aufwachen, es geht um eine große Verzögerung sein, wie ihr Zustand wieder aus der Platte gelesen wird.

Dieses Argument Sinn für mich nicht machen. Wenn ich eine inaktive Anwendung, die eine Tonne Speicher verwenden, warum nicht die Kernel-Seite seiner Speicher auf der Festplatte und läßt eine weitere Kopie dieser Daten im Speicher? Dies scheint das Beste aus beiden Welten zu geben: wenn eine andere Anwendung, dass der Speicher benötigt, kann sie sofort den physischen RAM Anspruch und beginnen, um es zu schreiben, da eine weitere Kopie davon auf der Festplatte und kann wieder in getauscht werden, wenn die inaktive Anwendung geweckt wird Nach oben. Und wenn die ursprüngliche App aufwacht, kann verwendet werden, eine seiner Seiten, die noch im RAM sind, wie sie ist, ohne dass sie von der Platte ziehen zu müssen.

Oder bin ich etwas fehlt?

War es hilfreich?

Lösung

Nach diesem 1 das ist genau das, was Linux der Fall ist.

Ich versuche immer noch Sinn einer Menge davon zu machen, so dass alle autoritativen Links geschätzt würden.

Andere Tipps

  

Wenn ich eine inaktive Anwendung, die eine Tonne Speicher verwenden, warum nicht die Kernel-Seite seine Speicher auf der Festplatte und läßt eine weitere Kopie dieser Daten im Speicher?

Lassen Sie uns sagen wir es getan haben. Wir schrieben die Seite auf der Festplatte, aber es in Erinnerung hinterlassen. Eine Weile später ein anderer Prozess benötigt Speicher, so wollen wir die Seite aus dem ersten Prozess zu.

Wir müssen mit absoluter Sicherheit wissen, ob der erste Prozess die Seite geändert hat, seit sie auf die Festplatte geschrieben wurde. Wenn ja, müssen wir es wieder auszuschreiben. Die Art, wie wir das verfolgen würde, ist der Prozess des Schreibrechte auf die Seite zurück zu nehmen, wenn wir es zuerst auf die Festplatte geschrieben werden. Wenn der Prozess wieder auf der Seite zu schreiben versucht, es wird ein Seitenfehler sein. Der Kernel kann beachten Sie, dass der Prozess die Seite dirtied hat (und wird deshalb wieder ausgeschrieben werden müssen), bevor die Schreibberechtigung Wiederherstellung und ermöglicht die Anwendung fortzusetzen.

Darin liegt das Problem. Wegnehmen Schreibberechtigung von der Seite ist eigentlich etwas teuer, vor allem in Multi-Prozessor-Maschinen. Es ist wichtig, dass alle CPUs ihre Cache-Seite Übersetzungen reinigen, um sicherzustellen, dass sie die Schreibberechtigung wegzunehmen.

Wenn der Prozess auf der Seite schreibt, einen Seitenfehler nehmen ist noch teurer. Ich würde davon ausgehen, dass eine nicht-triviale Anzahl dieser Seiten enden würde, dass Fehler nehmen, die in die Gewinn essen wir gesucht hat, indem sie es in Erinnerung zu verlassen.

So ist es lohnt sich? Ich weiß es wirklich nicht. Ich versuche nur zu erklären, warum im Speicher die Seite verlassen nicht so offensichtlich ein Gewinn ist, wie es klingt.

(*) Diese ganze Sache ist sehr ähnlich zu einem Mechanismus namens Copy-on-Write, die verwendet wird, wenn ein Prozess fork () s. Das Kind Prozess ist sehr wahrscheinlich, geht nur ein paar Anweisungen und Aufruf exec () auszuführen, so dass es wäre dumm, all Eltern Seiten zu kopieren. Stattdessen werden die Schreibrechte weggenommen und das Kind einfach laufen gelassen. Copy-on-Write ist ein Gewinn, weil die Seitenfehler so gut wie nie genommen: das Kind fast immer ruft exec () sofort

.

Auch wenn Sie Seite die apps Speicher auf der Festplatte und halten Sie sich in Erinnerung, Sie immer noch entscheiden würden, wenn eine Anwendung „inaktiv“ betrachtet werden soll, und das ist, was swapiness Kontrollen. Paging auf der Festplatte ist teuer in Bezug auf den IO und Sie wollen es nicht zu häufig tun. Es ist auch eine andere Variable auf dieser Gleichung, und das ist die Tatsache, dass die Linux-Speicher als Plattenpuffer / Cache verbleibenden Verwendungen.

Das erste, was die VM tut, ist sauber Seiten und sie auf die saubere Liste.
Wenn anonyme Speicherbereinigung (Dinge, die keine tatsächlichen Dateisicherungsspeicher haben, können Sie die Segmente in / proc // Karten sehen, die anonym sind und hinter ihnen kein Dateisystem V-Knoten Speicher), ist das erste, was die VM nur zu tun ist nehmen Sie die „schmutzigen“ Seiten und „reinigen“, dann durch den Inhalt der Seite zu schreiben, um zu tauschen. Nun, wenn die VM einen Mangel an völlig freien Speicher hat und macht sich Sorgen um seine Fähigkeit, neue freie Seiten zu gewähren, verwendet wird, kann es durch die Liste der ‚sauberer‘ Seiten gehen und je nachdem, wie vor kurzem wurden sie verwendet und welche Art von Speicher sie sind es, diese Seiten in der freien Liste.

Sobald die Speicherseiten auf der freien Liste platziert sind, sie sind nicht mehr im Zusammenhang mit dem Inhalt, bevor sie hatten. Wenn ein Programm kommt entlang einer verweist auf den Speicherort der Seite wurde zuvor das Programm dient ein schwerwiegender Fehler übernehmen und eine (höchstwahrscheinlich völlig andere) Seite wird von der freien Liste und die Daten gepackt werden in die Seite von der Festplatte gelesen werden. Sobald dies geschehen ist, ist die Seite eigentlich noch ‚sauber‘, da sie nicht geändert wurde. Wenn die VM die Seite auf Swap für eine andere Seite im RAM zu verwenden, wählt dann würde die Seite wieder ‚beschmutzt‘ oder wenn die App auf der Seite geschrieben würde es dirtied 'sein. Und dann beginnt der Prozess erneut.

Auch swappinness ist ziemlich schrecklich für Server-Anwendungen in einem Unternehmen / Transaktions- / online / Latenz-sensiblen Umgebung. Wenn ich 16 GB RAM Boxen habe, wo ich nicht viel von Browsern und GUIs laufen, möchte ich alle in der Regel meine apps fast in Speicher fixiert. Der größte Teil meiner RAM neigt 8-10GB Java-Haufen zu sein, die I NIE auf der Festplatte ausgelagert werden soll, überhaupt, und die cruft, die verfügbar ist sind Prozesse wie mingetty (aber auch dort die glibc Seiten in diesen Anwendungen wird von anderen Anwendungen geteilt und tatsächlich verwendet werden, so dass selbst ist die RSS-Größe dieser nutzlosen Prozesse meist geteilt, verwendet Seiten). Ich normalerweise nicht sehen, mehr als ein paar 10Mbs der 16 GB zu tauschen tatsächlich gereinigt. Ich würde sehr, sehr niedrig swappiness Zahlen oder Null swappiness für Server raten - die noch nicht genutzten Seiten sollte ein kleiner Bruchteil des gesamten RAM sein und versuchen, diese relativ kleine Menge an RAM für Puffer-Cache zurückzufordern Risiken Anwendungsseiten tauschen und unter Latenz Hits in die laufende App.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top