前言
终于将nas的磁盘由ext4转换到了zfs,为了得到它的快照功能和读写缓存,暂时不考虑镜像和比特冗余
创建
准备一个空的磁盘设备,例如/dev/sdc2
创建zfs池 zpool create wd8t /dev/sdc2
创建后,会自动挂载于“/wd8t”
- 创建子卷 zfs create wd8t/backup,子卷和分区一样,跨子卷mv文件,不是瞬间完成,而是需要完整的时长
缓存
折腾了一通,发现读写缓存有一个ZIL,于是按照教程https://www.liujason.com/article/800.html 设置了一番,发现提升不是很明显,而且使用zpool iostat -v 查看,log设备也几乎没有使用
经过一番实验和搜索,终于发现,原来ZIL的log缓存,仅仅是将同步写变为异步写,数据写入log缓存设备就返回成功。
看了 不添加ZIL也可以设置后实现极高的写入性能。
之后,发现原来arc内存缓存才是我需要的
- 查看arc缓存信息 默认是没有使用arc的,所以min和max都是0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16cat /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 编辑 /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
使用 zfs set sync=disabled pool1/data1 来禁用同步写入,都用异步写入,就都可以走内存缓存写了。
压缩
# 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防止断电丢数据哦,因为数据都会先存在内存缓存中