Linux-Lesezugriff zurück in den Arbeitsspeicher übertragen

28

Der Linux-Kernel tauscht die meisten Seiten aus dem Speicher aus, wenn ich eine Anwendung ausführe, die den größten Teil des physischen Speichers von 16 GB verwendet. Nach Abschluss der Anwendung dauert jede Aktion (Eingeben von Befehlen, Wechseln von Arbeitsbereichen, Öffnen einer neuen Webseite usw.) sehr lange, da die relevanten Seiten erst vom Swap wieder eingelesen werden müssen.

Gibt es eine Möglichkeit, den Linux-Kernel anzuweisen, Seiten aus dem Auslagerungsspeicher zurück in den physischen Speicher zu kopieren, ohne jede Anwendung manuell zu berühren (und auf sie zu warten)? Ich führe viele Anwendungen aus, so dass das Warten immer schmerzhaft ist.

Ich verwende oft swapoff -a && swapon -a, um das System wieder reaktionsfähig zu machen, aber dies löscht die Seiten aus dem Swap, so dass sie beim nächsten Ausführen des Skripts erneut geschrieben werden müssen.

Gibt es eine Kernel-Schnittstelle, die möglicherweise sysfs verwendet, um den Kernel anzuweisen, alle Seiten von Swap zu lesen?

Edit: Ich suche in der Tat einen Weg, um alle Swap Swap-fähig zu machen. (Danke derobert!)

[PS serverfault.com/questions/153946/… und serverfault.com/questions/100448/… sind verwandte Themen, beschäftigen sich jedoch nicht mit der Frage, wie der Linux-Kernel Seiten aus dem Swap zurück in den Speicher kopieren kann, ohne den Swap zu löschen.]

Drrossum
quelle
Sie möchten, dass der gesamte Swap ein Cache des Systemspeichers ist? Sie möchten also ein Image des Systemspeichers, das Sie nach Belieben neu laden können? Im Grunde funktioniert der Ruhezustand so: Das System erstellt ein Image seines Speichers auf der Festplatte, schaltet sich aus und stellt das Image beim Einschalten wieder her. Gibt es eine Chance, denken Sie, dass bei einer Abfrage nach diesem Thread für Sie hilfreich sein könnte? Wenn Sie zum Beispiel ein Image Ihres Speichers erstellen möchten, deaktivieren Sie Swap, führen Sie eine Aufgabe aus, stellen Sie das Image wieder her und wiederholen Sie den Vorgang.
mikeserv
Ich glaube nicht, dass dies Swap in einem Swap-Status belassen würde. Insofern scheint mir Ihr Vorschlag eine Alternative für die Swapoff-Swapon-Methode zu sein.
Drrossum
Nein, der Swap wird nicht zwischengespeichert (was für mich zugegebenermaßen etwas seltsam ist), sondern der Arbeitsspeicher wird an einer Stelle zwischengespeichert, die Sie für am wesentlichsten erachten. Anschließend wird der gesamte Systemspeicher für eine intensive Aufgabe verwendet, bevor der Cache wiederhergestellt wird, wenn der Aufgabe ist erledigt. Wenn Sie während der intensiven Aufgabe tauschen möchten, verlangsamen Sie diese Aufgabe nur - Sie benötigen zusätzliche Zeit, um die Seiten auszutauschen, während Sie fortfahren.
mikeserv

Antworten:

4

Basierend auf dem Memdump-Programm, das ursprünglich hier gefunden wurde , habe ich ein Skript erstellt, um bestimmte Anwendungen selektiv zurück in den Speicher zu lesen. remember:

#!/bin/bash
declare -A Q
for i in "$@"; do
    E=$(readlink /proc/$i/exe);
    if [ -z "$E" ]; then.
        #echo skipped $i;.
        continue;.
    fi
    if echo $E | grep -qF memdump; then.
        #echo skipped $i >&2;.
        continue;.
    fi
    if [ -n "${Q[${E}]}" ]; then.
        #echo already $i >&2;.
        continue;.
    fi
    echo "$i $E" >&2
    memdump $i 2> /dev/null
    Q[$E]=$i
done | pv -c -i 2 > /dev/null

Verbrauch: so etwas wie

# ./remember $(< /mnt/cgroup/tasks )
1 /sbin/init
882 /bin/bash
1301 /usr/bin/hexchat
...
2.21GiB 0:00:02 [ 1.1GiB/s] [  <=>     ]
...
6838 /sbin/agetty
11.6GiB 0:00:10 [1.16GiB/s] [      <=> ]
...
23.7GiB 0:00:38 [ 637MiB/s] [   <=>    ]
# 

Es überspringt schnell nicht ausgelagerten Speicher (Gigabyte pro Sekunde) und verlangsamt sich, wenn ein Auslagerungsvorgang erforderlich ist.

Vi.
quelle
Dieses Tool macht genau das, wonach ich gesucht habe. Vielen Dank!
Drrossum
Eine nette Sache ist, meiner Beobachtung nach, dass ausgelagerte Seiten in den RAM kopiert werden, aber nicht aus dem Swap gelöscht werden (zumindest die meisten nicht, da die Auslagerungsnutzung nur geringfügig abnimmt). Meine Interpretation ist, dass Linux zwei Kopien jeder Seite aufbewahrt, eine im RAM und eine im Swap. Wenn dies richtig gehandhabt wird, ist es sogar besser, als den Austausch abzubrechen und erneut hinzuzufügen, da dann, wenn eine Doppelseite erneut ausgetauscht werden muss, keine weitere Kopie erforderlich ist. Vielen Dank an jeden Kernel-Experten, der das bestätigen kann.
Giovanni Mascellani
11

Es könnte helfen, aufzusteigen /proc/sys/vm/page-cluster(Standard: 3).

Aus der Kerneldokumentation ( sysctl/vm.txt):

Seiten-Cluster

Der Seitencluster steuert die Anzahl der Seiten, bis zu der aufeinanderfolgende Seiten in einem einzigen Versuch vom Auslagerungsvorgang eingelesen werden. Dies ist das Swap-Gegenstück zum Page-Cache-Readahead. Die erwähnte Konsekutivität bezieht sich nicht auf virtuelle / physische Adressen, sondern auf aufeinanderfolgende Swap-Space-Adressen - das heißt, sie wurden gemeinsam ausgetauscht.

Es ist ein logarithmischer Wert - wenn Sie ihn auf Null setzen, bedeutet dies "1 Seite", wenn Sie ihn auf 1 setzen, bedeutet dies "2 Seiten", wenn Sie ihn auf 2 bedeuten, bedeutet dies "4 Seiten" usw. Null deaktiviert Swap Readahead vollständig.

Der Standardwert ist drei (jeweils acht Seiten). Es kann einige kleine Vorteile haben, dies auf einen anderen Wert abzustimmen, wenn Ihre Arbeitsauslastung sehr umfangreich ist.

Niedrigere Werte bedeuten geringere Latenzen für anfängliche Fehler, aber gleichzeitig zusätzliche Fehler und E / A-Verzögerungen für nachfolgende Fehler, wenn sie Teil dieser aufeinanderfolgenden Seiten gewesen wären, die zuvor gelesen wurden.

In der Dokumentation wird kein Limit erwähnt, daher könnten Sie dieses absurd hoch setzen, damit der gesamte Swap sehr bald wieder eingelesen wird. Und natürlich danach wieder auf einen vernünftigen Wert einstellen.

derobert
quelle
Dies klingt nach einer nützlichen Problemumgehung. Die beiden manuellen Eingriffe können mit einem Schlafbefehl kombiniert werden, um einen einzelnen Benutzereingriff zu erhalten. Es muss jedoch nicht unbedingt sein, dass alle Auslagerungen sehr schnell zwischengespeichert werden, da sie nur nacheinander von der Seite gelesen werden, auf die zugegriffen wird. Es ist jedoch die bisher beste Lösung. Vielen Dank!
Drrossum
Dies ist wahrscheinlich die beste Lösung, die Sie bekommen werden. Ich habe noch nie davon gehört, aber es sieht so aus, als würde es das Swap-In in eine Reihe großer IOPs verwandeln und nicht in einen fortlaufenden Satz kleiner IOPs. Dies ist wahrscheinlich der Grund für Ihre Leistungsprobleme. Ich wäre zu Recht überrascht, wenn es etwas gäbe, das perfekt zu Ihrer individuellen Situation passt.
Bratchley
Wenn Sie aufgrund vieler kleiner aufeinanderfolgender Swap-Ins eine Verlangsamung feststellen, kann bereits eine permanente Anpassung des page-clusterWerts die Leistung verbessern.
Ilmari Karonen
5

Sie können versuchen, die Programme, die Sie am meisten interessieren , einer C-Gruppe hinzuzufügen und swappiness so zu optimieren , dass es weniger wahrscheinlich ist, dass die Programme, die Sie hinzufügen, beim nächsten Ausführen der Anwendung als Kandidaten für den Austausch in Frage kommen.

Einige ihrer Seiten werden wahrscheinlich noch ausgetauscht, aber es kann zu Problemen mit der Leistung kommen. Ein großer Teil davon ist wahrscheinlich nur das "Stop and Start" -Verhalten, wenn viele Seiten eines Programms ausgetauscht werden und das Programm ständig pausieren muss, um seine Seiten in RAM zu tauschen, jedoch nur in 4-KB-Schritten.

Alternativ können Sie die ausgeführte Anwendung einer cgroup hinzufügen und swappiness so einstellen, dass die Anwendung die am häufigsten verwendete Auslagerungsdatei ist. Die Anwendung wird verlangsamt, aber der Rest des Systems wird geschont.

Bratchley
quelle
4

Mir scheint, dass Sie das System nicht auf magische Weise "wieder reaktionsfähig machen" können. Sie müssen entweder die Strafe zahlen oder Seiten aus dem Auslagerungsspeicher in den Speicher zurücklesen, oder Sie müssen sie später bezahlen, aber auf die eine oder andere Weise müssen Sie sie bezahlen. In der Tat, wenn Sie so etwas tun, swapoff -a && swapon -averspüren Sie möglicherweise mehr Schmerzen als weniger, weil Sie erzwingen, dass einige Seiten zurück in den Speicher kopiert werden, die andernfalls nie wieder benötigt worden wären und schließlich gelöscht würden, ohne gelesen zu werden (denken Sie: Sie beenden eine Anwendung, während ein Großteil des Heaps ist ausgelagert, diese Seiten können gänzlich verworfen werden, ohne jemals in den Speicher zurückgelesen zu werden.

Dadurch werden die Seiten jedoch vom Auslagerungsmodus befreit, sodass sie beim nächsten Ausführen des Skripts erneut geschrieben werden müssen.

Nun, so ziemlich jede Seite, die vom Auslagern in den Hauptspeicher zurückkopiert wird, wird sowieso geändert. Wenn sie also in Zukunft zum erneuten Auslagern zurückgezogen werden müsste, müsste sie sowieso neu im Auslagerungsmodus geschrieben werden. Denken Sie daran, dass Swap hauptsächlich aus Heapspeicher und nicht aus schreibgeschützten Seiten besteht (die normalerweise dateibasiert sind).

Ich denke, Ihr swapoff -a && swapon -aTrick ist so gut wie alles, was Sie sich vorstellen können.

Celada
quelle
Das sind zwei von uns, die zur gleichen Zeit genau dasselbe sagen;)
Goldlöckchen
@goldilocks Ja, ich sah deine Antwort erscheinen, bevor meine fertig war, aber ich war bereits fertig, also blieb ich dabei :-)
Celada
Sie und Goldlöckchen sagen dasselbe, aber ich glaube nicht, dass Swap-Caching so funktioniert. Ich verstehe, dass Sie gleichzeitig Seiten im Swap-AND-Speicher haben können. Die Auslagerungsseite wird erst ungültig, wenn die Seite im Speicher aktualisiert wurde.
Drrossum
Ich vertraue darauf, dass die Antwort, auf die Sie sich von David Spillett bezogen haben, richtig ist: Sie können zwar eine Seite gleichzeitig im Swap- und RAM-Speicher haben ... aber nur, bis die RAM-Version geändert wird. Dann müssen Sie die veraltete Kopie in Swap verwerfen. Als ich sagte, dass "so ziemlich jede Seite, die von Swap zurückkopiert wird, [...] sowieso geändert wird", gehe ich davon aus, dass dies die meiste Zeit passiert, also erwarte ich keine Seiten in beiden Orten ein bedeutender Bruchteil zu sein, über den man sich Sorgen machen sollte.
Celada
Ihr Nutzungsszenario ist möglicherweise anders: Möglicherweise haben Sie viele Anwendungen mit großen Haufen, die häufig gelesen und nicht geschrieben werden. Mein Gefühl ist, dass die meisten Menschen kein solches Szenario haben. Aber wenn Sie das tun, haben Sie wohl Recht: Es swapoff -a && swapon -awird nicht gut für Sie sein. In diesem Fall benötigen Sie wahrscheinlich etwas, /proc/<each-process>/memdas jede Seite des Speichers scannt und liest, um sicherzustellen, dass sie im RAM vorhanden ist. Ich weiß nicht, ob das existiert.
Celada
0

Es gibt eine sehr nette Diskussion hier http://rudd-o.com/de/linux-und-freie-software/tales-from-responsivenessland-why-linux-feels-slow-and-how-to-fix-that Dies läuft darauf hinaus, die Reaktionsfähigkeit des Systems zu verringern und das Auslagern des Codes zu verhindern (und genau das passiert). Dies ist keine wirkliche Antwort auf Ihre Frage, aber dies kann das Auftreten des Problems verhindern (Ihre Anwendungen werden einfach nicht ausgetauscht, nur nicht verwendete Daten und Seiten-Cache).

Fedxa
quelle
Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
slm