为什么在 Linux 上的 ZFS 上不支持 arc_max 设置?

ger*_*ijk 22 zfsonlinux

我在 Ubuntu 12.04 上从他们的 PPA运行 ZoL 0.6.2 。它位于具有 16GB 内存的主机上,旨在使用 KVM/Libvirt 运行一些 VM。一段时间后,ZoL 使用了大量内存,在某些 VM 运行时达到了 98% 的 RAM 使用率。这导致新进程拒绝启动“无法分配内存”。我什至无法再启动我所有的 VM,在使用 ZFS 之前,它们使用了大约 40-50% 的 RAM。

据我了解,无需调整,一旦系统内存不足,ZoL 应该立即释放内存。好吧,它没有。所以我决定将设置arc_max设置为 1GB。

# echo 1073741824 >> /sys/module/zfs/parameters/zfs_arc_max
Run Code Online (Sandbox Code Playgroud)

尽管如此,它不会释放任何内存。

正如您从下面的 ARC 统计数据中看到的,它使用的内存比配置的要多(比较c=7572030912c_max= 1073741824)。

我在这里做错了什么?

# 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
Run Code Online (Sandbox Code Playgroud)

小智 28

恕我直言,/sys/module/zfs/parameters 中的参数只能设置为0/ 1- disabled/ enabled。” 更正:取决于参数

我在同一条船上想要限制 zfs 的内存使用,似乎必须创建一个 /etc/modprobe.d/zfs.conf 文件并在其中输入参数和所需的值。此更改将在重新启动后生效。

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

要影响正在运行的模块,可以更改 zfs_arc_max 参数。

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

请注意使用>来替换文件的内容,而不是使用>>.

来源:https : //stackoverflow.com/a/18808311

  • 在 Ubuntu 16.04 上,我需要在重新启动之前运行“update-initramfs -u -k all”,以传播“/etc/modprobe.d/zfs.conf”中的设置。 (2认同)

mat*_*ath 10

修改弧大小后,您需要删除缓存。

echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

并等待(您的提示不会立即返回,但其他进程将继续运行)。它会慢慢卸载缓存(我的 24GB 缓存在 2Ghz 4 岁 cpu 上的 2 对 24GB 缓存上的 2.5 分钟 w/64GB 的盒子上) - 当心,你会突然没有缓存,任何读取数据的进程将脱离原始磁盘,因此您可能会看到 IO 等待跳转一段时间,直到重新填充缓存。