Arc_max ayarı neden Linux'ta ZFS'de onurlandırılmıyor?


20

Ben den ZOL 0.6.2 çalıştırıyorum onların PPA Ubuntu 12.04 üzerinde. KVM / Libvirt kullanarak bazı VM'leri çalıştırmayı amaçlayan 16 GB belleğe sahip bir ana bilgisayarda. Bir süre sonra ZoL çılgınca bir bellek kullanıyor ve bazı VM'ler çalışırken RAM kullanımının% 98'ine ulaşıyor. Bu, "bellek ayıramadı" başlatmayı reddeden yeni işlemlerle sonuçlanır. ZFS'yi kullanmadan önce RAM'in yaklaşık% 40-50'sini kullanan tüm VM'lerimi artık başlatamıyorum.

Anladığım kadarıyla, ayarlama yapmadan, ZoL, sistemin belleği yetersiz kaldığı anda belleği serbest bırakmalıdır. Pekala, öyle değil. Bu yüzden arc_maxayarı 1GB olarak ayarlamaya karar verdim .

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

Yine de, herhangi bir bellek serbest bırakmaz.

Aşağıdaki ARC istatistiklerinden görebileceğiniz gibi, yapılandırıldığından daha fazla bellek kullanıyor (Compare c= 7572030912with c_max= 1073741824).

Burada neyi yanlış yapıyorum?

# 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

Yanıtlar:


22

IMHO / sys / module / zfs / parametrelerindeki parametreler yalnızca 0/ 1- disabled/ olarak ayarlanabilir enabled. " Düzeltme: parametreye bağlıdır

Ben zfs bellek kullanımını sınırlamak isteyen aynı teknede ve bir /etc/modprobe.d/zfs.conf dosyası oluşturmak ve parametre ve orada istenen değeri girmek gibi görünüyor. Bu değişiklik yeniden başlatma sonrasında geçerli olacaktır.

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

Çalışan modülü etkilemek için zfs_arc_max parametresi değiştirilebilir.

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

Lütfen >, dosyanın içeriğini dosyaya eklemek yerine dosyanın içeriğini değiştirmek için kullanıldığına dikkat edin >>.

Kaynak: /programming//a/18808311


1
ZFS yayı hemen büzülmez. Ancak (ZFSonLinux), uygulamalar bu belleği her zamanki gibi tahsis ederken geri kazanılır. Hafızada gezinmek için bir şeye ihtiyacınız varsa, belki de github.com/hilbix/killmem'e bir göz atın (sadece 8K sonra make static; strip -s killmem)
Tino

Ubuntu 16.04'te update-initramfs -u -k allbu ayarların /etc/modprobe.d/zfs.confyayılmasını sağlamak için yeniden başlatmadan önce çalıştırmam gerekiyordu .
lechup

@lechup: Ubuntu 16.04, ben ekledi options zfs zfs_vdev_scheduler=cfqbenim için /etc/modprobe.d/zfs.conf . Yeniden başlattım ve işe yaradı; zamanlayıcı şimdi noop yerine cfq idi . Neden gerekli olduğunu açıklayabilir misiniz ? update-initramfs -u -k all
Martin Velez

@MartinVelez Ben garip olduğunu biliyorum ama o olmadan benim makine değişiklikleri yeniden önyükleme sonra yayılmadı ... Farklı seçenek popagate çalışıyordum zfs_arc_maxbelki bu anahtar bir şekilde initramfs önbelleğe alınmış?
lechup


4

Ark büyüklüğünüzü değiştirdikten sonra önbelleklerinizi düşürmeniz gerekir.

echo 3 > /proc/sys/vm/drop_caches

ve bekleyin (isteminiz hemen geri dönmez, ancak diğer işlemler çalışmaya devam eder). Önbellekleri yavaşça boşaltacaktır (24GB önbelleğim için 2.5 dk. veri okuma süreçleri ham disk çekecek, böylece önbellek yeniden dolduruluncaya kadar bir süre IO beklemek atlama göreceksiniz.


Ah guzel! Neden '3' ün bu procfs girişine yazmak için bir değer olduğunu açıklayabilir misiniz?
gertvdijk

Yalnızca PageCache'yi # sync; echo 1 > /proc/sys/vm/drop_caches temizle: # sync; echo 2 > /proc/sys/vm/drop_caches Takma dişleri ve inotları temizle : PageCache'yi, takma dişleri ve inotları temizle:# sync; echo 3 > /proc/sys/vm/drop_caches
matematik

2

Düşebileceğiniz bir sorun ZFS'nin sanal makine dosyalarını (sanal diskler) önbelleğe almasıdır. Bundan kaçınmak için her zaman sanal diskler içeren dosya sistemlerinde birincil önbellek özelliğini "meta veri" olarak ayarladım.

Konuk işletim sisteminin disklerinin hangi alanlarının önbelleğe alınacağına dair daha iyi ipucu olması mantıklıdır.


0

Parametreyi uyarlamak için AFAIK aşağıdaki koşullardan birinin karşılanması gerekir.

  1. Çalışan bir sistemde: tüm zpools'u dışa aktarın, zfs modüllerini kaldırın, zfs modülünü yeniden etkinleştirin (tanım başına bu, zfs üzerindeyse / yapılıyorsa yapılamaz).
  2. Parametreyi değiştirirken initramfs görüntüsünü yeniden oluşturun, böylece yeniden başlatmadan sonra çalışacaktır. Bu, zfs.conf dosya konumu önyükleme işleminde o anda henüz bağlanmadığı için gereklidir.

0

Fazladan bir " >" fazla var.

Komut

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

" >>" değil

>>"ekle" anlamına gelir (mevcut liste).
>"üzerine yazma" (değer) anlamına gelir.

Bu nedenle sorunuzdaki komut kodu çalışmaz.


Bu zaten kabul edilen cevabın bir parçasıydı. serverfault.com/a/602457/135437
gertvdijk

Bu yazı kıvrık bir karmaşa, Bay Downvotes. Yazar, bir şey rafının, "karışıklığın nedeni" veya eşdeğeri olduğunu belirtmeden, sadece karışıklığın sonuna doğru doğru cevaba dokunduğunu söylüyor. Öylesine kıvrılmış ki, cevabımı o görevden alamadım. Sorunun nedenini gördüm. Benim sonrası edildi bir nedeni upvoted.
Hypocritus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.