在 Proxmox VE 8 上使用 ZFS 作为存储后端时,ZFS 的 ARC(Adaptive Replacement Cache)缓存会占用系统内存。为了优化性能并确保其他服务有足够的内存,您可以根据需求限制 ZFS ARC 缓存的最大内存占用。
临时调整 ZFS ARC 内存大小
可以通过 sysctl 命令临时调整 zfs_arc_max 和 zfs_arc_min 的值,这些更改在系统重启后会恢复默认。
sysctl kstat.zfs.misc.arcstats.c_max=<最大值>
sysctl kstat.zfs.misc.arcstats.c_min=<最小值>
例如,将 ARC 的最大值限制为 64GB:
sysctl kstat.zfs.misc.arcstats.c_max=68719476736
永久调整 ZFS ARC 内存大小
要让设置在重启后仍然有效,需要修改 ZFS 配置文件。
编辑 ZFS 模块参数文件
打开 ZFS 配置文件:
nano /etc/modprobe.d/zfs.conf
添加或修改以下内容:
options zfs zfs_arc_max=68719476736
options zfs zfs_arc_min=34359738368
保存并退出,然后更新 initramfs:
update-initramfs -u
验证配置
查看当前 ZFS ARC 配置:
cat /proc/spl/kstat/zfs/arcstats | grep -E "c_min|c_max"
推荐设置
如果 Proxmox VE 系统是纯粹的虚拟化环境,建议留出 50%-75% 的系统内存给虚拟机。
限制 ARC 最大值: 假设希望将 ZFS ARC 限制为 64GB 或更低:
最大值(zfs_arc_max
):64GB = 68719476736
字节
最小值(zfs_arc_min
):建议为 32GB = 34359738368
字节
过低的 ARC 缓存限制可能会降低 ZFS 的性能,尤其是缓存命中率下降时。
Proxmox VE 的内存管理:如果您在 Proxmox VE 中运行多个虚拟机,应确保为每台虚拟机分配足够的内存,并避免过多的内存争抢。
关闭预取功能(适用于随机读写场景)
如果您的工作负载以随机读写为主,可以禁用预取以进一步节省内存:
echo 0 > /sys/module/zfs/parameters/zfs_prefetch_disable
要永久禁用:
echo "options zfs zfs_prefetch_disable=1" >> /etc/modprobe.d/zfs.conf
update-initramfs -u
调整块大小
减少 ZFS 的块大小(recordsize)可以降低缓存需求。根据工作负载调整,例如:
zfs set recordsize=64K <pool_name>
验证设置
查看当前 ZFS ARC 的内存占用情况:
cat /proc/spl/kstat/zfs/arcstats | grep -E "c_min|c_max"
监控实际内存使用:
arcstat