Warum wird die arc_max-Einstellung in ZFS unter Linux nicht berücksichtigt?

20

Ich verwende ZoL 0.6.2 von ihrem PPA auf Ubuntu 12.04. Es befindet sich auf einem Host mit 16 GB Speicher, auf dem einige VMs mit KVM / Libvirt ausgeführt werden sollen. Nach einiger Zeit verbraucht ZoL wahnsinnig viel Speicher und erreicht 98% der RAM-Auslastung, wenn einige VMs ausgeführt werden. Dies führt zu neuen Prozessen, die sich weigern, "Speicher kann nicht zugewiesen werden" zu starten. Ich kann nicht einmal mehr alle meine VMs starten, die vor der Verwendung von ZFS etwa 40-50% des Arbeitsspeichers beanspruchten.

Soweit ich weiß, sollte ZoL ohne Anpassungen Speicher freigeben, sobald das System über wenig Speicher verfügt. Nun, das tut es nicht. Also habe ich beschlossen, die arc_maxEinstellung auf 1 GB zu setzen.

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

Trotzdem gibt es keinen Speicher frei.

Wie Sie in der folgenden ARC-Statistik sehen können, wird mehr Speicher benötigt als konfiguriert (vgl. c= 7572030912Mit 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
gertvdijk
quelle

Antworten:

22

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

Ich bin im selben Boot und möchte die Speichernutzung von zfs einschränken. Es scheint, dass man eine /etc/modprobe.d/zfs.conf-Datei erstellen und den Parameter und den gewünschten Wert dort eingeben muss. 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 der Parameter zfs_arc_max geändert werden.

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

Bitte beachten Sie die Verwendung von >, um den Inhalt der Datei im Gegensatz zum Hinzufügen zur Datei durch zu ersetzen >>.

Quelle: /programming//a/18808311

Tobias F. Meier
quelle
1
Der ZFS-Lichtbogen schrumpft nicht sofort. Es wird jedoch (ZFSonLinux) zurückgefordert, während Anwendungen diesen Speicher zuweisen - wie üblich. Wenn Sie etwas brauchen, um sich in Erinnerung zu behalten, schauen Sie sich vielleicht github.com/hilbix/killmem an (nur 8K später make static; strip -s killmem)
Tino
Unter Ubuntu 16.04 musste ich update-initramfs -u -k allvor dem Neustart ausführen , damit diese Einstellungen übernommen wurden /etc/modprobe.d/zfs.conf.
Lechup
@lechup: Unter Ubuntu 16.04 habe ich options zfs zfs_vdev_scheduler=cfqmeine /etc/modprobe.d/zfs.conf hinzugefügt . Ich habe neu gestartet und es hat funktioniert; Der Scheduler war jetzt cfq statt noop . Können Sie erläutern, warum dies update-initramfs -u -k allnotwendig ist?
Martin Velez
@MartinVelez Ich weiß, dass es seltsam ist, aber ohne es auf meinem Computer wurden Änderungen nach dem Neustart nicht weitergegeben ... Ich habe versucht, eine andere Option einzufügen. zfs_arc_maxVielleicht ist dieser Schlüssel in initramfs zwischengespeichert?
Lechup
4

Sobald Sie Ihre Bogengröß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ückgegeben, aber andere Prozesse werden weiterhin ausgeführt). Die Caches werden langsam entladen (2,5 Minuten für meinen 24-GB-Cache auf 2 Paar RAID-1-2-TB-WD-Blacks auf einer 4-jährigen 2-GHz-CPU auf einer Box mit 64 GB) - Vorsicht, Sie haben plötzlich keine Caches und keine Prozesse, die Daten lesen, werden von der Raw-Festplatte abgezogen, sodass Sie wahrscheinlich eine Weile warten müssen, bis der Cache neu gefüllt wird.

Mathematik
quelle
Achso cool! Können Sie erklären, warum die '3' ein Wert ist, der in diesen procfs-Eintrag geschrieben werden soll?
gertvdijk
Nur # sync; echo 1 > /proc/sys/vm/drop_caches PageCache löschen: Einträge und Inodes löschen: # sync; echo 2 > /proc/sys/vm/drop_caches PageCache, Einträge und Inodes löschen:# sync; echo 3 > /proc/sys/vm/drop_caches
math
2

Ein Problem, auf das Sie stoßen könnten, ist das Zwischenspeichern der Dateien der virtuellen Maschine (virtuelle Festplatten) durch ZFS. Um dies zu vermeiden, setze ich die Eigenschaft primarycache auf Dateisystemen mit virtuellen Laufwerken immer auf "Metadaten".

Die Logik ist, dass das Gastbetriebssystem einen besseren Hinweis darauf hat, welche Bereiche seiner Festplatten zwischengespeichert werden sollen.

Pavka1
quelle
0

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

  1. Auf einem laufenden System: Exportieren Sie alle zpools, entfernen Sie zfs-Module, aktivieren Sie das zfs-Modul erneut (per Definition ist dies nicht möglich, wenn / auf zfs ausgeführt wird).
  2. Generieren Sie das initramfs-Image neu, wenn Sie den Parameter ändern, damit es nach einem Neustart funktioniert. Dies ist erforderlich, da der Speicherort der Datei zfs.conf zu diesem Zeitpunkt im Startvorgang noch nicht bereitgestellt ist.
Sam
quelle
0

Sie haben ein " >" Extra zu viel.

Der Befehl sollte sein

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

nicht " >>"

>>bedeutet "Hinzufügen zu" (vorhandene Liste).
>bedeutet "überschreiben" (Wert).

Aus diesem Grund funktioniert der Befehlscode in Ihrer Frage nicht.

Heuchler
quelle
Das war schon Teil der akzeptierten Antwort vorhanden. serverfault.com/a/602457/135437
gertvdijk
Dieser Beitrag ist ein kompliziertes Durcheinander, Mr. Downvotes. Der Autor sagt eine ganze Reihe von Dingen und berührt erst kurz vor dem Ende des Durcheinanders die richtige Antwort, ohne zu sagen, "das ist der Grund" oder etwas Ähnliches. So verworren, dass ich von diesem Beitrag keine Antwort bekam. Ich habe den Grund aus der Frage gesehen. Mein Beitrag wurde aus einem bestimmten Grund positiv bewertet.
Heuchler