开始使用zfs

前言

终于将nas的磁盘由ext4转换到了zfs,为了得到它的快照功能和读写缓存,暂时不考虑镜像和比特冗余

创建

准备一个空的磁盘设备,例如/dev/sdc2

  1. 创建zfs池 zpool create wd8t /dev/sdc2

    创建后,会自动挂载于“/wd8t”

  2. 创建子卷 zfs create wd8t/backup,子卷和分区一样,跨子卷mv文件,不是瞬间完成,而是需要完整的时长

缓存

折腾了一通,发现读写缓存有一个ZIL,于是按照教程https://www.liujason.com/article/800.html 设置了一番,发现提升不是很明显,而且使用zpool iostat -v 查看,log设备也几乎没有使用

经过一番实验和搜索,终于发现,原来ZIL的log缓存,仅仅是将同步写变为异步写,数据写入log缓存设备就返回成功。

看了 不添加ZIL也可以设置后实现极高的写入性能。
之后,发现原来arc内存缓存才是我需要的

  1. 查看arc缓存信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    cat /proc/spl/kstat/zfs/arcstats |grep c_
    c_min 4 0
    c_max 4 0
    arc_no_grow 4 0
    arc_tempreserve 4 0
    arc_loaned_bytes 4 0
    arc_prune 4 347
    arc_meta_used 4 60030656
    arc_meta_limit 4 1610612736
    arc_dnode_limit 4 161061273
    arc_meta_max 4 1265171344
    arc_meta_min 4 16777216
    async_upgrade_sync 4 23196
    arc_need_free 4 0
    arc_sys_free 4 130445248
    arc_raw_size 4 0

    默认是没有使用arc的,所以min和max都是0

  2. 编辑 /etc/modprobe.d/zfs.conf,写入:

    1
    2
    3
    # Min 512MB / Max 2048 MB Limit (it’s a low memory 4GB only system )
    options zfs zfs_arc_min=536870912
    options zfs zfs_arc_max=2147483648

    再次使用上一步的命令查看设置是否生效,或者:
    cat /sys/module/zfs/parameters/zfs_arc_min
    cat /sys/module/zfs/parameters/zfs_arc_max

  3. 使用 zfs set sync=disabled pool1/data1 来禁用同步写入,都用异步写入,就都可以走内存缓存写了。

参考:https://www.solaris-cookbook.eu/linux/linux-ubuntu/debian-ubuntu-centos-zfs-on-linux-zfs-limit-arc-cache/

压缩

# on | off | lzjb | gzip | gzip-N | zle | lz4

zfs set compression=on pool1/data1

开启压缩功能后,仅对新写入的数据生效

这可真是太棒了,我可以为一个卷单独设置压缩以节省空间,而不需要害怕开启压缩导致任意写入过慢
参考:https://postgres.fun/20140710114452.html

去重

zfs set dedup=on pool1/data1

但是这篇文章 《为FreeNAS节约存储空间,是压缩还是重复数据删除?》 说不要开启去重,否则会占用大量内存

但是,这种技术非常耗费内存,按照官方的建议,通常1TB存储空间需要额外提供5GB的内存。当启用Deduplication时,向数据集写入的数据越多,所需的内存就越多。如果内存过小,容量不足以保存DDT(重复数据删除表),系统会将DDT存储在磁盘上,这将会导致系统性能一落千丈


至此,我们的zfs就设置好啦,一切看起来都是很美好,不过要记得给机器加上UPS防止断电丢数据哦,因为数据都会先存在内存缓存中

鄂ICP备14007840号-1