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 10
und 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.
Antworten:
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
zram
mit 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 BenchmarkEs gibt auch,
zswap
obwohl ich es nie benutzt habe. Wahrscheinlich einen Versuch wert und vergleichen, welches für Ihre usecases besser istDanach 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
quelle
zram
Blockgerät erstellen kann, es als Swap verwenden kann, mit einem Swap mit niedrigerer Priorität als die Festplattenpartition?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=yes
und entwederMemoryHigh
/MemoryMax
oderMemoryLimit
(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 Siesystemd-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 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).
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-property
für den Service verwenden).Hier ist ein Beispieldienst (mit cgroup v1), beachten Sie die letzten beiden Zeilen. Dies ist Teil der Systeminstanz (pid = 1).
Dokumentation ist in
systemd.resource-control(5)
.quelle
ulimit
?systemd
Version 238 .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
at
Befehl (odercrontab
) 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: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
1
oder3
in die/proc/sys/vm/drop_caches
Pseudodatei 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.
quelle
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_DIRECT
Flagge, die zitieren die Handbuchseite -quelle
nocache
Befehl ein bequemer Hack, um dies zu tun. (Es verwendet LD_PRELOAD, um einige libc-Aufrufe zu hijacken).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.
quelle
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,
und
https://wiki.debian.org/Swap
Teil des Debian-Links oben,
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 .
quelle