it-swarm.com.de

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

Ich habe einen Debian (Buster) -Laptop mit 8 GB RAM und 16 GB Swap. Ich führe eine sehr lange laufende Aufgabe aus Der Laptop wurde in den letzten sechs Tagen eingeschaltet gelassen, während er durchläuft.

Dabei muss ich meinen Laptop regelmäßig als Laptop verwenden. Dies sollte kein Problem sein. Die lange laufende Aufgabe 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 einigen Stunden wieder zu meinem Laptop zurückkehre, ist 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 fälschlicherweise abstürzen.

Auf dem Systemmonitor wird von den 2,5 GB, die verwendet werden, etwa die Hälfte in Swap verschoben. Ich habe bestätigt, dass dies das Problem ist, indem ich den Swap-Bereich entfernt habe (swapoff /dev/sda8). Wenn ich es ohne Tauschplatz lasse, wird es auch nach 24 Stunden fast augenblicklich wieder lebendig. Beim Tausch ist es praktisch ein Ziegelstein für die ersten fünf Minuten, nachdem nur sechs Stunden vergangen sind. Ich habe bestätigt, dass die Speichernutzung selbst während meiner Abwesenheit niemals 3 GB überschreitet.

Ich habe versucht, swappiness ( siehe auch: Wikipedia ) auf Werte von 10 Und 0 Zu reduzieren, 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 von RAM (tauscht sie auf die Festplatte aus). Die lang laufende Aufgabe besteht darin, einen riesigen Dateibaum zu lesen und das Lesen jeder Datei. Es könnte also sein, dass der Kernel verwirrt ist zu denken, dass Caching helfen würde. Aber bei einem einzigen Durchlauf einer 2-TB-USB-Festplatte mit ~ 1 Milliarde Dateinamen wird ein zusätzliches GB RAM = wird die Leistung nicht wesentlich verbessern. Dies ist ein billiger Laptop mit einer trägen Festplatte. Er kann einfach keine Daten schnell genug zurück in RAM) laden.

Wie kann ich Linux anweisen, Swap Space nur im Notfall zu verwenden? Ich möchte nicht ohne Swap ausgeführt werden. Wenn etwas Unerwartetes passiert und das Betriebssystem plötzlich ein paar zusätzliche GB benötigt, möchte ich nicht, dass Aufgaben beendet werden, und würde es vorziehen, Swap zu verwenden. Wenn ich den Swap aktiviert lasse, kann mein Laptop derzeit nicht verwendet werden, wenn ich ihn benötige.

Die genaue Definition eines "Notfalls" könnte zur Debatte stehen. Aber um zu verdeutlichen, was ich meine: In einem Notfall bleibt dem System keine andere Wahl, als Prozesse auszutauschen oder abzubrechen.


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 sein, wenn der Kernel so stark auf Speicher angewiesen ist, dass er Prozesse mit dem OOM Killer beendet. Ein Notfall liegt NICHT vor, wenn der Kernel glaubt, dass er die Leistung durch die Verwendung von Swap verbessern kann.


Final Edit: Ich habe eine Antwort akzeptiert, die genau das tut, was ich auf Betriebssystemebene verlangt habe. Zukünftige Leser sollten auch die Antworten zur Kenntnis nehmen, die Lösungen auf Anwendungsebene bieten.

42
Philip Couling

Ein so großer Tausch ist heutzutage oft eine schlechte Idee. Zu dem Zeitpunkt, als das Betriebssystem nur wenige GB Speicher zum Austauschen austauschte, war Ihr System bereits zu Tode gekrochen (wie Sie es gesehen haben).

Es ist besser, zram mit einer kleinen Backup-Swap-Partition zu verwenden. Viele Betriebssysteme wie ChromeOS , Android und verschiedene Linux-Distributionen ( Lubunt , Fedora ) haben zram jahrelang standardmäßig aktiviert. speziell für Systeme mit weniger RAM. Es ist viel schneller als das Austauschen auf der Festplatte, und Sie können die Reaktionsfähigkeit des Systems in diesem Fall deutlich spüren. Auf einer SSD weniger, aber laut Benchmark-Ergebnisse hier scheint es selbst mit dem Standard-lzo-Algorithmus immer noch schneller zu sein. Sie können zu lz4 wechseln, um eine noch bessere Leistung bei etwas geringerem Komprimierungsverhältnis zu erzielen. Die Decodierungsgeschwindigkeit ist fast 5-mal schneller als lzo basierend auf dem offiziellen Benchmark

Tatsächlich verwenden Windows 1 und macOS standardmäßig auch ähnliche Seitendateikomprimierung Techniken

Es gibt auch zswap obwohl ich es nie benutzt habe. Wahrscheinlich einen Versuch wert und vergleichen Sie, welches für Ihre Anwendungsfälle 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 Befehle darauf ausführen können sofort, auch wenn das System unter hoher Last steht

Weiterführende Literatur

11
phuclv

Eine Lösung besteht darin, sicherzustellen, dass der Speicher-cgroup-Controller aktiviert ist (ich denke, dies ist standardmäßig auch in Kerneln der letzten Hälfte der Fall, andernfalls müssen Sie der Kernel-Befehlszeile cgroup_enable=memory Hinzufügen). Anschließend können Sie Ihre E/A-intensive Aufgabe in einer C-Gruppe mit einem Speicherlimit ausführen, wodurch auch die Menge an Cache begrenzt wird, die verbraucht werden kann.

Wenn Sie systemd verwenden, können Sie +MemoryAccounting=yes Und entweder MemoryHigh/MemoryMax oder MemoryLimit festlegen (abhängig davon, ob Sie cgroup v1 oder v2 verwenden ) in der Einheit oder einer Scheibe, die es enthält. Wenn es sich um ein Slice handelt, können Sie mit systemd-run Das 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 und nicht als root eingerichtet ist (einer der Vorteile von v2 gegenüber v1 besteht darin, dass das Delegieren an Nicht-root sicher ist, also tut systemd dies).

$ 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 heraus, dass ich ein Slice verwenden musste, um den Benutzer zum Laufen zu bringen. System 1 funktioniert einfach, indem die Optionen in die Servicedatei eingefügt werden (oder indem systemctl set-property Für den Service verwendet wird).

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

Die Dokumentation befindet sich in systemd.resource-control(5).

25
derobert

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 von RAM (tauscht sie auf die Festplatte aus).

Der Kernel tut The Right Thing ™ und glaubt daran. Warum sollte es unbenutzt bleiben1 Speicher in RAM und so im Wesentlichen verschwenden, anstatt es als Cache oder so etwas zu verwenden?

Ich denke nicht, dass der Linux-Kernel unentgeltlich oder vorausschauend Seiten austauscht. 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 Befehl at (oder crontab) verwenden, um eine Swap-Bereinigung zu planen (swapoff -a;swapon -a).

Da das Reinigen des Swaps möglicherweise zu viel des Guten ist und sogar den OOM-Killer auslöst, wenn aus irgendeinem Grund nicht alles in den Arbeitsspeicher passt, können Sie den "Swap" einfach "entpacken".2 Alles, was mit den laufenden Anwendungen zu tun hat, die Sie wiederbeleben möchten.

Eine Möglichkeit wäre, einen Debugger wie gdb an jeden der betroffenen Prozesse anzuhängen und eine Core-Dump-Generierung auszulösen:

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

Wie Sie geschrieben haben, verwendet Ihre lang laufende Anwendung die nach dem ersten Durchlauf gelesenen Daten nicht wieder. Sie befinden sich also in einem bestimmten Fall, in dem langfristiges Caching nicht sinnvoll ist. Das Umgehen des Caches durch direkte E/A, wie von Will Crawford vorgeschlagen, sollte eine gute Problemumgehung sein.

Alternativ können Sie den Datei-Cache auch regelmäßig leeren, indem Sie 1 Oder 3 In die Pseudodatei /proc/sys/vm/drop_caches Echo, bevor das Betriebssystem der Meinung ist, dass es eine gute Idee ist, Ihre GUI-Anwendungen auszutauschen und Umwelt.

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

1In dem Sinne unbenutzt: Seit geraumer Zeit nicht mehr aktiv genutzt, der Speicher ist für seine Besitzer immer noch relevant.
2Setzen Sie die im Swap-Bereich gespeicherten Seiten wieder ein RAM).

14
jlliagre

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

In diesem Fall kann es sinnvoll sein, den Code zu optimieren, um die Dateien mit dem Flag O_DIRECT Zu öffnen, das die Handbuchseite - zitiert.

Versuchen Sie, die Cache-Effekte der E/A zu und von dieser Datei zu minimieren. Im Allgemeinen wird dadurch die Leistung beeinträchtigt, dies ist jedoch in besonderen Situationen hilfreich, z. B. wenn Anwendungen ihr eigenes Caching durchführen. Datei-E/A werden direkt zu/von User-Space-Puffern ausgeführt. Das O_DIRECT-Flag selbst bemüht sich, Daten synchron zu übertragen, gibt jedoch nicht die Garantie des O_SYNC-Flags, dass Daten und erforderliche Metadaten übertragen werden. Um synchrone E/A zu gewährleisten, muss zusätzlich zu O_DIRECT O_SYNC verwendet werden. Weitere Hinweise finden Sie in den nachstehenden ANMERKUNGEN.

10
Will Crawford

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 ein kleines VM mit nur 512 MB Speicher für Ihren Hintergrundprozess. Ich bin mir nicht sicher, ob dies einen Swap, Ihren Anruf und einen ausgeschalteten Swap auf Ihrem Host-System haben soll .

6
X Tian

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

--> offizielles redhat.com

einige der Red Hat Infos unten,

In der Vergangenheit haben einige Anwendungsanbieter einen Austausch mit einer Größe empfohlen, die dem RAM oder sogar dem doppelten RAM entspricht. 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 verwendet wurde up, swap wird verwendet. Da die Swap-Festplatte viel langsamer als der Arbeitsspeicher ist, sinkt die Leistung und es kommt zu einem Thrashing. Zu diesem Zeitpunkt können sogar Anmeldungen im System unmöglich werden. Da immer mehr Speicher geschrieben wird, werden möglicherweise beide physisch - und der Swap-Speicher sind vollständig erschöpft und der OOM-Killer setzt ein und beendet einen oder mehrere Prozesse. In unserem Fall ist ziemlich viel Swap verfügbar, sodass die Zeit der schlechten Leistung lang ist.

und

https: //wiki.debian.org/Swap

teil des Debian-Links oben,

Informationen und Überlegungen zur Höhe des zu verwendenden Swaps:

"Die empfohlene Menge an Swap-Speicherplatz war traditionell doppelt so groß wie der Systemspeicher. Dies hat sich im Laufe der Zeit auf das Eineinhalbfache des Systemspeichers geändert. Beide Antworten sind anständige Basiswerte, werden jedoch im Laufe der Zeit immer weniger nützliche Antworten auf die Frage. Es gibt viele Variablen über Ihr System und den Verwendungszweck, 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 ich 6 GB habe RAM und in all meinen neueren Linux-Betriebssystemen. Ich habe noch nie einen Hinweis auf die Verwendung von Swap gesehen. Ich habe festgestellt, dass ich ausschalten entweder für Speicherplatz (einige Gigabyte mehr) oder weil es mein System manchmal verlangsamt hat.

3
Tyþë-Ø