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去后台清理掉关于风扇相关的报错。
效果图:
待传…..
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 sum
和data 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的Datacentre
–Storage
—Add
中添加。
这个
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