Proxmox(pve)8 ZFS设置内存限制

在 Proxmox VE 8 上使用 ZFS 作为存储后端时,ZFS 的 ARC(Adaptive Replacement Cache)缓存会占用系统内存。为了优化性能并确保其他服务有足够的内存,您可以根据需求限制 ZFS ARC 缓存的最大内存占用。

设置 ZFS ARC 内存大小的步骤

  1. 临时调整 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

  2. 永久调整 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

  3. 验证配置

    查看当前 ZFS ARC 配置:

    cat /proc/spl/kstat/zfs/arcstats | grep -E "c_min|c_max"

  4. 推荐设置

    如果 Proxmox VE 系统是纯粹的虚拟化环境,建议留出 50%-75% 的系统内存给虚拟机。

    限制 ARC 最大值: 假设希望将 ZFS ARC 限制为 64GB 或更低:


    最大值(zfs_arc_max):64GB = 68719476736 字节

    最小值(zfs_arc_min):建议为 32GB = 34359738368 字节




注意事项


过低的 ARC 缓存限制可能会降低 ZFS 的性能,尤其是缓存命中率下降时。


Proxmox VE 的内存管理:如果您在 Proxmox VE 中运行多个虚拟机,应确保为每台虚拟机分配足够的内存,并避免过多的内存争抢。




降低其他 ZFS 功能的内存消耗



  1. 关闭预取功能(适用于随机读写场景)

    如果您的工作负载以随机读写为主,可以禁用预取以进一步节省内存:

    echo 0 > /sys/module/zfs/parameters/zfs_prefetch_disable


    要永久禁用:

    echo "options zfs zfs_prefetch_disable=1" >> /etc/modprobe.d/zfs.conf

    update-initramfs -u




  2. 调整块大小


    减少 ZFS 的块大小(recordsize)可以降低缓存需求。根据工作负载调整,例如:

    zfs set recordsize=64K <pool_name>



  3. 验证设置


    查看当前 ZFS ARC 的内存占用情况:

    cat /proc/spl/kstat/zfs/arcstats | grep -E "c_min|c_max"

    监控实际内存使用:

    arcstat