FreeBSD下能否在不同磁盘(如NVMe盘)创建snapshot的clone以提升性能?
嗨,作为FreeBSD用户,我完全懂你想把克隆放到NVMe盘来提速的需求——毕竟NVMe的读写速度比普通磁盘快太多,而且同盘同时读写确实容易互相拖慢效率。好消息是,你想要的操作完全可以实现,而且正好能解决你担心的同盘读写性能下降问题!
其实在FreeBSD的ZFS环境下(你提到的dataset应该就是ZFS数据集吧),直接跨磁盘创建原生ZFS克隆是不行的(ZFS克隆默认要求和快照在同一个存储池),但我们可以用zfs send和zfs recv这对组合,实现“跨盘克隆”的效果,本质上是把快照完整复制到NVMe盘的存储池里,得到一个独立的、性能拉满的副本。
具体操作步骤给你理清楚:
先把NVMe盘加入ZFS存储池
首先确认你的NVMe盘已经被系统识别,用geom disk list或者gpart show可以查到设备名(比如/dev/nvd0)。然后在这个盘上创建一个新的ZFS存储池:zpool create nvme_pool /dev/nvd0如果你的NVMe盘已经分好区,就用分区路径(比如
/dev/nvd0p1)代替上面的设备名。给原数据集创建快照
假设你的原iSCSI数据集是tank/iscsi_data,先给它创建一个快照:zfs snapshot tank/iscsi_data@clone_snap这里的
@clone_snap是快照名,你可以随便取个好记的。把快照发送到NVMe池生成“克隆”
用管道把快照数据发送到NVMe的存储池,生成一个新的数据集——这就是你要的跨盘克隆了:zfs send tank/iscsi_data@clone_snap | zfs recv nvme_pool/iscsi_clone完成后,
nvme_pool/iscsi_clone就是原数据集的完整副本,而且完全在NVMe盘上运行。把克隆数据集配置到iSCSI服务
之后你就可以把这个NVMe上的数据集配置成iSCSI虚拟磁盘,所有写入操作都会在NVMe盘上进行,原磁盘只负责原数据集的读取,两者互不干扰,完全不会出现同盘读写的性能瓶颈,反而写入速度会因为NVMe的高IOPS大幅提升。
另外补充个小技巧:如果之后原数据集有更新,你还可以用增量发送来同步克隆,比如原数据集又做了新快照@clone_snap2,就可以用下面的命令同步增量变化:
zfs send -i tank/iscsi_data@clone_snap tank/iscsi_data@clone_snap2 | zfs recv nvme_pool/iscsi_clone
操作前记得备份重要数据哦,虽然ZFS可靠性很高,但谨慎点总没错~
备注:内容来源于stack exchange,提问作者Charles Kwon

