GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

Eine Lösung besteht darin, sicherzustellen, dass der Speicher-Cgroup-Controller aktiviert ist (ich denke, er ist sogar in halbneuen Kerneln standardmäßig aktiviert, andernfalls müssen Sie cgroup_enable=memory hinzufügen zur Kernel-Kommandozeile). Dann können Sie Ihre E/A-intensive Aufgabe in einer Kontrollgruppe mit einem Speicherlimit ausführen, das auch die Menge an Cache begrenzt, die es verbrauchen kann.

Wenn Sie systemd verwenden, können Sie +MemoryAccounting=yes festlegen und entweder MemoryHigh /MemoryMax oder MemoryLimit (hängt davon ab, ob Sie cgroup v1 oder v2 verwenden) in der Einheit oder einem Slice, das sie enthält. Wenn es sich um ein Slice handelt, können Sie systemd-run verwenden um das Programm im Slice auszufü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, also macht es systemd).

$ 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 One funktioniert einfach, indem es die Optionen in die Servicedatei einfügt (oder systemctl set-property auf dem Dienst).

Hier ist ein Beispieldienst (unter Verwendung von 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) .


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

Der Kernel macht The Right Thing™ daran glauben. Warum sollte es ungenutzten Speicher im RAM behalten und ihn so im Wesentlichen verschwenden, anstatt ihn als Cache oder so etwas zu verwenden?

Ich glaube nicht, dass der Linux-Kernel unentgeltlich oder vorausschauend Seiten auslagert, also muss es sein, dass er etwas anderes im RAM speichert und so die Leistung Ihrer lang laufenden Aufgabe verbessert, oder zumindest mit diesem Ziel.

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

Da das Reinigen des Swaps übertrieben sein kann und sogar den OOM-Killer auslösen kann, wenn aus irgendeinem Grund nicht alles in den RAM passt, können Sie einfach alles "enttauschen", was mit den laufenden Anwendungen zu tun hat, die Sie wiederbeleben möchten.

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

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

Wie Sie geschrieben haben, verwendet Ihre lang laufende Anwendung die Daten, die sie nach dem ersten Durchlauf liest, nicht wieder, sodass Sie sich in einem bestimmten Fall befinden, in dem langfristiges Caching nicht sinnvoll ist. Dann sollte das Umgehen des Caches mit direkter E/A, wie von Will Crawford vorgeschlagen, eine gute Problemumgehung sein.

Alternativ können Sie den Dateicache auch regelmäßig leeren, indem Sie 1 ausgeben oder 3 zum /proc/sys/vm/drop_caches Pseudo-Datei, bevor das Betriebssystem es für eine gute Idee hält, Ihre GUI-Anwendungen und -Umgebung auszutauschen.

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

Unbenutzt im Sinne:seit längerem nicht mehr aktiv genutzt, der Speicher ist für seine Besitzer noch relevant.
Stellen Sie die im Auslagerungsbereich gespeicherten Seiten wieder in den RAM ein.


Heutzutage ist es oft eine schlechte Idee, einen so großen Swap zu haben. Zu dem Zeitpunkt, als das Betriebssystem nur ein paar GB Speicher zum Austauschen auslagerte, war Ihr System bereits zu Tode gekrochen (wie Sie es gesehen haben)

Es ist besser, zram zu verwenden mit einer kleinen Backup-Swap-Partition . Viele Betriebssysteme wie ChromeOS, Android und verschiedene Linux-Distributionen (Lubuntu, Fedora) haben zram seit Jahren standardmäßig aktiviert, insbesondere für Systeme mit weniger RAM. Es ist viel schneller als Wechsel auf HDD und Sie können die Reaktion des Systems in diesem Fall deutlich spüren. Weniger auf einer SSD, aber laut den Benchmark-Ergebnissen hier scheint es selbst mit dem Standard-lzo-Algorithmus immer noch schneller zu sein. Sie können für eine noch bessere Leistung mit einem etwas geringeren Komprimierungsverhältnis zu lz4 wechseln. Die Dekodierungsgeschwindigkeit ist fast fünfmal schneller als die von lzo, basierend auf dem offiziellen Benchmark

Tatsächlich verwenden Windows 10 und macOS standardmäßig auch ähnliche Techniken zur Komprimierung von Auslagerungsdateien

Es gibt auch zswap obwohl ich es nie benutzt habe. Es ist wahrscheinlich einen Versuch wert und zu vergleichen, welches für Ihre Anwendungsfälle besser ist

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

Weiterführende Literatur

  • Arch Linux - Leistung verbessern - Zram oder zswap
  • ZSwap aktivieren, um die Leistung zu steigern
  • Aktivieren Sie zRAM für eine verbesserte Speicherverwaltung und weniger Auslagerung
  • Zu wenig RAM in Ubuntu? ZRAM aktivieren
  • Unterschied zwischen ZRAM und ZSWAP
  • Ultimativer Leitfaden für zram vs. zswap vs. zcache:Wann sollte man welches verwenden
  • Linux, SSD und Swap
  • https://wiki.debian.org/ZRam
  • https://www.kernel.org/doc/Documentation/blockdev/zram.txt
  • https://wiki.gentoo.org/wiki/Zram

Linux
  1. Wie ich Ansible und Anacron für die Automatisierung verwende

  2. So verwenden Sie den Linux-Befehl sed

  3. So fügen Sie Swap Space unter Debian 11 hinzu

  4. So fügen Sie Swap Space unter Ubuntu 22.04 hinzu

  5. Wie viel Auslagerungsspeicher muss für Oracle Database unter Linux hinzugefügt werden?

So erweitern Sie den Auslagerungsbereich mithilfe der Auslagerungsdatei in Linux

So verwenden Sie den SCP-Befehl für die Dateiübertragung

So verwenden Sie Avidemux für die Videobearbeitung

So erstellen und verwenden Sie eine Auslagerungsdatei unter Linux

So überprüfen Sie den Auslagerungsbereich unter Linux

Wie entferne ich Swap Space von Centos 7.x?