ZFS:从10Gbps升级到40Gbps网络

0 介绍

自TrueNAS Core更新至FreeBSD 13,它的两大产品Scale和Core都已经使用上了OpenZFS。既然如此,就直接转投OpenZFS用上Linux了,但考虑到之前一直使用SolarisZFS,可能会对OpenZFS的tuning不太熟悉,就小心翼翼的先使用了一下TrueNAS Scale试手。体验下来我个人不是很喜欢用K3S Containerd,也没有LXC,或者任何平替BSD Jail的东西,用着不是很舒服,等有空把这玩意换了。

过了一周时间实在忍无可忍装回了TrueNas Core。

家里装修时布置了2条MPO数据线的,但不知道为什么只有一条能通网络,导致我有段时间一直是NAS和MAC电脑端对端连着,用着也还行就没想太多。刚好早些时候拼车买了Mellanox SX6036,疫情闲赋在家就拿出来换了一套猫扇,NAS连接Mellanox SX6036再连接家里的10Gbps交换机Mikrotik CRS312,至此把40Gbps网络并入整个家庭内网。

1 硬件添置

  • Mellanox SX6036交换机。闲鱼差不多2000-3000左右,但是海淘Ebay大概在600-1200左右,邮费非常贵,如果有拼车最好了,需要授权才能使用以太网ETH模式,这个可以找淘宝或者Ebay上购买License或者破解,不是很贵。

  • HP 544+ 40Gbps ETH 56Gbps IB QSFP网卡。这个卡闲鱼加转接卡一起卖大概在80-120之间,非常便宜。便宜一般来说带来了很多坑,等下会写这张卡的踩坑记录。

  • Chelsio T580 40Gbps 网卡。这张卡我之前800左右买的,闲鱼现在我看有的1500,有的1000,看运气吧。此卡是唯一一张可以在MacOS下驱动的40Gbps PCIE网卡。此卡目前的驱动只支持到MacOS Big Sur。Monterey开始,苹果使用了DriverKit驱动,只能等Chelsio去做DriverKit。

  • AOC 40Gbps QSFP网线。这个我闲鱼买的橘色的细线,价格大概在30-50元每米,比较方便理线,如果是DAC铜缆价格会更加便宜,但实在是太粗难以梳理。对了,这类线都带了模块的,你不需要再另购入模块。

  • Mellanox MAM1Q00A-QSA-655874-B21 QSFP to SFP+ 转接头。闲鱼价格在100-150之间。这个转接头方便你把10Gbps的SFP+DAC线的其中一个头转换成QSFP,从而将一台10Gbps交换机和40Gbps交换机相连。


1.1 非必选添置

  • 今年夏天实在太热了,NAS风扇只能满转来让硬盘温度稍微好一点,因此,我把原装的846机箱的4个8CM风扇卡槽换成了3个12CM的风扇卡槽,购买了3个追风者T30风扇。8CM兼顾PWM并且转速范围大,噪音低的实在太难买了,换成这款12CM的体验下来效果非常好。卡槽是找淘宝用PETG材质3D打印的。打印文件购买链接

    人家的劳动成果,免费分享并不道义。

    追风者T30风扇需要拨动风扇中央的开关到Advance模式才能达到3000转。


  • 很早之前购买了超微SAS3的背板+SAS3的HBA卡(这个卡的小坑请看以前那篇文章),这样在20个硬盘能达到40Gbps的顺序读写,当然4k小文件就别想提高了。如果无法购买到或硬盘数量达不到,购买1-2个SSD组成Raid0,并写个脚本定期把Raid0的dataset通过ZFS send备份到主池的HDD中也是不错的选择。

    硬盘矿潮后,超微846的仿冒机箱在淘宝闲鱼盛行,务必辨别原装。非原装或者浪潮的846机箱,上面说的3D打印文件应该不适用的!我也没买过那些牌子,不知道那些连个电容都没的背板性能怎么样。我认为24盘原装或者浪潮SAS3 846机箱的价位应该在2500元左右。可怕的是我还见过机箱是原装的,电源背板全是仿冒的,请务必辨别。
    我的NAS RAID是两组10盘Z2,并把两组Z2 Stripe为一组,可以说是Raid60。另外四个盘位随便放了两个ZFS Hot Spare盘热备换用。

  • 选购! ATTO ThunderLink 40Gbps NQ3402 雷电网卡。这张卡是目前唯一一张支持到40Gbps并且受到最新MacOS支持的雷电网卡。价格太贵就提一嘴。这张卡其实只能跑20Gbps,因为雷电的数据传输本身只有20GB。

2 管理SX6036

通过RJ45网线连接交换机的mgt口,登陆其后台IP即可管理。若你不知道管理口IP,需要用Console线(RJ45 to USB)连接,进入向导模式设置管理口IP等,这个可以看官网的说明书,这里不细说这些没用的了,说一下几个小坑。

如果使用SFP光缆配合购物清单中的SFP to QSFP转换头,连接10Gbps交换机和SX6036,请在后台的WEB UI中将连接口的速率手动协商至10Gbps,不然无法通信。
如果你有一条QSFP一分四SFP的线,需关闭其中一个口才能使用。例如,我关闭了SX6036的1口,则4口可以插入这条QSFP一分四SFP的线,具体请查阅说明书来找到关闭对应口。关闭端口必须使用Console线连接才能更改。



2.2 更换SX6036交换机的风扇

此款交换机有一个可灵活拆卸的风扇盒,风扇盒中有4个4CM的风扇;电源中有一个4CM的风扇,所有的风扇都是PWM的。我购买了5个猫头鹰NF-A4x20 FLX 3pin风扇,因为我觉得只要接地线和12v电源两个pin就够了,这风扇满转都听不到声音,我更加不会有心思登录到SX6036的后台通过CLI更改风扇转速。
原装风扇接口不是像主板上一样的4pin,风扇盒的4pin定义如下:

                         颜色                                                       定义                         
                         红                                                   +12v                         
                         蓝                                                   RPM                         
                         黄                                                   PWM                         
                         黑                                                   Black GND                         

我只把FLX版本猫头鹰的红黑两根针接上去了;如果你购买了PWM版本的猫头鹰A4风扇,这款猫扇的4pin定义如下:

                         颜色                                                       定义                         
                         蓝                                                   PWM                         
                         绿                                                   RPM                         
                         黄                                                   +12v                         
                         黑                                                   Black GND                         

更换PSU电源风扇请自行考虑安全性!!个人主观认为300W的电源换个风扇问题不大,不做参考依据!电源上4pin定义如下:

                         颜色                                                       定义                         
                         蓝                                                   PWM                         
                         黄                                                   RPM                         
                         红                                                   +12v                         
                         黑                                                   Black GND                         

猫头鹰风扇和PSU的螺丝孔大小不一样,我用自带的橡皮固定了,见效果图。
此电源好像有其他几个版本,最好用万用表自己对照一下。

若使用PWM的风扇可以在SSH或者Console界面输入如下命令来控制转速:

enable  #进入高级模式
fae mlxi2c set_fan set_fan /FAN/FAN 1 65    #1代表FAN 1; 65为转速
fae mlxi2c set_fan set_fan /PS1/FAN 1 65

更换风扇后,sx6036的指示灯变红,不影响使用。若觉得不舒服,写个定时脚本,通过可以带密码的sshpass去后台清理掉关于风扇相关的报错。

效果图:
IMG_4217.jpg

待传…..

3 网卡过坑

说一下HP 544+和Chelsio T580这两张卡。

3.1 HP Mellanox 544+

如果你不太想折腾,请购买原装原厂的Mellanox卡,最好是还在维护的Mellanox 4代以上。我买了两张,说明一下情况,我的NAS和计算是彻底分开的两台机器,NAS是真的只做存储,而乱七八糟玩的是一台Proxmox VE,因此买两张分别给两台机器。
HP544+这张卡是Mellanox CX354a-FCCT的套娃卡,并不能刷入原装固件。HPE官网最新的固件在TrueNas使用的话,必须把此网卡的SR-IOV功能关闭,不然可能连开机都开不了。

mstconfig -d 03:00.00 set SR_IOV=0

通过BIOS Legacy模式在开机引导此固件Rom的时候也可以直接进入Setup界面关闭SR-IOV,这样无需安装别的软件来设置

暂时不懂怎么在TrueNAS下修改一些内核相关的东西,并且SR-IOV在我的TrueNAS主板上不是必需品,如果你会用,则刷入下面的老固件。

我在Proxmox VE中习惯使用SR-IOV,请到HPE官网下载并刷入fw-ConnectX3Pro-rel-2_40_5072-764285-B21_Ax-CLP-8025-UEFI-14.11.42-FlexBoot-3.4.747.bin这个老版本固件。
即便你使用普通的Linux发行版,驱动都已经deprecated了,插上后可以上网之类的,但是如果你想使用更高级的功能,必须下载Nvidia的OFED驱动进行编译。这个驱动看样子也不会再更新了,不知道哪天还能不能编译出来。下载对应的OFED编译,方式跟下面Chelsio的差不多就不写了。另外通过我的观察,即便IOMMU分组已经分开两个口的IRQ了,但是PCI地址还是一个,所以无法将两个口分别直通给两个不同的VM Guests。如果可以,请告知。

尽管搜索国外论坛提示如果不用OFED可能会在使用SR-IOV或者Pause帧中遇到问题,我这两天还是试用tree上自带的驱动并使用SR-IOV,暂时还没出现问题,就先观察一下,有问题的话下面内容我会直接删了再把OFED的东西补一下。我没有编译过OFED,pve用的是Ubuntu LTS的内核,随便看了一下好像还行,但是能用in-the-tree的驱动就不想动了。
安装mstflint,以Proxmox VE为例:

apt update && apt install mstflint

通过lspci获得Mellanox网卡的设备号并设置,例如:

lspci |grep Mellanox

03:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]

mstflint -d 03:00.00 query   #获得固件信息
mstflint -d 03:00.00 -i 固件路径 b  #刷入固件
mstconfig -d 03:00.00 query    #获取设备设置信息
mstconfig -d 03:00.00 set SR_IOV=1 NUM_OF_VFS=8  #开启SR-IOV以及设置VF总数为8个;确保主板已开通sr-iov,Proxmox VE已完成虚拟化等设置
mstconfig -d 03:00.00 set LINK_TYPE_P1=ETH  #设置p1端口为ETH模式

创建一个/etc/modprobe.d/mlx4_core.conf填入:

options mlx4_core port_type_array=2,2 num_vfs=4,0,2 probe_vf=4,0,2
  • port_type_array=2,2 意味着两个端口都是ETH模式
  • num_vfs 是VF数量,格式是a,b,c。a和b分别代表端口1和2的VF量,而C是总量。注意C不是a+b,而是a和b的数量去掉PF数量。
  • probe_vf 格式同上;为Proxmox下ip link中能得到的数量
  • 这里我让第一个口做了4个VF给各种虚拟机和LXC用,第二个口不动我拿来给PVE用了。

设置完后记得update-initramfs -u
写一个systemd unit来让VF开机 Link UP并分配固定MAC地址,请自行搜索,懒得写了,或者有空补一下吧。

最后提一嘴,Windows的VM使用这个VF的话要么用proxmox的kernel patch,要么安装OFED,具体参考这里。我别的虚拟机全是LXC所以很方便通过PF或者VF。通过修改/etc/pve/lxc/xxx.conf文件,加入你想要通过去的VF即可了:

lxc.net.1.type: phys
lxc.net.1.flags: up
lxc.net.1.link: enp3s0v0
lxc.net.1.hwaddr: ae:54:1c:2b:c0:00
lxc.net.1.name: eth11
lxc.net.0.type: phys
lxc.net.0.flags: up
lxc.net.0.link: enp3s0v1
lxc.net.0.hwaddr: ae:54:1c:2b:c0:01
lxc.net.0.name: eth2

####下面这部分是我的NixOS LXC使用proxmox主板的核心显卡,跟主题无关,当个小彩蛋吧。
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.cgroup2.devices.allow: c 29:0 rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file
lxc.autodev: 1
lxc.hook.autodev: sh -c "chmod -R 666 /dev/dri/card*; chmod -R 666 /dev/dri/render*"

我通两个VF是因为有一个eth11我是给transmission下载PT用的,transmission的config.json中可以设置bind-address-ipv4,这样我在路由器上就可以更方便的管理transmission.,e.g.定时限速,是否走特殊的流量代理。



3.2 Chelsio T580

Chelsio对FreeBSD的支持特别好,我想因此他们也愿意做一下MacOS的驱动。这张卡在linux下的驱动比较麻烦,随手写一下我在 Proxmox VE 7下面驱动此卡的方法:

  • 从官网下载最新版的tar.gz压缩包

  • 解压压缩包tar -zxvf ChelsioUwire-x.xx.x.x.tar.gz

  • 安装rpm sudo apt install rpm

  • 安装pve的linux headers

    sudo apt install pve-headers-`uname -r`
  • 确认你kernel sources的路径,应该是usr/src/linux-headers-x.xx.xx-x-pve/

  • 回到刚才解压缩好的文件夹里,修改Makefile:

    DEBIAN := 1
    PDEB := 1
    DISTRO := Debian
  • 在当前目录编译驱动 make KDIR=/usr/src/linux-headers-x.xx.xx-x-pve/

  • 完成后你可以使用此卡的高级功能 e.g.SR-IOV, etc.

    每次更新PVE内核你都需要重新编译驱动。



3.2.1 Chelsio T580在MacOS下的驱动

这张卡直接在官网下载驱动安装就行,最高只支持到Big Sur,如遇签名过期,断网修改本地时间。
如果你希望干净一点安装,在MacOS下通过命令pkgutil --expand-full [pkg] [dir]获得PKG内的KEXT。其中cxgb.kext是Chelsio T580的驱动,cxgb3.kext是T3xx系列的驱动。

如果是黑苹果,你可以通过OpenCore直接加载kext。

  • 这个卡超级超级超级热!温度过高会导致掉光模块或者掉卡。一个风扇不够,你需要2-4个风扇全面覆盖它才可以;条件允许,水冷。

    注意,拆卸此卡时小心灼伤!



4 OpenZFS

对于FreeBSD而言,SolarisZFS和OpenZFS使用上差别不是那么大。但是在Linux上实现OpenZFS我暂时没明白,OpenZFS的实现固然很有用,但是在BSD里物理硬盘与VDEV是依赖于Geom去实现的,Geom提供providers给OpenZFS来做成VDEVs,则完成整一套的虚拟-物理设备之间的通信。因不懂没了Geom怎么实现block的check sumdata healing,既然不懂,我就不用了吧。

4.1 Ashift

4.2 Meta Vdevs

4.3 Dedup Vdevs

4.4 Slog

4.5 L2arc

4.6 HDD Storage Pool

4.7 OpenZFS tuning

ZFS 的使用优化是没有参照的,即便是跟我买完全一模一样的机器,拿回去使用场景不同都不能tuning一样的。老老实实看OpenZFS的Manual吧,没有捷径。但我可以说一下我自己的一些40Gbps网路下的Tuning思路。

  • 在内存有限的情况下使用L2arc提高读取速度。L2arc是一个高性价比的选择。在内存arc仍然growing的情况下强行使用l2arc只会让你的读取速度变慢,按现代计算机架构来看,没有啥SSD是比内存更快的。
  • L2arc的容量尽可能匹配内存arc容量的4-5倍之间,超过容量后的那部分tuning不切实际。
  • dirty data的设置需要花时间观察的,因为不同场景下的值不是一样的,也不是越大越好,需要花费大量时间观察调整,再观察调整循序渐进,没吃太饱的话还是保持默认吧。
  • 慎重考虑OpenZFS meta fusion pool这个功能。
  • 最后提一嘴,所有的Tuning都是有代价的。


5 NFS Tuning

NFS对于小文件的读写是不理想的,有条件的话尽可能使用iSCSI。
NFS Version ≥ 4.1,并且在NFS Server 设置中把线程设置成24个或者更高(看你CPU),链接NAS是可以大文件跑满40Gbps的。如果是4k小文件请调小NAS服务端的Block Size,同样客户端的wsize rsize都理应调小。另外MTU 9000对于4k是很有用的,条件允许,开启。
MacOS依然没有更新NFS版本,并且在Finder下因为Foundation API通过版本NFS v4.0连接NAS会出现断连的情况,而在MacOS的Terminal中使用POSIX权限则没有这样的现象。
但在MacOS中,无论使用什么40Gbps卡,你都只能在UI界面环境中获得20Gbps的连接速度,这也许是因为协议层太过老旧而用户无从选择。

如果是Samba的话,我无法给出一个标准答案,这完全取决于你CPU的单核心能力,毕竟只有上传和下载两个线程。又或者说你希望使用SMB Multi-Channels功能来解决这个问题。

话说回来,微软那边已经支持SMB作为服务端(也就是你必须用Win Server)而客户端用新的社区Samba版本,也可以多线程了。不知道微软和Samba弄到啥时候去,太畸形了,作为用户我唯一的权利就是选择不用。

6 ZFS Send

机械SATA硬盘无法与现代的SSD比肩4k类的读写,尤其是在IO Depth IOPS等方面。OpenZFS提供之前提到的Meta devs功能来提高4k的写入,后面会讲到。如果只是简单使用的话,可以单独使用了一块SSD硬盘做日常的使用,并且设置了ZFS Send按天回传数据到HDD池中。

zfs send SSD/[email protected] | zfs recv Home/test

ZFS Send必须先建立快照,其中3代表快照名,而后的Home/test则为机械硬盘池。同样,你可以使用TrueNas自带的Replication Task来完成类似的操作。

7 Proxmox VE ZFS over iSCSI

在设置好TrueNAS的ZFS Pool后,另一台负责计算的Proxmox VE则不需要硬盘了。考虑无盘启动的话,可以参考很多IPXE教程,当然如果是超微主板或者Mellanox网卡可以直接使用Booting over iSCSI。超微的BIOS中直接有这个选项,Mellanox的话使用它的Flexboot功能就可以了。
除了启动盘外,那各个VM Guest则需要开启Proxmox VE的ZFS over iSCSI功能。在PVE的DatacentreStorageAdd中添加。

这个ZFS over iSCSI其实和真正的还不一样,说白了只是一个远程的Zvol管理功能。

这里并没有可支持TrueNAS的iSCSI Provider。你需要使用这个插件来连接TrueNAS。

这个插件的API Password就是root的登陆密码,不是API Key

使用这个工具可以对VM Guest自动化操作snapshot。这里的快照是使用ZFS Snapshot的,可以完全利用到ZFS的功能了。链接中有好多个视频操作演示教程,这里就不赘述了。

8 性能测试

9 一些题外话

  • 非常喜欢用网卡ipxe+Ventoy这套东西跑系统,最近发现Mikrotik ROS系统在DHCP Server选项中增加了一个Option Matcher的功能。配合Option 93可以根据主板的架构分配不同的引导文件e.g.ArmUEFI,LegacyBIOS,x86UEFI.

  • MTU 9000, AKA Jumbo Frames, 你需要慎重去考虑你整个网络内的所有设备通信,这个东西带来的收益其实远比它带来的问题多,如果你家里有很多无线智能设备的话,考虑尽可能用vlan去划分。网络inbound的话,需要修正mss,Mikrotik ROS则加一条mangle:

    /ip firewall mangle add action=change-mss chain=forward new-mss=clamp-to-pmtu passthrough=yes protocol=tcp tcp-flags=syn
下一篇