Mengapa pengaturan arc_max tidak dihargai di ZFS di Linux?

20

Saya menjalankan ZoL 0.6.2 dari PPA mereka di Ubuntu 12.04. Ada pada host dengan memori 16GB yang dimaksudkan untuk menjalankan beberapa VM menggunakan KVM / Libvirt. Setelah beberapa waktu ZoL menggunakan jumlah memori yang gila, mencapai 98% dari penggunaan RAM dengan beberapa VM berjalan. Ini menghasilkan proses baru yang menolak untuk memulai "tidak dapat mengalokasikan memori". Saya bahkan tidak dapat memulai semua VM saya lagi yang sebelum menggunakan ZFS menggunakan sekitar 40-50% RAM.

Sejauh yang saya mengerti, tanpa mengutak-atik, Zol harus melepaskan memori segera setelah sistem kekurangan memori. Ya tidak. Jadi saya memutuskan untuk mengatur arc_maxpengaturan ke 1GB.

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

Namun, itu tidak melepaskan memori apa pun.

Seperti yang dapat Anda lihat dari statistik ARC di bawah ini, ia menggunakan lebih banyak memori daripada yang dikonfigurasi untuk (bandingkan c= 7572030912dengan c_max= 1073741824).

Apa yang saya lakukan salah di sini?

# 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
sumber

Jawaban:

22

IMHO parameter di / sys / module / zfs / parameter hanya dapat diatur ke 0/ 1- disabled/ enabled. " Koreksi: tergantung pada parameter

Saya berada di kapal yang sama yang ingin membatasi penggunaan memori zfs dan sepertinya seseorang harus membuat file /etc/modprobe.d/zfs.conf dan memasukkan parameter dan nilai yang diinginkan di sana. Perubahan ini akan berlaku saat reboot.

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

Untuk menjalankan modul yang sedang berjalan, seseorang dapat mengubah parameter zfs_arc_max.

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

Harap perhatikan penggunaan >untuk mengganti konten file berbeda dengan menambahkan ke file dengan >>.

sumber: /programming//a/18808311

Tobias F. Meier
sumber
1
Busur ZFS tidak menyusut segera. Namun (ZFSonLinux) itu diklaim kembali sementara aplikasi mengalokasikan memori itu - seperti biasa. Jika Anda membutuhkan sesuatu untuk disimpan dalam memori, mungkin lihat di github.com/hilbix/killmem (hanya 8K setelahnya make static; strip -s killmem)
Tino
Pada Ubuntu 16.04 saya perlu menjalankan update-initramfs -u -k allsebelum reboot untuk memiliki pengaturan ini dari /etc/modprobe.d/zfs.confdiperbanyak.
lechup
@ lechup: Di Ubuntu 16.04, saya menambahkan options zfs zfs_vdev_scheduler=cfqke /etc/modprobe.d/zfs.conf saya . Saya reboot dan berhasil; scheduler sekarang cfq bukan noop . Bisakah Anda menjelaskan mengapa update-initramfs -u -k allperlu?
Martin Velez
@ MartinVelez Saya tahu ini aneh tapi tanpa itu di mesin saya perubahan tidak disebarkan setelah reboot ... Saya mencoba mem-popagasikan opsi yang berbeda zfs_arc_maxmungkin kunci ini entah bagaimana di-cache di initramfs?
lechup
4

Setelah Anda mengubah ukuran busur Anda, Anda harus menjatuhkan cache.

echo 3 > /proc/sys/vm/drop_caches

dan tunggu (prompt Anda tidak akan segera kembali, tetapi proses lain akan terus berjalan). Perlahan-lahan akan membongkar cache (2,5 menit untuk cache 24GB saya pada 2 pasang serangan 1 akan 2TB WD hitam pada cpu berusia 2Ghz 4 tahun pada kotak w / 64GB) - berhati-hatilah, Anda tiba-tiba tidak memiliki cache, dan apa pun proses membaca data akan menarik dari disk mentah sehingga Anda mungkin akan melihat IO menunggu melompat sementara til cache dihuni kembali.

matematika
sumber
Ah keren! Bisakah Anda menjelaskan mengapa '3' sebagai nilai untuk menulis ke entri procfs?
gertvdijk
Bersihkan PageCache saja: # sync; echo 1 > /proc/sys/vm/drop_caches Bersihkan gigi palsu dan inode: # sync; echo 2 > /proc/sys/vm/drop_caches Bersihkan PageCache, gigi palsu dan inode:# sync; echo 3 > /proc/sys/vm/drop_caches
math
2

Salah satu masalah yang bisa Anda hadapi adalah ZFS melakukan caching file mesin virtual (disk virtual). Untuk menghindari itu saya selalu mengatur properti primarycache ke "metadata" pada sistem file yang berisi disk virtual.

Logikanya adalah bahwa OS tamu memiliki petunjuk yang lebih baik pada area apa dari disk untuk cache.

Pavka1
sumber
0

AFAIK salah satu kondisi berikut harus dipenuhi untuk menyesuaikan parameter.

  1. Pada sistem yang berjalan: ekspor semua zpools, hapus modul zfs, aktifkan kembali modul zfs (per definisi ini tidak dapat dilakukan jika / ada di zfs).
  2. Regenerasi gambar initramfs saat mengubah parameter jadi setelah reboot itu akan berfungsi. Ini diperlukan karena lokasi file zfs.conf belum terpasang pada saat itu dalam proses boot.
Sam
sumber
0

Anda punya satu ekstra " >" terlalu banyak.

Perintahnya seharusnya

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

bukan " >>"

>>berarti "menambah" (daftar yang ada).
>berarti "menimpa" (nilai).

Inilah sebabnya mengapa kode perintah dalam pertanyaan Anda tidak akan berfungsi.

Orang munafik
sumber
Itu sudah menjadi bagian dari jawaban yang diterima sekarang. serverfault.com/a/602457/135437
gertvdijk
Pos itu berantakan, Tn. Downvotes. Penulis mengatakan banyak hal, hanya menyentuh jawaban yang benar ketika melewati akhir kekacauan, tanpa menyatakan, "ini alasannya" atau setara. Sangat berbelit-belit, sehingga saya tidak mendapatkan jawaban dari pos itu. Saya melihat alasan dari pertanyaan itu. Posting saya itu upvoted karena suatu alasan.
Hypocritus