Wie nutze ich Swap Space nur für Notfälle?

41

Ich habe einen Debian (Buster) Laptop mit 8 GB RAM und 16 GB Swap. Ich leite eine sehr lange laufende Aufgabe. Dies bedeutet, dass mein Laptop in den letzten sechs Tagen nicht benutzt wurde, während er durchläuft.

Dabei muss ich regelmäßig meinen Laptop als Laptop verwenden. Dies sollte kein Problem sein. Die Aufgabe, die lange ausgeführt wird, ist E / A-gebunden, arbeitet auf einer USB-Festplatte und benötigt nicht viel RAM (<200 MB) oder CPU (<4%).

Das Problem ist, wenn ich nach ein paar Stunden zu meinem Laptop zurückkehre, wird es sehr träge und es kann 30 Minuten dauern, bis ich wieder normal bin. Dies ist so schlimm, dass Crash-Monitore ihre jeweiligen Anwendungen als eingefroren markieren (insbesondere Browserfenster) und die Dinge fangen fälschlicherweise an, abstürzen zu lassen.

Wenn man auf den Systemmonitor schaut, wird von den 2,5 GB, die verwendet werden, ungefähr die Hälfte in den Swap verschoben. Ich habe bestätigt, dass dies das Problem ist, indem ich den Swap Space ( swapoff /dev/sda8) entferne . Wenn ich es ohne Swap-Platz lasse, wird es auch nach 24 Stunden fast augenblicklich wieder lebendig. Mit Swap ist es praktisch ein Ziegelstein für die ersten fünf Minuten, nachdem es nur noch sechs Stunden gedauert hat. Ich habe bestätigt, dass die Speichernutzung 3 GB nicht überschreitet, auch wenn ich nicht da bin.

Ich habe versucht, den Swappiness ( siehe auch: Wikipedia ) auf Werte von 10und zu reduzieren 0, aber das Problem besteht weiterhin. Es scheint, dass der Kernel nach einem Tag der Inaktivität glaubt, dass die gesamte GUI nicht mehr benötigt wird, und löscht sie vom RAM (tauscht sie auf die Festplatte aus). Die langwierige Aufgabe besteht darin, einen riesigen Dateibaum zu durchsuchen und jede Datei zu lesen. Es könnte also sein, dass der Kernel verwirrt darüber ist, dass Caching helfen würde. Bei einem einzigen Durchlauf einer 2-TB-USB-Festplatte mit ca. 1 Milliarde Dateinamen wird ein zusätzlicher GB-RAM die Leistung jedoch nicht wesentlich verbessern. Dies ist ein billiger Laptop mit einer schleppenden Festplatte. Es kann einfach nicht schnell genug Daten in den RAM zurückladen.

Wie kann ich Linux anweisen, Swap Space nur im Notfall zu verwenden? Ich möchte nicht ohne Tausch laufen. Wenn etwas Unerwartetes passiert und das Betriebssystem plötzlich ein paar zusätzliche GB benötigt, möchte ich nicht, dass Aufgaben abgebrochen werden, und bevorzuge die Verwendung von Swap. Im Moment kann mein Laptop jedoch nicht verwendet werden, wenn ich die Swap-Funktion aktiviert lasse.

Die genaue Definition eines "Notfalls" könnte umstritten sein. Aber um zu verdeutlichen, was ich meine: Ein Notfall wäre, wenn das System keine andere Option hat, als Prozesse auszutauschen oder zu beenden.


Was ist ein Notfall? - Müssen Sie wirklich fragen? ... Ich hoffe, Sie befinden sich nie in einem brennenden Gebäude!

Es ist mir nicht möglich, alles zu definieren, was in dieser Frage einen Notfall darstellen könnte. Ein Notfall kann jedoch beispielsweise dann eintreten , wenn der Kernel so überlastet ist, dass er Prozesse mit dem OOM Killer beendet . Ein Notfall liegt NICHT vor, wenn der Kernel denkt, dass er die Leistung durch die Verwendung von Swap verbessern kann.


Final Edit: Ich habe eine Antwort akzeptiert, die genau das tut, wonach ich auf Betriebssystemebene gefragt habe. Zukünftige Leser sollten auch die Antworten beachten, die Lösungen auf Anwendungsebene bieten.

Philip Couling
quelle
11
Definieren Sie "Notfall" und sagen Sie etwas darüber, wie sich dies von jeder gewöhnlichen Situation unterscheidet, in der Swap verwendet wird.
Kusalananda
4
Ich wollte wissen, ob Sie irgendwie einen speziellen Typ eines "Notfallereignisses" außerhalb der Grenzen definieren möchten, bei dem der Kernel Swap verwenden kann, dieser Swap jedoch ansonsten nicht verwendet wird. AFAIK paging out memory ist etwas, das langsam ist und sowieso nur "in Notfällen" durchgeführt wird, und das "swappiness" Ding ist das einzige, mit dem Sie dieses Verhalten anpassen können (aber ich bin kein Linux-Benutzer).
Kusalananda
2
Nein, das stimmt nicht. Es wird nicht nur in Notfällen gemacht. Zumindest dachte ich, dass meine Frage deutlich machte, dass ich nur 3 GB von 8 GB verwendet habe ... Das ist kaum ein Notfall, aber der Kernel tauscht trotzdem. Ich schlage vor, Sie informieren sich über Swappiness und die umliegenden Themen. Über die verschiedenen Gründe für den Tausch wird viel diskutiert. Es ist plausibel, dass ich nach einem Konzept frage, das im Kernel nicht vorhanden ist, aber meine Gründe dafür sind hinreichend begründet.
Philip Couling
4
Ich erkenne, dass der Rat immer "nie ohne Tausch laufen" war. Die Speichergröße hat jedoch die Lese- / Schreibgeschwindigkeit der Festplatte (HDD nicht SSD) herabgesetzt, was bedeutet, dass der Austausch zunehmend eine schlechte Idee ist. Es fühlt sich so an, als ob einige glauben, dass 8 GB RAM + 8 GB Swap 16 GB RAM + 0 Swap ausführen werden. Wenn dies wirklich der Fall ist, stimmt etwas nicht mit dem Linux-Kernel.
Philip Couling
7
@Philip Couling: Nein, der Punkt ist, dass 16 GB RAM + 16 GB Swap 16 GB und 0 Swap übertreffen werden - besonders wenn Ihr Code zufällig 17 GB Speicher benötigt :-)
jamesqf

Antworten:

11

Heutzutage ist es oft eine schlechte Idee, einen so großen Swap zu haben. Als das Betriebssystem nur ein paar GB Arbeitsspeicher für den Austausch austauschte, war Ihr System bereits vollständig gecrawlt (wie Sie es gesehen haben).

Es ist besser , zu verwenden zrammit einer kleinen Backup - Swap - Partition . Viele Betriebssysteme wie ChromeOS, Android und verschiedene Linux-Distributionen haben zram seit Jahren standardmäßig aktiviert, insbesondere für Systeme mit weniger RAM. Es ist viel schneller als das Auswechseln der Festplatte, und Sie können die Reaktionsfähigkeit des Systems in diesem Fall deutlich spüren. Weniger auf einer SSD, aber laut den Benchmark-Ergebnissen hier scheint es sogar mit dem Standard-LZO-Algorithmus noch schneller zu sein. Sie können zu lz4 wechseln, um eine noch bessere Leistung mit etwas weniger Komprimierungsrate zu erzielen . Die Dekodierungsgeschwindigkeit ist fast fünfmal schneller als bei LZO, basierend auf dem offiziellen Benchmark

Es gibt auch, zswapobwohl ich es nie benutzt habe. Wahrscheinlich einen Versuch wert und vergleichen, welches für Ihre usecases besser ist

Danach besteht ein weiterer Vorschlag darin , die Priorität dieser E / A-gebundenen Prozesse zu verringern und möglicherweise ein Terminal mit höherer Priorität laufen zu lassen, damit Sie sofort Befehle ausführen können, auch wenn das System stark ausgelastet ist

Weitere Lektüre

phuclv
quelle
Nur damit ich verstehe, sagen Sie, dass ich ein zramBlockgerät erstellen kann, es als Swap verwenden kann, mit einem Swap mit niedrigerer Priorität als die Festplattenpartition?
Philip Couling
@PhilipCouling Wenn Sie eine Festplatte verwenden, sollten Sie auf jeden Fall einen ZRAM oder ähnliche Lösungen verwenden. Die Priorität des Austauschs sollte niedriger als die von zram sein, sodass Linux zuerst versucht, das zram zu verbrauchen, und dann den Austausch berücksichtigt. Wenn Sie Ubuntu verwenden, kümmert sich das zram-config-Paket bereits um die Prioritätseinstellungen für Sie
phuclv
3
Ich akzeptiere diese Antwort, weil sie genau das zu tun scheint, wonach ich gefragt habe. Wenn ich meinen 16-GB-Swap immer noch mit reduzierter Priorität aktiviert habe, wird er vom Kernel nur verwendet, wenn zswap erschöpft ist. IE: "im Notfall". Beachten Sie, dass dies bei Debian-Buster sehr einfach einzurichten ist, indem Sie einfach die ZRAM-Tools installieren.
Philip
25

Eine Korrektur besteht darin, sicherzustellen, dass der Speicher-Cgroup-Controller aktiviert ist cgroup_enable=memory. Anschließend können Sie Ihre E / A-intensive Aufgabe in einer C-Gruppe mit einem Speicherlimit ausführen, wodurch auch die Menge des Caches begrenzt wird, die sie verbrauchen kann.

Wenn Sie systemd verwenden, können Sie +MemoryAccounting=yesund entweder MemoryHigh/ MemoryMaxoder MemoryLimit(abhängig davon, ob Sie cgroup v1 oder v2 verwenden) in der Einheit oder in einem Slice, das diese enthält, festlegen. Wenn es sich um ein Slice handelt, können Sie systemd-rundas Programm im Slice ausführen.

Vollständiges Beispiel von einem meiner Systeme zum Ausführen von Firefox mit einem Speicherlimit. Beachten Sie, dass dies cgroups v2 verwendet und als mein Benutzer eingerichtet ist, nicht als root (einer der Vorteile von v2 gegenüber v1 ist, dass das Delegieren an Nicht-Root sicher ist, so dass systemd dies tut).

$ systemctl --user cat mozilla.slice 
# /home/anthony/.config/systemd/user/mozilla.slice
[Unit]
Description=Slice for Mozilla apps
Before=slices.target

[Slice]
MemoryAccounting=yes
MemoryHigh=5G
MemoryMax=6G

$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/firefox &
$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/thunderbird &

Ich fand, um den Benutzer zum Arbeiten zu bringen, musste ich ein Stück verwenden. System eins funktioniert nur, indem Sie die Optionen in die Servicedatei einfügen (oder systemctl set-propertyfür den Service verwenden).

Hier ist ein Beispieldienst (mit cgroup v1), beachten Sie die letzten beiden Zeilen. Dies ist Teil der Systeminstanz (pid = 1).

[Unit]
Description=mount S3QL filesystem
Requires=network-online.target
After=network-online.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
User=s3ql-user
Group=s3ql-user
LimitNOFILE=20000
ExecStartPre=+/bin/sh -c 'printf "S3QL_CACHE_SIZE=%%i\n" $(stat -c "%%a*%%S*.90/1024" -f /srv/s3ql-cache/ | bc) > /run/local-s3ql-env'
ExecStartPre=/usr/bin/fsck.s3ql  --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo  --log none «REDACTED»
EnvironmentFile=-/run/local-s3ql-env
ExecStart=/usr/bin/mount.s3ql --keep-cache --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo --cachesize ${S3QL_CACHE_SIZE} --threads 4
ExecStop=/usr/bin/umount.s3ql /mnt/S3QL/
TimeoutStopSec=2m
MemoryAccounting=yes
MemoryLimit=1G

Dokumentation ist in systemd.resource-control(5).

derobert
quelle
1
Können Sie nicht etwas Vergleichbares und Tragbares mit nur einer Anwendung tun ulimit?
Old Pro
1
@OldPro eigentlich nicht. Erstens gibt es in AFAIK keine Einschränkung der Gesamtspeicherauslastung einschließlich des Seiten-Cache (was die Auslastung ist, die hier übermäßig hoch wird). Zweitens ist ulimit für den Arbeitsspeicher pro Prozess, cgroups funktionieren auch dann, wenn sich die lang laufende Task teilt.
Derobert
Ich dachte, der Grund, warum die Speicherabrechnung auf neueren Systemen standardmäßig aktiviert ist, liegt an einer Änderung in systemdVersion 238 .
Sourcejedi
1
@sourcejedi das ist relativ neu. Als der Speichercontroller zum ersten Mal eingeführt wurde, war seine Verfügbarkeit (nicht einmal in Gebrauch) so teuer, dass einige Distributionen ihn zumindest standardmäßig deaktivierten und Sie das Kernel-Befehlszeilenargument übergeben mussten, um ihn zu aktivieren. Die Performance-Probleme wurden behoben, so dass sich dies änderte und in jüngerer Zeit auch von systemd standardmäßig aktiviert wurde.
Derobert
14

Es scheint, dass der Kernel nach einem Tag der Inaktivität glaubt, dass die gesamte GUI nicht mehr benötigt wird, und löscht sie vom RAM (tauscht sie auf die Festplatte aus).

Der Kernel tut The Right Thing ™ und glaubt es. Warum soll es halten ungenutzt 1 Speicher im RAM und so im Wesentlichen verschwenden , anstatt es als Cache oder etwas mit?

Ich glaube nicht, dass der Linux-Kernel das Auslagern von Seiten unentgeltlich oder vorwegnimmt. Wenn dies der Fall ist, muss etwas anderes im RAM gespeichert werden, um die Leistung Ihrer lang laufenden Aufgabe zu verbessern, oder zumindest mit diesem Ziel.

Wenn Sie wissen, wann Sie Ihren Laptop im Voraus wiederverwenden müssen, können Sie den atBefehl (oder crontab) verwenden, um eine Auslagerungsbereinigung ( swapoff -a;swapon -a) zu planen .

Da der Swap - Reinigung könnte viel des Guten, und sogar die OOM Killer wenn aus irgendeinem Grund auslösen, nicht alles in den Arbeitsspeicher passen, Sie können nur „unswap“ 2 alles im Zusammenhang mit den laufenden Anwendungen , die Sie beleben wollen.

Eine Möglichkeit wäre gdb, jedem der betroffenen Prozesse einen Debugger zuzuweisen und eine Core-Dump-Generierung auszulösen:

# gdb -p <pid>
...
generate-core-dump /dev/null
...
quit

Wie Sie geschrieben haben, verwendet Ihre Langzeitanwendung die nach dem ersten Durchlauf gelesenen Daten nicht mehr. Sie befinden sich also in einem bestimmten Fall, in dem das langfristige Zwischenspeichern nicht sinnvoll ist. Dann sollte es eine gute Lösung sein, den Cache zu umgehen, indem Sie direkte E / A verwenden, wie von Will Crawford vorgeschlagen.

Alternativ können Sie den Dateicache auch regelmäßig durch Echo 1oder 3in die /proc/sys/vm/drop_cachesPseudodatei leeren, bevor das Betriebssystem denkt, dass es eine gute Idee ist, Ihre GUI-Anwendungen und -Umgebungen auszutauschen.

Siehe Wie leeren Sie die Puffer und den Cache auf einem Linux-System? für Details.

1 In dem Sinne ungenutzt: seit einiger Zeit nicht mehr aktiv genutzt, der Speicher bleibt für seine Besitzer relevant.
2 Legen Sie die im Auslagerungsbereich gespeicherten RAM-Seiten wieder ein.

jlliagre
quelle
2
Vielen Dank für den Gedanken über mögliche Ursachen. Ich habe die Frage ein wenig erweitert, da sie relevant sein könnte. Ich frage mich, ob es eine Möglichkeit gibt, die Priorität des Zwischenspeicherns gegen den eigenen Speicher der Anwendung zu verringern.
Philip Couling
5
"Ich glaube nicht, dass der Linux-Kernel Seiten unentgeltlich oder vorzeitig auslagert. Wenn dies der Fall ist, muss etwas anderes im RAM gespeichert werden, um die Leistung zu verbessern." - Ich halte diesen Wortlaut für etwas mehrdeutig. Der Kernel schreibt definitiv Seiten, die ausgetauscht werden sollen, wenn er die Möglichkeit dazu hat (z. B. gibt es wenig Festplatten-E / A). Sie werden jedoch nicht aus dem RAM entfernt. Auf diese Weise haben Sie das Beste aus beiden Welten: Wenn Sie diese Seiten schnell wieder benötigen, befinden sie sich bereits im Arbeitsspeicher und es gibt nichts zu tun. Wenn ein Notfall eintritt (wie das OP es ausdrückte), müssen Sie diese Seiten einfach im RAM freigeben, denn
Jörg W Mittag
3
… Sie sind bereits im Tausch. Und das ist genau , warum Sie nicht Swap verwenden wollen „nur im Notfall“, weil in einem Notfall das System bereits unter Stress steht und das letzte , was Sie große Mengen von Festplatte hinzufügen mögen I / O zu , dass.
Jörg W Mittag
2
Die Ursache für das Auslagern ist wahrscheinlich der lange laufende Prozess: Es greift auf Dateien auf der Festplatte zu. Diese Dateien im Speicher wurden in jüngerer Zeit als der Speicher der grafischen Benutzeroberfläche verwendet.
jpmc26
3
@ JörgWMittag Haben Sie Beweise dafür, dass der Linux-Kernel, wenn die I / O-Auslastung gering ist, Seiten präventiv "nur für den Fall" in den Auslagerungsbereich schreibt, dh ohne sie aus dem RAM freizugeben?
Juli
10

Ist der Prozess, den Sie ausführen, etwas, das Sie selbst erstellt haben?

Wenn ja, könnte es sich lohnen , Ihren Code zwicken die Dateien zu öffnen , die mit O_DIRECTFlagge, die zitieren die Handbuchseite -

Versuchen Sie, die Cache-Effekte der Ein- und Ausgabe von und zu dieser Datei zu minimieren. Im Allgemeinen beeinträchtigt dies die Leistung, ist jedoch in bestimmten Situationen hilfreich, z. B. wenn Anwendungen ihre eigenen Caching-Vorgänge ausführen. Die Datei-E / A-Vorgänge werden direkt zu / von den Benutzerbereichspuffern ausgeführt. Das O_DIRECT-Flag alleine ist bemüht, Daten synchron zu übertragen, gibt jedoch nicht die Garantie des O_SYNC-Flags, dass Daten und erforderliche Metadaten übertragen werden. Um eine synchrone E / A zu gewährleisten, muss zusätzlich zu O_DIRECT O_SYNC verwendet werden. Weitere Informationen finden Sie in den nachstehenden ANMERKUNGEN.

Will Crawford
quelle
1
Ein anderes ähnliches (aber wahrscheinlich einfacher, da ich mir ziemlich sicher bin, dass O_DIRECT Ausrichtungsbeschränkungen aufweist und Sie die Leistung beeinträchtigen, wenn Ihre Lesevorgänge nicht groß sind) besteht darin, dem Kernel mitzuteilen, dass Sie diese Daten nicht mehr benötigen, und sie aus dem System zu entfernen Seiten-Cache. (am Telefon oder würde Links zur Verfügung stellen, sorry)
derobert
1
@derobert Zum einen ist der nocacheBefehl ein bequemer Hack, um dies zu tun. (Es verwendet LD_PRELOAD, um einige libc-Aufrufe zu hijacken).
Sourcejedi
6

Hier ist eine Idee, die ich selbst nicht ausprobiert habe (und es tut mir leid, dass ich momentan nicht die Zeit habe, damit zu experimentieren).

Angenommen, Sie erstellen eine kleine VM mit nur 512 MB Arbeitsspeicher für Ihren Hintergrundprozess. Ich bin nicht sicher, ob Sie möchten, dass dieser Swap-Vorgang, Ihr Anruf und das Ausschalten des Swap-Vorgangs auf Ihrem Host-System erfolgt.

X Tian
quelle
3

Entfernen Sie Swap oder verringern Sie es um etwa 20% ( kann je nach System variieren ), da Betriebssysteme Swap in letzter Zeit nicht mehr so ​​verwenden wie vor einigen Jahren. Es beantwortet wahrscheinlich einige Ihrer Fragen:

-> offizielle redhat.com

einige der Red Hat-Informationen unten,

In der Vergangenheit haben einige Anbieter von Anwendungen empfohlen, die Größe des Arbeitsspeichers oder sogar das Doppelte des Arbeitsspeichers zu ändern. Stellen wir uns nun das oben erwähnte System mit 2 GB RAM und 2 GB Swap vor. Eine Datenbank auf dem System wurde versehentlich für ein System mit 5 GB RAM konfiguriert. Sobald der physische Speicher aufgebraucht ist, wird Swap verwendet. Da die Auslagerungsfestplatte viel langsamer als der Arbeitsspeicher ist, sinkt die Leistung und es kommt zu Thrashing. Zu diesem Zeitpunkt sind möglicherweise sogar Anmeldungen am System nicht mehr möglich. Wenn mehr und mehr Speicher geschrieben wird, sind schließlich sowohl der physische als auch der Auslagerungsspeicher vollständig erschöpft und der OOM-Killer greift ein und beendet einen oder mehrere Prozesse. In unserem Fall ist ziemlich viel Swap verfügbar, so dass die Zeit der schlechten Leistung lang ist.

und

https://wiki.debian.org/Swap

Teil des Debian-Links oben,

Informationen und Überlegungen zum Umfang des zu verwendenden Swaps:

"Die empfohlene Menge an Auslagerungsspeicher war traditionell doppelt so groß wie die Menge an Systemspeicher. Diese hat sich im Laufe der Zeit auf das Eineinhalbfache des Systemspeichers geändert. Beide Antworten sind anständige Basiswerte, werden aber im Laufe der Zeit immer weniger nützliche Antworten auf die Frage. Es gibt viele Variablen über Ihr System und die beabsichtigte Verwendung, die den verfügbaren Systemaustausch bestimmen, den Sie haben möchten. "

Sie können versuchen:

"Beste Möglichkeit, Swap unter Linux zu deaktivieren"


Persönliche Anmerkung:


Da habe ich 6 GB RAM und in all meinen neueren Linux-Betriebssystemen. Ich habe noch nie Hinweise auf die Verwendung von Swap gesehen. Ich habe festgestellt, dass ich es entweder aus Platzgründen (einige Gigabyte mehr) oder weil es mein System manchmal verlangsamt hat, ausschalten muss .

Tyþë-Ø
quelle
1
In der Vergangenheit haben einige Anbieter von Anwendungen empfohlen, die Größe des Arbeitsspeichers oder sogar das Doppelte des Arbeitsspeichers zu ändern. Ich fühle mich irgendwie viel älter, als ich das sehe ... Obwohl ich immer noch eine der Festplatten an der ~ 528MB-Grenze und auch 2,5 GB habe, ist dieses Zitat irgendwie - nun, es ist etwas von vor so langer Zeit ... Interessantes Zitat und es könnte erklären, warum ich vor ein paar Jahren ähnliche Probleme sah. Ich glaube, ich habe sysctl verwendet, um das Problem zu beheben, aber ich kann mich nicht genau an die Einstellung erinnern, wenn dies der Vorabend war.
Pryftan,