Frage Warum wird die Einstellung "arc_max" unter ZFS unter Linux nicht berücksichtigt?


Ich betreibe ZoL 0.6.2 von ihre PPA auf Ubuntu 12.04. Es befindet sich auf einem Host mit 16 GB Arbeitsspeicher, der einige VMs mit KVM / Libvirt ausführen soll. Nach einiger Zeit verwendet ZoL eine wahnsinnige Menge an Speicher und erreicht 98% der RAM-Nutzung, während einige VMs laufen. Dies führt dazu, dass neue Prozesse ablehnen, "Speicher nicht zuordnen" zu starten. Ich kann nicht einmal mehr alle VMs starten, die vor der Verwendung von ZFS etwa 40-50% des Arbeitsspeichers verwendeten.

Soweit ich es verstehe, sollte ZoL, ohne zu optimieren, Speicher freigeben, sobald das System nicht mehr genügend Speicher hat. Nun, das tut es nicht. Also habe ich beschlossen, das zu setzen arc_max Einstellung auf 1 GB.

# echo 1073741824 >> /sys/module/zfs/parameters/zfs_arc_max

Trotzdem gibt es keinen Speicher frei.

Wie Sie aus den folgenden ARC-Statistiken sehen können, wird mehr Speicher verwendet als für die Konfiguration konfiguriert wurde (vgl c=7572030912 mit c_max=1073741824).

Was mache ich hier falsch?

# cat /proc/spl/kstat/zfs/arcstats
4 1 0x01 84 4032 43757119584 392054268420115
name                            type data
hits                            4    28057644
misses                          4    13975282
demand_data_hits                4    19632274
demand_data_misses              4    571809
demand_metadata_hits            4    6333604
demand_metadata_misses          4    289110
prefetch_data_hits              4    1903379
prefetch_data_misses            4    12884520
prefetch_metadata_hits          4    188387
prefetch_metadata_misses        4    229843
mru_hits                        4    15390332
mru_ghost_hits                  4    1088944
mfu_hits                        4    10586761
mfu_ghost_hits                  4    169152
deleted                         4    35432344
recycle_miss                    4    701686
mutex_miss                      4    35304
evict_skip                      4    60416647
evict_l2_cached                 4    0
evict_l2_eligible               4    3022396862976
evict_l2_ineligible             4    1602907651584
hash_elements                   4    212777
hash_elements_max               4    256438
hash_collisions                 4    17163377
hash_chains                     4    51485
hash_chain_max                  4    10
p                               4    1527347963
c                               4    7572030912
c_min                           4    1038188800
c_max                           4    1073741824
size                            4    7572198224
hdr_size                        4    66873056
data_size                       4    7496095744
other_size                      4    9229424
anon_size                       4    169150464
anon_evict_data                 4    0
anon_evict_metadata             4    0
mru_size                        4    1358216192
mru_evict_data                  4    1352400896
mru_evict_metadata              4    508928
mru_ghost_size                  4    6305992192
mru_ghost_evict_data            4    4919159808
mru_ghost_evict_metadata        4    1386832384
mfu_size                        4    5968729088
mfu_evict_data                  4    5627991552
mfu_evict_metadata              4    336846336
mfu_ghost_size                  4    1330455552
mfu_ghost_evict_data            4    1287782400
mfu_ghost_evict_metadata        4    42673152
l2_hits                         4    0
l2_misses                       4    0
l2_feeds                        4    0
l2_rw_clash                     4    0
l2_read_bytes                   4    0
l2_write_bytes                  4    0
l2_writes_sent                  4    0
l2_writes_done                  4    0
l2_writes_error                 4    0
l2_writes_hdr_miss              4    0
l2_evict_lock_retry             4    0
l2_evict_reading                4    0
l2_free_on_write                4    0
l2_abort_lowmem                 4    0
l2_cksum_bad                    4    0
l2_io_error                     4    0
l2_size                         4    0
l2_asize                        4    0
l2_hdr_size                     4    0
l2_compress_successes           4    0
l2_compress_zeros               4    0
l2_compress_failures            4    0
memory_throttle_count           4    0
duplicate_buffers               4    0
duplicate_buffers_size          4    0
duplicate_reads                 4    0
memory_direct_count             4    66583
memory_indirect_count           4    7657293
arc_no_grow                     4    0
arc_tempreserve                 4    0
arc_loaned_bytes                4    0
arc_prune                       4    0
arc_meta_used                   4    427048272
arc_meta_limit                  4    2076377600
arc_meta_max                    4    498721632

# free -m
             total       used       free     shared    buffers     cached
Mem:         15841      15385        456          0         75         74
-/+ buffers/cache:      15235        606
Swap:            0          0          0

20
2018-03-12 23:00


Ursprung




Antworten:


IMHO die Parameter in / sys / module / zfs / parameters können nur auf gesetzt werden 0 / 1 - disabled / enabled. " Korrektur: hängt vom Parameter ab

Ich bin im selben Boot und möchte die Speicherauslastung von zfs begrenzen und es sieht so aus, als müsste man eine /etc/modprobe.d/zfs.conf Datei erstellen und dort den Parameter und den gewünschten Wert eingeben. Diese Änderung wird beim Neustart wirksam.

echo "options zfs zfs_arc_max=34359738368" >> /etc/modprobe.d/zfs.conf

Um das laufende Modul zu beeinflussen, kann man den Parameter zfs_arc_max ändern.

echo "34359738368" > /sys/module/zfs/parameters/zfs_arc_max

Bitte beachten Sie die Verwendung von > Ersetzen Sie den Inhalt der Datei im Gegensatz zum Hinzufügen der Datei mit >>.

Quelle: https://stackoverflow.com/a/18808311


22
2018-06-06 19:39



Der ZFS-Bogen schrumpft nicht sofort. Jedoch (ZFSonLinux) wird es zurückgewonnen, während Anwendungen diesen Speicher zuweisen - wie üblich. Wenn Sie etwas brauchen, um in Erinnerung zu bleiben, werfen Sie einen Blick auf github.com/hilbix/killmem (nur 8K nach make static; strip -s killmem) - Tino
Unter Ubuntu 16.04 musste ich rennen update-initramfs -u -k all vor dem Neustart, um diese Einstellungen zu haben /etc/modprobe.d/zfs.conf propagiert. - lechup
@lechup: Auf Ubuntu 16.04 habe ich hinzugefügt options zfs zfs_vdev_scheduler=cfq zu meinem /etc/modprobe.d/zfs.conf. Ich habe neu gestartet und es hat funktioniert; der Scheduler war jetzt cfq anstatt Noop. Kannst du warum erklären update-initramfs -u -k all ist notwendig? - Martin Velez
@MartinVelez Ich weiß, es ist komisch, aber ohne es auf meinem Computer Änderungen wurden nicht nach dem Neustart propagiert ... Ich habe versucht, verschiedene Option popagate zfs_arc_max vielleicht ist dieser Schlüssel irgendwie in initramfs zwischengespeichert? - lechup


http://fibrevillage.com/storage/169-zfs-arc-on-linux-how-to-set-and-monitor-on-linux

Dieser Artikel ist sehr gut

ab Version ZoL 0.6.2 können Sie c_max zur Laufzeit setzen, die ARC-Größe wird jedoch nicht automatisch freigegeben. Um die Freigabe des RAM zu erzwingen, muss der zpool exportiert werden.


5
2017-12-18 17:59





Sobald Sie Ihre Lichtbogengröße geändert haben, müssen Sie Ihre Caches löschen.

echo 3 > /proc/sys/vm/drop_caches

und warten Sie (Ihre Eingabeaufforderung wird nicht sofort zurückkehren, aber andere Prozesse werden weiterhin ausgeführt). Es wird langsam entladen die Caches (2,5 min für meine 24GB Cache auf 2 Paar RAID 1'd 2TB WD schwarz auf einer 2Ghz 4 Jahre alten CPU auf einer Box w / 64GB) - Vorsicht, Sie werden plötzlich keine Caches haben, und alle Prozesse, die Daten lesen, werden von der Raw-Festplatte abgezogen, so dass Sie wahrscheinlich sehen werden, dass E / A-Wartezeiten eine Weile aufspringen, bis der Cache neu gefüllt ist.


3
2018-02-18 05:07



Achso cool! Können Sie erklären, warum die '3' als Wert in diesen procfs-Eintrag geschrieben werden soll? - gertvdijk
Nur PageCache leeren: # sync; echo 1 > /proc/sys/vm/drop_caches  Klare Dentries und Inodes: # sync; echo 2 > /proc/sys/vm/drop_caches  Clear PageCache, Dentries und Inodes: # sync; echo 3 > /proc/sys/vm/drop_caches - math


Ein Problem, in das Sie geraten könnten, ist, dass ZFS die Dateien der virtuellen Maschine zwischenspeichert (virtuelle Festplatten). Um dies zu vermeiden, setze ich die primarycache-Eigenschaft immer auf "Metadaten" in Dateisystemen, die virtuelle Laufwerke enthalten.

Die Logik ist, dass das Gastbetriebssystem besser angibt, welche Bereiche seiner Platten zwischenzuspeichern sind.


2
2017-09-22 20:52





AFAIK muss eine der folgenden Bedingungen erfüllt sein, um den Parameter anzupassen.

  1. Auf einem laufenden System: alle zpools exportieren, zfs-Module entfernen, zfs-Modul erneut aktivieren (per Definition ist dies nicht möglich, wenn / in zfs ist).
  2. Generieren Sie das Bild initramfs beim Ändern des Parameters neu, damit es nach einem Neustart funktioniert. Dies ist erforderlich, da der Speicherort der Datei zfs.conf zum Zeitpunkt des Startvorgangs noch nicht geladen ist.

0
2017-08-11 08:00





Du hast ein Extra ">" zu viele.

Der Befehl sollte sein

echo 1073741824 > /sys/module/zfs/parameters/zfs_arc_max

nicht ">>"

>> bedeutet "hinzufügen zu" (bestehende Liste).
> bedeutet "überschreiben" (Wert).

Deshalb funktioniert der Befehlscode in Ihrer Frage nicht.


0
2018-03-21 12:24



Das war schon Teil der angenommenen Antwort. serverfault.com/a/602457/135437 - gertvdijk
Dieser Posten ist eine komplizierte Angelegenheit, Mr. Downvotes. Der Autor sagt eine ganze Reihe von Dingen, berührt nur die richtige Antwort neben dem Ende der Unordnung, ohne zu sagen, "das ist der Grund" oder gleichwertig. So verwickelt, dass ich von diesem Posten keine Antwort bekommen habe. Ich sah den Grund von der Frage. Mein Post war Upvoted aus einem Grund. - Hypocritus