Was ist der angemessene Wert von vm.swappiness bei der Verwendung von zram?

13

Ich verwende zram auf meinem Computer als komprimierten RAM-Swap. Wenn das System etwas auslagern muss, entspricht das Auslagern in eine zram-gesicherte Auslagerungsdatei in etwa dem Komprimieren dieser Daten im Arbeitsspeicher, um Speicherplatz freizugeben. Dies macht das Auslagern im Vergleich zum festplattengestützten Auslagern die meiste Zeit sehr schnell. Aus diesem Grund frage ich mich, ob es eine gewisse Leistung bringt, wenn das System dazu angeregt wird, nicht genutzte Inhalte aggressiver auszutauschen, da dies möglich ist, ohne die Festplatte tatsächlich zu beschädigen.

vm.swappinessHat also jemand damit rumgespielt, während er zram benutzt , beispielsweise auf 100 zu setzen? Wäre das wünschenswert?

sysctl -w vm.swappiness=100
Ryan C. Thompson
quelle
2
Dies ist eine ausgezeichnete Frage, und ich denke, dass einige Benchmarking ist, um die Meinungen zu entfernen und auf die Fakten zu bekommen ...
Elder Geek
Gute Idee, und Zram hat sich möglicherweise seit 2012 verbessert, als ich es zuletzt verwendet habe :-)
Huygens
Habe einen kleinen Test gemacht und soweit ich das beurteilen kann wird der für zram "reservierte" Speicher noch als Cache verwendet. Wenn dies bestätigt wird, halte ich es möglicherweise für sinnvoll, die Austauschbarkeit niedrig zu halten, um CPU-Zyklen zu vermeiden.
Vitor

Antworten:

2

Ich würde wirklich nicht empfehlen, das swappiness höher zu setzen. Ein allgemeiner Mechanismus im Kernel besteht darin, dass Seiten (Speicherblock) in den Swap gestellt werden, um Speicher für andere ausgeführte Aufgaben freizugeben.

Erstes "Problem", wenn der Kernel n Seiten freigeben will, m (mit m <n, m ist die Anzahl der komprimierten Seiten, die für n erforderlich sind) neu im RAM erstellt werden, ich bin nicht sicher, ob dies den Kernel stören kann oder nicht nicht.

Wenn Sie Seiten im Tausch haben, ist es dennoch möglich, dass Sie die Anwendung später mit einigen Seiten im Tausch verwenden. Der Kernel bringt diese Seiten in den physischen Speicher zurück, entfernt sie jedoch nicht aus dem Swap (was bei Standard-Swap als Caching angesehen werden kann. Wenn die Anwendung also wieder im Hintergrund ausgeführt wird, muss der Kernel diese Seiten nicht zurückschreiben in den langsamen Swap). Mit zram ist dies jedoch möglicherweise kein kluger Trick, da Sie dann im Speicher die m Seiten in zram + die n Seiten haben, die sich wieder im Speicher befinden!

Der Kernel verfügt in der Regel über einen "Gesamtspeicher", der für die Geschäftsabwicklung verwendet werden kann. Wenn Sie zram hinzufügen, zählt es nur im "Swap" -Speicher, wie es bei jedem festplattenbasierten Swap der Fall wäre, aber es reduziert den tatsächlichen "Gesamtspeicher" und das wird vom Kernel nicht erwartet. Manchmal kann es vorkommen, dass Sie sich deshalb komisch und unerwünscht verhalten!

Mit zram wäre es gut, wenn der Kernel nicht zu viel in diesen Bereich wechselt, wenn er unter Speicherdruck steht. Und Sie sollten immer eine echte Festplatten-Swap-Partition haben, die mindestens die maximale Größe Ihres zram überschreitet, damit das System keine OOM erhält, während Sie gleichzeitig viel freien Speicherplatz sehen würden, wie von gemeldet free!

Huygens
quelle
zram bietet RAM-Block-Geräte an. Alles, was auf diese Blockgeräte geschrieben wird, wird komprimiert. Wenn zram-Blockgeräte als Auslagerungsspeicher verwendet werden und das System versucht, Teile des Arbeitsspeichers zum Auslagerungsspeicher zu verschieben, wird der Arbeitsspeicher effektiv von einem Teil des Arbeitsspeichers in einen anderen verschoben, mit der Ausnahme, dass die Daten komprimiert werden, bevor sie zum Ziel kopiert werden. Dies funktioniert effektiv als billiger Speicherkomprimierungsmechanismus, um die Reaktionsfähigkeit in Systemen mit begrenztem Speicher zu verbessern. ... Zram ist seit Linux 2.6.33 im Staging. In 3.14 wurde zram aus der Bereitstellung nach drivers / block / zram verschoben.
Elder Geek
1
@ ElderGeek genau! Und ich werde ein Beispiel nehmen, um zu veranschaulichen, warum das nicht perfekt ist. Der Kernel versucht, 64 MB RAM zu entfernen, und legt sie in den zram-Swap. Komprimiert ist der 64MB-Block jetzt 32MB. Das Ergebnis ist, dass der Speicher um 32 MB und nicht um 64 MB verringert wurde. Was passiert nun, wenn die Anwendung die 64 MB zurück im Speicher benötigt, die Kernel-Kopie (und nicht verschieben) den Chunk zurück in den Speicher. Sie haben jetzt 64 MB RAM + 32 MB RAM. Warum kopieren? Weil der Kernel die Seiten zwischenspeichert, wie ich in meiner Antwort erklärt habe. Beide Verhaltensweisen sind nicht ideal. Und wenn der Speicher nicht gut komprimierbar ist, ist das noch schlimmer.
Huygens
Noch in der Testphase. Ich würde denken, dass es eine Möglichkeit geben muss, den Caching-Algorithmus zu optimieren, den zram verwendet, um die komprimierte Seite freizugeben, wenn sie zurück in den unkomprimierten Arbeitsspeicher kopiert wird.
Elder Geek
Ich habe es bis 2012 mehrere Male ausprobiert. Damals war mein Computer auf 1 GB RAM beschränkt und beim Surfen im Internet schmerzhaft langsam (normalerweise habe ich 10-50 Tabs geöffnet). Aber seitdem habe ich es nie wieder benutzt. Ich habe mehr als genug RAM, dass ich Swap nicht mehr benutze. Als ich damals zram mit Firefox verwendete, begann ich angesichts des kleinen Arbeitsspeichers, den ich hatte, schnell zu "tauschen". Und schnell hatte ich ein nicht reagierendes System mit vielen Abstürzen. Ohne Zram war es schmerzhaft langsam, aber zumindest stabil. Mein Problem war, dass es wahrscheinlich ständig Speicherseiten komprimierte / dekomprimierte.
Huygens
Ja, meine Ergebnisse waren ähnlich. Auf einem System mit 8 GB konnte ich ein OOM erzwingen, indem ich während eines Codierungsjobs mehrere VMs startete. Hast du irgendwelche Erfahrungen mit zswap? Es scheint eine gangbare Alternative zu sein, basierend auf dem, was ich gelesen habe.
Elder Geek
2

Kurze Antwort: vm.swappiness=100ist angemessener Wert für zram (Zumindest unter Debian Stretch mit Linux 4.9 glaube ich, dass dies der beste Wert ist)

Ich teste schon vm.swappiness=100für mich.

Ich denke, Sie können einen einfachen Test durchführen, um festzustellen, welcher Wert für Sie am besten ist.

Außerdem habe ich ein weiteres einfaches Programm zum Testen dieser Frage erstellt. x Bei meinem Computer kann ein sehr niedriger vm.swappinessWert (z. B. vm.swappiness=1) ein offensichtliches Reaktionsproblem verursachen.

Über SwapCachedin /proc/meminfo:

Versuchen Sie zunächst einmal vm.page-cluster=0, dies kann möglicherweise dazu führen, dass einige SwapCachedvom Swap-In unbrauchbar werden .

SwapCached kann zram genauso beschleunigen wie Nicht-zram-Swap-Geräte

SwapCached Ist kann (kostenlos) bei Bedarf wiederverwendet werden:

./linux-4.9/mm$ grep -rn delete_from_swap_cache
memory-failure.c:715:   delete_from_swap_cache(p);
shmem.c:1115:       delete_from_swap_cache(*pagep);
shmem.c:1645:            * unaccounting, now delete_from_swap_cache() will do
shmem.c:1652:               delete_from_swap_cache(page);
shmem.c:1668:       delete_from_swap_cache(page);
vmscan.c:673:       __delete_from_swap_cache(page);
swap_state.c:137:void __delete_from_swap_cache(struct page *page)
swap_state.c:218:void delete_from_swap_cache(struct page *page)
swap_state.c:227:   __delete_from_swap_cache(page);
swapfile.c:947:         delete_from_swap_cache(page);
swapfile.c:987: delete_from_swap_cache(page);
swapfile.c:1023:            delete_from_swap_cache(page);
swapfile.c:1571:            delete_from_swap_cache(page);
./linux-4.9/mm$ 
Analphabet
quelle
0

Seiten müssen (auf die Festplatte) ausgelagert werden, wenn der Speicher voll ist. Wenn Sie den Speicher verwenden, um den Platz zum Auslagern von Seiten zu schaffen, wenn der Speicher voll ist, würde man meinen, dass dies den Zweck übertrifft, es sei denn, die Komprimierung macht einen Unterschied (und dann wäre es natürlich, den Speicher direkt zu komprimieren, anstatt durchzugehen Tauschen). Das müsste man wohl messen, da Computer im Vergleich zur Speichergeschwindigkeit immer schneller komprimieren und dekomprimieren.

Alexander
quelle
Ich habe festgestellt, dass zram-backed Swap selbst sehr hilfreich ist, wenn auf dem System nicht genügend Arbeitsspeicher zur Verfügung steht. Es hat mich ein paar Mal davon abgehalten, komplett in der Hölle zu stecken und neu starten zu müssen (ich analysiere große Datenmengen, also brauche ich den Speicher, alle 24 GB). Ich frage mich nur, ob der vm.swappinessWert für disk-backed Swap optimiert ist und ob ich ihn ändern sollte, wenn ich meistens zram-backed Swap verwende.
Ryan C. Thompson
1
"immer schneller"? On the fly-Komprimierung
funktioniert
symcbean hast du vergessen "im vergleich zur speichergeschwindigkeit". Wo ist die Uneinigkeit?
Alexander
Ich denke, Symcbeans Punkt ist, dass das Ziel von Seiten mit komprimiertem Speicher (zram) darin besteht, das Auslagern auf ein physisches Medium zu ersetzen. Der Grund, warum es nicht "natürlich ist, den Speicher direkt zu komprimieren", ist, dass es kompliziert wäre, wenn Anwendungen bestimmen müssten, welche Teile ihres Speichers wann komprimiert werden könnten; Das VM-Subsystem ist ein viel einfacherer Ort, um dies zu implementieren. Workloads, die von zram profitieren, haben Seiten, die nicht im Arbeitssatz enthalten sind und leicht komprimiert werden können.
Daniel Papasian