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

我在Ubuntu 12.04上从PPA运行ZoL 0.6.2。 它在一台主机上,有16GB内存,用于运行一些使用KVM / Libvirt的虚拟机。 过了一段时间,ZoL使用了大量的内存,一些虚拟机运行时内存使用率达到了98%。 这导致新进程拒绝启动“无法分配内存”。 在使用ZFS之前,我甚至无法启动所有的虚拟机,大约占用了40-50%的内存。

据我所知,没有调整,ZoL应该尽快释放内存系统内存不足。 那么,它不。 所以我决定把arc_max设置为1GB。

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

不过,它并没有释放任何内存。

从下面的ARC统计中可以看到,它使用的内存比configuration的更多(比较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 

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

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

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

    为了实现运行模块,可以更改zfs_arc_max参数。

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

    请注意使用>replace文件的内容,而不是用>>添加到文件中。

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

    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。

    您可能会遇到的一个问题是ZFScaching虚拟机文件(虚拟磁盘)。 为了避免这种情况,我总是将primarycache属性设置为包含虚拟磁盘的文件系统上的“元数据”。

    其逻辑是客户操作系统有更好的暗示其磁盘的哪些区域caching。

    一旦你修改了弧的大小,你需要放弃你的caching。

     echo 3 > /proc/sys/vm/drop_caches 

    并等待(您的提示不会立即返回,但其他进程将继续运行)。 它会缓慢地卸载caching(我的24GBcaching2.5分钟,在一个2Ghz 4年的cpu上,一个盒子上有64GB的2个RAID 1的2TB WD黑色) – 当心,你会突然没有caching,读取数据的进程将被取消原始磁盘,所以你可能会看到IO等待跳过一段时间直到高速caching重新填充。

    AFAIK必须满足以下条件之一以适应参数。

    1. 在正在运行的系统上:导出所有zpools,删除zfs模块,重新启用zfs模块(每个定义在zfs上为/时不能完成)。
    2. 在更改参数时重新生成initramfs映像,以便在重新启动后运行。 这是需要的,因为zfs.conf文件位置在那个时候还没有安装在引导过程中。