我正在运行 ZoL 0.6.2他们的 PPA在 Ubuntu 12.04 上。它位于具有 16GB 内存的主机上,旨在使用 KVM/Libvirt 运行一些虚拟机。一段时间后,ZoL 占用了大量内存,在一些虚拟机运行时,内存使用率达到 98%。这导致新进程拒绝启动“无法分配内存”。我甚至无法再启动所有虚拟机,在使用 ZFS 之前,这些虚拟机占用了大约 40-50% 的内存。
据我所知,如果不进行调整,ZoL 应该会在系统内存不足时立即释放内存。但事实并非如此。所以我决定将设置设为arc_max
1GB。
# echo 1073741824 >> /sys/module/zfs/parameters/zfs_arc_max
但它并没有释放任何内存。
从下面的 ARC 统计数据可以看出,它使用的内存比配置的要多(比较c
=7572030912
与c_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
答案1
恕我直言,/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
请注意使用>
来替换文件的内容,而不是使用 来添加到文件>>
。
答案2
一旦修改了弧大小,就需要删除缓存。
echo 3 > /proc/sys/vm/drop_caches
然后等待(您的提示不会立即返回,但其他进程将继续运行)。它将缓慢卸载缓存(对于我的 2 对 raid 1'd 2TB WD 黑色硬盘上的 24GB 缓存,需要 2.5 分钟,该硬盘位于 2Ghz 4 年旧 CPU 上,位于 64GB 的盒子上)- 请注意,您将突然没有缓存,并且任何读取数据的进程都将从原始磁盘中拉出,因此您可能会看到 IO 等待时间跳升一段时间,直到重新填充缓存。
答案3
http://fibrevillage.com/storage/169-zfs-arc-on-linux-how-to-set-and-monitor-on-linux
这篇文章很好
从 ZoL 0.6.2 版本开始,您可以在运行时设置 c_max,但是 ARC 大小不会自动释放。要强制释放 RAM,需要导出 zpool。
答案4
您可能遇到的一个问题是 ZFS 缓存虚拟机文件(虚拟磁盘)。为了避免这种情况,我总是在包含虚拟磁盘的文件系统上将 primarycache 属性设置为“元数据”。
逻辑是,客户操作系统最好提示一下要缓存其磁盘的哪些区域。