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铜缆价格会更加便宜,但实在是太粗难以梳理。对了,这类线都带了模块的,你不需要再另购入模块。如果要用IB功能,线就有点贵了,自行搜索。
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口,再在ssh管理界面中对4口标注为1分4,则4口可以插入这条QSFP一分四SFP的线,具体请查阅说明书来找到关闭对应口。记不清这些操作到底是ssh就行,还是一定要console,这里还是推荐买个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 SRIOV_EN=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,只是发现了windows虚拟机上的VF有个小问题,下面给了解决方案了,别的没碰到啥问题。我没有编译过OFED,随便看了一下好像还行,但是能用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 SRIOV_EN=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
后重启。
创建一个shell,assign mac地址以及vf link up:
nano /opt/sr-iov.sh
内容如下
#!/bin/sh
ip link set dev enp2s0 mtu 9000 #这个你看自己需求是否要设置mtu。如果pf是1500,那么vf设置9000会有问题。
ip link set dev enp2s0 vf 0 mac ae:51:1a:2b:c0:00
ip link set dev enp2s0 vf 1 mac ae:51:1a:2b:c0:01
ip link set dev enp2s0 vf 2 mac ae:51:1a:2b:c0:02
ip link set dev enp2s0 vf 3 mac ae:51:1a:2b:c0:03
ip link set enp2s0 up
ip link set enp2s0v0 up
ip link set enp2s0v1 up
ip link set enp2s0v2 up
ip link set enp2s0v3 up
记得chmod +x /opt/sr-iov.sh
创建systemd unit开机运行
nano mlx-sr-iov.service
内容如下
[Unit]
Description=Script to enable MLX SR-IOV
[Service]
Type=oneshot
ExecStart=/opt/sr-iov.sh
[Install]
WantedBy=multi-user.target
创建完执行systemctl enable mlx-sr-iov.service
则看到效果了;执行systemctl enable mlx-sr-iov.service
则开机自动运行
我这个X11-SCA-F主板要在BIOS开启
ARI
才能sr-iov出7个以上的VF。但ARI的开关是被隐藏的,你需进入grub执行setup var手动开启,自行搜索懒得写了。
如果要用Windows的VM,则尽可能使用Windows的LTSC版本。在PVE内核大于Linux 5.13的情况下,使用3代网卡的VF直通到Windows你要对Proxmox的kernel进行patch,不然Windows Guest的设备管理器里,这个VF会报错code 43。具体参考这里。 有空我把我自己patch好的传到Github上去。当然不使用tree上的驱动,在Proxmox上安装OFED驱动也可以解决,但是3代卡的OFED驱动也就只支持到5.13的内核,还是要自己编译驱动,自己选哪条路简单。最后一种办法是安装proxmox-ve_7.1-2.iso这个版本,然后pin内核。
uname -a #查看内核版本
apt update
apt search pve-kernel|grep pve-kernel- #查看可以安装的内核
apt install pve-kernel-5.xxxxxx-pve #安装特定版本内核,当然初次安装的是新的内核切回去旧的太麻烦了,还不如重装。
proxmox-boot-tool kernel list #查看pve下已经有的内核
proxmox-boot-tool kernel pin 5.13.19-6-pve #pin住内核
说实在的,Windows我都懒得用。都不知道Windows怎么跑40Gbps,文件管理器是单线程的,SMB是单线程的,ISCSI在较新的windows 10版本中也是单线程的=。=。RDMA?跟这篇文章主题无关。
我别的虚拟机全是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
Ashift是设置物理硬盘的Block size
的。例如,Seagate EXOS 16T的7200转SATA机械硬盘默认是一个logic sector默认为512B,physcial sector默认是4k。在老的FreeNAS版本中,通过UI建立存储池默认给的Ashift是9,代表着512B。而现代的TrueNAS默认给的是0,代表自动辨别。一般来说,设置成9(512B)会带来一个问题:写入一个4K文件,它会切割成8份,那会对服务器带来一定的压力,但尽量减少空间损失。而如果设置成更大,则会浪费空间。书籍中建议设置成Ashift=12,则是block size=4k。这样会尽力减小服务器压力,而浪费的空间则可以通过compression来减少损失。通过如下命令确认自己的Ashift:
zpool get all PoolName |grep ashift
为什么是9和12? 2^9=512;2^12=4096。一些新的SSD已经到了8k,则ashift=13
4.2 Meta Vdevs
Meta Vdevs是近几年新出的一个功能。这个Vdev并不是一个缓存,而是一个Storage,因此,你需要确保这个Vdev有较高的安全性,比如两个optane硬盘组成一个Mirror甚至更大的冗余,如果这组Vdev坏了,在同一个Pool下的机械池数据也同样丢失。请不要想着试试看能不能用
,操作不可逆。
Meta Vdevs解决了两个问题。
- 如果你的存储池存在很多小文件,那读取或者写入都会牵扯到机械硬盘的stroke时间,io depth,queue等问题。那么,如果把pool的
Metadata
放在了Optane上,则至少可以减少storke的时间,也能收获到更多的IO queues,这对小文件多线程是很有帮助的。 - 你同样可以对Meta Vdev进行设置:把特定的
Block size
文件存于Optane中,而没有命中规则的文件,则放入原来的机械存储池中。
TrueNas的Pool–dataset–option中,可以看到你对这个池的Record size
,比如我的是128K,然后我在下面的Metadata (speical) small block size
中设置一个值,比如是64k。当一个文件≤ 64k,则自动存入Optane中。当Metadata (speical) small block size
=Record size
,则所有文件全会存入Optane中,显然这样做,还不如单独用Optane建立一个池。
在看Meta Vdevs
的手册时,我思考了如下两个问题:
Optane作为Meta Vdev存满了,我该怎么办?
根据手册的说法,Meta Vdev存满了,则会根据算法自动将使用频率少的文件回落到机械硬盘。
我应该选择多大的Optane来存放?
我们可以看一下你之前的一些比较具有代表性的小文件池来观察估算:
cd /mnt/poolname/test #cd到你想测试的dataset下
find . -type f -print0 | xargs -0 ls -l | awk '{ n=int(log($5)/log(2)); if (n<10) { n=10; } size[n]++ } END { for (i in size) printf("%d %d\n", 2^i, size[i]) }' | sort -n | awk 'function human(x) { x[1]/=1024; if (x[1]>=1024) { x[2]++; human(x) } } { a[1]=$1; a[2]=0; human(a); printf("%3d%s: %6d\n", a[1],substr("kMGTEPYZ",a[2]+1,1),$2) }'
看一下你的这个dataset下文件的整个block size分布,按比例预估。
另外通过如下命令也可以看到整个pool的情况,除掉L0 Total
外的总和就是你的metadata目前所需要的空间。具体的一些估算以及应用方法请参考这里。当然,我们讨论的文件大小都是通过compression压缩后的大小。非Optane的SSD作为Meta Devs你需要手动开启trim on
。
zdb -LbbbA -U /data/zfs/zpool.cache <poolname>
最后有个小问题,metadata对于Zvol是无用的。对ZFS来说,往zvol写入多少文件都只是block size
大小完全一样的存在,你可以收益到的只是Metadata对Zvol的加速。这个问题的讨论请参考这里。如果你是zvol用的频繁并且还需要更极致的zvol性能,参考章节6.ZFS Send。
4.3 Dedup Vdevs
一般来说,开启了dedup功能的dataset能做到文件去重复的作用,也就是多个一模一样的文件只占用一份文件的容量。以前用内存来做,代价是用内存换硬盘空间,现在即便是可以用Dedup Vdev来换机械硬盘空间,也不推荐。Meta Vdevs存储了dedup datasheet,同样做到了dedup功能,不如用meta dev。
开启dedup的dataset是不可逆的,请把已经开启dedup的dataset通过zfs send
到新的dataset里,再删除旧的。名字的话通过zfs rename
改回来。
4.4 Slog
如果说起ZFS的写缓存,往往会被误导到使用Slog,这里可以明确指出,Slog不会让你的写入速度超过当你dataset设置成async的速度的。ZFS在写入时先产生ZFS intent log(ZIL),也就是未来会写入的文件的一个操作日志,在5秒为预期的时间内,文件会先进入内存(TXG),再写入硬盘,当整个文件还没落盘,文件不具备可读性以及可执行性的情况下,我们称之为脏数据(dirty data),最后等落盘写入,整个操作完成,而这个文件通过判断可能会继续留在内存的ARC里作为未来的读缓存。我们看下来整个过程,其实ZFS并不具备传统意义上的写缓存,而是一个缓冲区为未来的读取做准备的。
另一方面这样的写入是异步操作的,在更严谨的环境中,需要同步写入(sync write)。同步写入的速度会非常慢,通过增加Slog,比如Optane这种写入快,安全性高的硬盘去帮我们提高写入速度,当然,当Optane开启了FUA bit作为Slog后,速度也不会太好看的。
总之,Slog只是保证了你文件的同步写入,家用情况,UPS足矣。
4.5 L2arc
L2arc是ZFS的读缓存。在访问ZFS时,一些常用文件会放置于内存ARC中,以便快速读取,而内存的容量是相对有限且昂贵的,因此增加一个L2arc可以
4.6 HDD Storage Pool
TrueNAS通过WebUI建立的pool非常平庸,如果你对自己的硬盘参数性能非常了解,请通过zfs命令建立。
有空再写。
4.7 OpenZFS Tuning
ZFS 的使用优化是没有参照的,即便是跟我买完全一模一样的机器,拿回去使用场景不同都不能tuning一样的。老老实实看OpenZFS的Manual吧,没有捷径。但我可以说一下我自己的一些40Gbps网路下的Tuning思路。
- 在内存有限的情况下使用
L2arc
提高读取速度。L2arc
是一个高性价比的选择。在内存arc仍然growing的情况下强行使用l2arc只会让你的读取速度变慢,按现代计算机架构来看,没有啥SSD是比内存更快的。 L2arc
的容量尽可能匹配内存arc
容量的4-5倍之间,超过容量后的那部分tuning不切实际。dirty data
的设置需要花时间观察的,因为不同场景下的值不是一样的,也不是越大越好,需要花费大量时间观察调整,再观察调整循序渐进,没吃太饱的话还是保持默认吧。- 慎重考虑
Meta Devs
这个功能。 - 最后提一嘴,所有的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卡,你都只能在GUI界面环境中获得20Gbps的连接速度,这也许是因为协议层太过老旧而用户无从选择。
如果是Samba的话,我无法给出一个标准答案,这完全取决于你CPU的单核心能力,毕竟只有上传和下载两个线程。又或者说你希望使用SMB Multi-Channels
功能来解决这个问题。
话说回来,微软那边已经支持SMB作为服务端(也就是你必须用Win Server)而客户端用新的社区Samba版本,也可以多线程了。不知道微软和Samba弄到啥时候去,太畸形了,作为用户我唯一的权利就是选择不用。
6 ZFS Send
机械SATA硬盘无法与现代的SSD比肩4k类的读写,尤其是在IO Depth
IOPS
等方面。如果你不满足于Meta devs
功能来提高4k的写入和读取,单独使用了一块SSD硬盘做日常的使用,并且设置了ZFS Send
按天甚至按小时回传数据到HDD池中。
zfs send SSD/[email protected] | zfs recv Home/test
ZFS Send
必须先建立快照,其中3
代表快照名,而后的Home/test则为机械硬盘池。同样,你可以使用TrueNas Web UI中自带的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 IP over Infiniband
Proxmox VE和TrueNAS都支持IP over Infiniband(IPoIB)。这里最好买原装的Mellanox 56GB FDR QSFP+铜缆,别的牌子可能兼容性没有这么好,闲鱼大概2米的在100元左右(线比网卡贵系列)。
首先最好找一台机器把两张HP 544+的卡的其中一个口刷成IB mode,TrueNAS系统下是无法操作的。
lspci |grep Mellanox
03:00.0 Ethernet controller: Mellanox Technologies MT27520 Family [ConnectX-3 Pro]
mstconfig -d 03:00.00 set LINK_TYPE_P1=IB LINK_TYPE_P2=ETH #设置p1端口为IB模式
这里假设p1口是IB模式,p2口是ETH模式。
SX6036
在SX6036的WebUI下切换profile到vpi模式,然后在端口管理处修改端口类型。我这里把1-21口设置成了ETH模式,22-36口为IB模式。
在IB SM Mgmt菜单中找到base SM,选择SM Enabled来开启SM。注意,这些设置完后都要按右上角的SAVE按钮,不然重启就失效了。PVE端
输入modprobe ib_ipoib
加载ipoib的驱动,然后通过ip a
看到加载的ib口了,一般就是叫ibp2s0
或者ibp2S0d1
。
修改/etc/network/interfacesauto ibp2s0 iface ibp2s0 inet static address 10.99.0.1 netmask 255.255.255.0 pre-up modprobe ib_ipoib pre-up echo connected > /sys/class/net/ibp2s0/mode mtu 65520
自己修改网卡名字,注意,这里面的网端不能跟你eth网段相同的。最后输入
systemctl restart networking.service
生效,我们可以看到SX6036交换机的管理界面中已经有IB流量出现了。TrueNAS端
在Core的BSD分支中,直接在Tunables中增加一条:mlx4ib_load Value: YES type: loaders
并在Tasks/Init/Shutdown Scripts中增加一条postinit 命令:
kldload ipoib
最后如同设置普通网卡的ip地址一样,在webui中设置与PVE同一段的ip,比如10.99.0.2/24。这里有个小问题就是Core版本的MTU到底怎么改到65520,我没弄明白,不行的话,两端全部改成MTU=2044。
如果是Scale版本的话,插上网卡在WebUI上啥都别设置,输入
modprobe ib_ipoib && modprobe ib_umad
后,你通过ls /sys/class/net
就能知道你IB口的名字了,接着直接修改/etc/network/interfacesauto ibs1d1 iface ibs1d1 inet static address 10.99.0.2 netmask 255.255.255.0 pre-up modprobe ib_ipoib && modprobe ib_umad pre-up echo connected > /sys/class/net/ibs1d1/mode mtu 65520
保存重启就好了。
9 性能测试
感觉说了这么多,最终还是要测一下的,但是坦率的说,我很讨厌跑这些东西,因为跟实际使用环境差太多了,参考价值比较低。真的要测,还是要用你的常用软件,协议等等方面一起去看一下表现的。
配置如下:
- TrueNas Server配置:
- CPU:E5-2680 v3
- 主板: 超微X10-SRA-F
- 内存:SK海力士HMA82GR7CJR8N-VK DDR4 Reg ECC 2666 16G x8
- 机械硬盘:16T Seagate EXOS x 10 + 12T Seagate EXOS x10;两组RaidZ2后stripe,已经用了54%的容量了,其实有几个是酷狼pro,我记不得是多大的在哪组里了,反正没啥区别。
- NVME:480G Optane 905P x1 + 480G Samsung 983zet x1;组成mirror后放在了同一组机械池作为Meta Dev。
- 网卡:HP 544+;最新固件,ETH模式,关闭了SR-IOV。
- SAS卡:LSI 9300-8i
- 背板:超微BPN-SAS3-846EL1
- 系统:TrueNAS-13.0-U3.1
- Proxmox VE Client 配置:
- CPU:E-2186G
- 主板:超微X11-SCA-F
- 内存:Samsung DDR4 UDIMM ECC 2666 16G x8
- 机械硬盘:无
- NVME:无
- 网卡:HP 544+;老固件,ETH模式,开了SR-IOV
- 内核:Linux 6.0.15 自己patch的
在Proxmox VE下,分别虚拟化以下系统,全是vm,没测lxc,直通了SR-IOV
IPoIB
通过IPoIB连接PVE和TrueNAS,再通过ZFS over iSCSI跑虚拟机。下面测试中10.99.0.0是IPoIB,10.10.10.0是ETH
通过ping测了一下latency
PING 10.99.0.2 (10.99.0.2) 56(84) bytes of data.
64 bytes from 10.99.0.2: icmp_seq=1 ttl=64 time=0.096 ms
64 bytes from 10.99.0.2: icmp_seq=2 ttl=64 time=0.099 ms
64 bytes from 10.99.0.2: icmp_seq=3 ttl=64 time=0.099 ms
64 bytes from 10.99.0.2: icmp_seq=4 ttl=64 time=0.091 ms
PING 10.10.10.11 (10.10.10.11) 56(84) bytes of data.
64 bytes from 10.10.10.11: icmp_seq=1 ttl=64 time=0.296 ms
64 bytes from 10.10.10.11: icmp_seq=2 ttl=64 time=0.224 ms
64 bytes from 10.10.10.11: icmp_seq=3 ttl=64 time=0.237 ms
64 bytes from 10.10.10.11: icmp_seq=4 ttl=64 time=0.254 ms
通过qperf测试
[email protected]:~# qperf 10.99.0.2 tcp_bw tcp_lat udp_bw udp_lat
tcp_bw:
bw = 3.61 GB/sec
tcp_lat:
latency = 8.61 us
udp_bw:
send_bw = 7.39 GB/sec
recv_bw = 4.54 GB/sec
udp_lat:
latency = 7.85 us
[email protected]:~# qperf 10.10.10.11 tcp_bw tcp_lat udp_bw udp_lat
tcp_bw:
bw = 4.31 GB/sec
tcp_lat:
latency = 11.3 us
udp_bw:
send_bw = 2.5 GB/sec
recv_bw = 2.47 GB/sec
udp_lat:
latency = 18.3 us
windows 10 LTSC (1809)
设置:
- 分了12个CPU 20G内存, q35, cpu-host
- 虚拟机中安装了官网的最新WinOF
- MTU 9000
- 直接装的,完全没更新过任何补丁
- Windows的系统盘是虚拟scsi且放置于zfs over iscsi之上的。因为sata的协议queue本身有限制了
不是很懂windows的这些测速软件,跑出来的数据也太魔幻了,实际用各种软件限制,协议限制。最真实的还是zfs over iscsi
,我暂时没有条件用RDMA。
iperf3
[ ID] Interval Transfer Bitrate
[ 5] 0.00-4.00 sec 893 MBytes 1.87 Gbits/sec receiver
[ 8] 0.00-4.00 sec 902 MBytes 1.89 Gbits/sec receiver
[ 10] 0.00-4.00 sec 904 MBytes 1.89 Gbits/sec receiver
[ 12] 0.00-4.00 sec 875 MBytes 1.84 Gbits/sec receiver
[ 14] 0.00-4.00 sec 898 MBytes 1.88 Gbits/sec receiver
[ 16] 0.00-4.00 sec 904 MBytes 1.90 Gbits/sec receiver
[ 18] 0.00-4.00 sec 884 MBytes 1.85 Gbits/sec receiver
[ 20] 0.00-4.00 sec 900 MBytes 1.89 Gbits/sec receiver
[ 22] 0.00-4.00 sec 904 MBytes 1.90 Gbits/sec receiver
[ 24] 0.00-4.00 sec 867 MBytes 1.82 Gbits/sec receiver
[ 26] 0.00-4.00 sec 903 MBytes 1.89 Gbits/sec receiver
[ 28] 0.00-4.00 sec 896 MBytes 1.88 Gbits/sec receiver
[ 30] 0.00-4.00 sec 903 MBytes 1.89 Gbits/sec receiver
[ 32] 0.00-4.00 sec 903 MBytes 1.89 Gbits/sec receiver
[ 34] 0.00-4.00 sec 898 MBytes 1.88 Gbits/sec receiver
[ 36] 0.00-4.00 sec 882 MBytes 1.85 Gbits/sec receiver
[ 38] 0.00-4.00 sec 902 MBytes 1.89 Gbits/sec receiver
[ 40] 0.00-4.00 sec 902 MBytes 1.89 Gbits/sec receiver
[ 42] 0.00-4.00 sec 901 MBytes 1.89 Gbits/sec receiver
[ 44] 0.00-4.00 sec 900 MBytes 1.89 Gbits/sec receiver
[ 46] 0.00-4.00 sec 900 MBytes 1.89 Gbits/sec receiver
[ 48] 0.00-4.00 sec 893 MBytes 1.87 Gbits/sec receiver
[ 50] 0.00-4.00 sec 892 MBytes 1.87 Gbits/sec receiver
[ 52] 0.00-4.00 sec 899 MBytes 1.89 Gbits/sec receiver
[SUM] 0.00-4.00 sec 21.0 GBytes 45.1 Gbits/sec receiver
CrystalDiskMark
分别测了ZFS over iSCSI
,iSCSI
,MS-SMB
- ZFS over iSCSI
用的是device分享模式
iSCSI
MS-SMB
Linux
设置:
- 分了12个CPU 40G内存
- NixOS,Linux 5.15
- MTU 9000
- NFS Flags: rw,relatime,vers=4.2,rsize=131072,wsize=131072,namlen=255,hard,async,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.4,local_lock=none,addr=10.10.10.11
有空再想想怎么写这个,测的话如果走内存,又没啥好看的,然后还有meta dev的测试好像就是905p的iops自己搜一下就行了,当然我这个cpu带不动的。机械硬盘池的话因为已经用了50%多了,好像还是没啥好看的,有空琢磨一下怎么写吧。
iperf3
[ ID] Interval Transfer Bitrate
[ 5] 0.00-5.00 sec 958 MBytes 1.61 Gbits/sec receiver
[ 8] 0.00-5.00 sec 975 MBytes 1.64 Gbits/sec receiver
[ 10] 0.00-5.00 sec 969 MBytes 1.63 Gbits/sec receiver
[ 12] 0.00-5.00 sec 980 MBytes 1.64 Gbits/sec receiver
[ 14] 0.00-5.00 sec 975 MBytes 1.63 Gbits/sec receiver
[ 16] 0.00-5.00 sec 980 MBytes 1.64 Gbits/sec receiver
[ 18] 0.00-5.00 sec 993 MBytes 1.67 Gbits/sec receiver
[ 20] 0.00-5.00 sec 998 MBytes 1.67 Gbits/sec receiver
[ 22] 0.00-5.00 sec 1008 MBytes 1.69 Gbits/sec receiver
[ 24] 0.00-5.00 sec 972 MBytes 1.63 Gbits/sec receiver
[ 26] 0.00-5.00 sec 993 MBytes 1.67 Gbits/sec receiver
[ 28] 0.00-5.00 sec 988 MBytes 1.66 Gbits/sec receiver
[ 30] 0.00-5.00 sec 988 MBytes 1.66 Gbits/sec receiver
[ 32] 0.00-5.00 sec 966 MBytes 1.62 Gbits/sec receiver
[ 34] 0.00-5.00 sec 984 MBytes 1.65 Gbits/sec receiver
[ 36] 0.00-5.00 sec 1007 MBytes 1.69 Gbits/sec receiver
[ 38] 0.00-5.00 sec 980 MBytes 1.64 Gbits/sec receiver
[ 40] 0.00-5.00 sec 983 MBytes 1.65 Gbits/sec receiver
[ 42] 0.00-5.00 sec 982 MBytes 1.65 Gbits/sec receiver
[ 44] 0.00-5.00 sec 976 MBytes 1.64 Gbits/sec receiver
[ 46] 0.00-5.00 sec 2.88 GBytes 4.95 Gbits/sec receiver
[ 48] 0.00-5.00 sec 984 MBytes 1.65 Gbits/sec receiver
[ 50] 0.00-5.00 sec 994 MBytes 1.67 Gbits/sec receiver
[ 52] 0.00-5.00 sec 1.11 GBytes 1.91 Gbits/sec receiver
[SUM] 0.00-5.00 sec 25.1 GBytes 43.2 Gbits/sec receiver
FIO
写入相关
- 4k随机写
fio -filename=test-rand-write -ioengine=libaio -bs=4k -size=10G -numjobs=24 -iodepth=32 -runtime=60 -thread -rw=randwrite -group_reporting -name="randwrite"
randwrite: (groupid=0, jobs=24): err= 0: pid=2251134: Thu Feb 16 16:32:01 2023
write: IOPS=49.4k, BW=193MiB/s (202MB/s)(12.6GiB/66882msec); 0 zone resets
slat (usec): min=2, max=15423k, avg=482.15, stdev=58552.02
clat (usec): min=3, max=15484k, avg=14999.99, stdev=360480.85
lat (usec): min=142, max=15484k, avg=15482.14, stdev=366436.81
clat percentiles (usec):
| 1.00th=[ 157], 5.00th=[ 251], 10.00th=[ 330],
| 20.00th=[ 437], 30.00th=[ 537], 40.00th=[ 627],
| 50.00th=[ 717], 60.00th=[ 791], 70.00th=[ 865],
| 80.00th=[ 1631], 90.00th=[ 5800], 95.00th=[ 10028],
| 99.00th=[ 19530], 99.50th=[ 28967], 99.90th=[ 7549748],
| 99.95th=[ 9059697], 99.99th=[15502148]
bw ( KiB/s): min= 280, max=1929744, per=100.00%, avg=814115.55, stdev=27422.74, samples=780
iops : min= 70, max=482436, avg=203528.73, stdev=6855.69, samples=780
lat (usec) : 4=0.01%, 10=0.01%, 20=0.01%, 250=5.00%, 500=21.57%
lat (usec) : 750=27.79%, 1000=24.14%
lat (msec) : 2=1.82%, 4=3.04%, 10=11.67%, 20=4.04%, 50=0.53%
lat (msec) : 100=0.06%, 250=0.14%, 500=0.05%, 750=0.01%, 1000=0.01%
lat (msec) : 2000=0.01%, >=2000=0.14%
cpu : usr=0.53%, sys=3.79%, ctx=496046, majf=0, minf=24
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
issued rwts: total=0,3303411,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=32
Run status group 0 (all jobs):
WRITE: bw=193MiB/s (202MB/s), 193MiB/s-193MiB/s (202MB/s-202MB/s), io=12.6GiB (13.5GB), run=66882-66882msec
- 1M顺序写
fio -filename=test-write -ioengine=libaio -bs=1M -size=10G -numjobs=24 -iodepth=32 -runtime=60 -thread -rw=write -group_reporting -name="write"
write: (groupid=0, jobs=24): err= 0: pid=2258302: Thu Feb 16 16:44:20 2023
write: IOPS=2833, BW=2834MiB/s (2971MB/s)(168GiB/60747msec); 0 zone resets
slat (usec): min=182, max=7100.7k, avg=8453.00, stdev=94600.26
clat (usec): min=5, max=7500.7k, avg=260924.86, stdev=552308.55
lat (msec): min=11, max=7512, avg=269.38, stdev=561.22
clat percentiles (msec):
| 1.00th=[ 113], 5.00th=[ 136], 10.00th=[ 146], 20.00th=[ 159],
| 30.00th=[ 167], 40.00th=[ 176], 50.00th=[ 184], 60.00th=[ 192],
| 70.00th=[ 201], 80.00th=[ 211], 90.00th=[ 230], 95.00th=[ 259],
| 99.00th=[ 2123], 99.50th=[ 3306], 99.90th=[ 7416], 99.95th=[ 7416],
| 99.99th=[ 7483]
bw ( MiB/s): min= 103, max= 5308, per=100.00%, avg=3626.54, stdev=48.04, samples=2268
iops : min= 97, max= 5306, avg=3625.18, stdev=48.09, samples=2268
lat (usec) : 10=0.01%, 50=0.01%
lat (msec) : 20=0.01%, 50=0.03%, 100=0.32%, 250=93.96%, 500=2.00%
lat (msec) : 750=0.30%, 1000=0.38%, 2000=1.66%, >=2000=1.33%
cpu : usr=0.44%, sys=23.26%, ctx=76380, majf=0, minf=25
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.2%, 32=99.6%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
issued rwts: total=0,172146,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=32
Run status group 0 (all jobs):
WRITE: bw=2834MiB/s (2971MB/s), 2834MiB/s-2834MiB/s (2971MB/s-2971MB/s), io=168GiB (181GB), run=60747-60747msec
读取相关
读取测试其实还是要看实际场景软件的,下面的测试太理想化了,加-direct=1
测好像又没意义,不加又有命中率的事情,随便看看图个乐吧。
- 4k随机读取
fio -filename=test-rand-read -ioengine=libaio -bs=4k -size=10G -numjobs=24 -iodepth=32 -runtime=60 -thread -rw=randread -group_reporting -name="randread"
randread: (groupid=0, jobs=24): err= 0: pid=2260684: Thu Feb 16 16:48:58 2023
read: IOPS=50.0k, BW=195MiB/s (205MB/s)(11.4GiB/60003msec)
slat (nsec): min=1932, max=149087k, avg=476537.26, stdev=855570.75
clat (usec): min=3, max=166765, avg=14874.41, stdev=6683.97
lat (usec): min=7, max=167317, avg=15350.95, stdev=6844.11
clat percentiles (msec):
| 1.00th=[ 6], 5.00th=[ 7], 10.00th=[ 9], 20.00th=[ 10],
| 30.00th=[ 12], 40.00th=[ 13], 50.00th=[ 14], 60.00th=[ 16],
| 70.00th=[ 18], 80.00th=[ 20], 90.00th=[ 23], 95.00th=[ 24],
| 99.00th=[ 40], 99.50th=[ 45], 99.90th=[ 56], 99.95th=[ 63],
| 99.99th=[ 163]
bw ( KiB/s): min=118708, max=359568, per=99.41%, avg=198860.20, stdev=2670.29, samples=2856
iops : min=29675, max=89892, avg=49715.03, stdev=667.57, samples=2856
lat (usec) : 4=0.01%, 10=0.01%, 20=0.01%, 50=0.01%, 500=0.01%
lat (usec) : 750=0.01%, 1000=0.01%
lat (msec) : 2=0.01%, 4=0.27%, 10=22.40%, 20=58.79%, 50=18.32%
lat (msec) : 100=0.18%, 250=0.02%
cpu : usr=0.87%, sys=2.23%, ctx=1820208, majf=0, minf=792
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
issued rwts: total=3000750,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=32
Run status group 0 (all jobs):
READ: bw=195MiB/s (205MB/s), 195MiB/s-195MiB/s (205MB/s-205MB/s), io=11.4GiB (12.3GB), run=60003-60003msec
- 1M顺序读取
fio -filename=test-read -ioengine=libaio -bs=1M -size=10G -numjobs=24 -iodepth=32 -runtime=60 -thread -rw=read -group_reporting -name="read"
read: (groupid=0, jobs=24): err= 0: pid=2262359: Thu Feb 16 16:51:39 2023
read: IOPS=8368, BW=8369MiB/s (8775MB/s)(240GiB/29367msec)
slat (usec): min=85, max=74615, avg=2855.92, stdev=2478.60
clat (usec): min=4, max=217900, avg=88764.77, stdev=22209.24
lat (usec): min=1824, max=219305, avg=91620.69, stdev=22776.37
clat percentiles (msec):
| 1.00th=[ 35], 5.00th=[ 60], 10.00th=[ 66], 20.00th=[ 72],
| 30.00th=[ 77], 40.00th=[ 81], 50.00th=[ 86], 60.00th=[ 92],
| 70.00th=[ 100], 80.00th=[ 107], 90.00th=[ 118], 95.00th=[ 128],
| 99.00th=[ 150], 99.50th=[ 163], 99.90th=[ 180], 99.95th=[ 184],
| 99.99th=[ 201]
bw ( MiB/s): min= 5642, max=11347, per=99.86%, avg=8357.27, stdev=62.64, samples=1392
iops : min= 5642, max=11346, avg=8356.07, stdev=62.61, samples=1392
lat (usec) : 10=0.01%, 20=0.01%
lat (msec) : 2=0.01%, 4=0.01%, 10=0.02%, 20=0.07%, 50=2.47%
lat (msec) : 100=68.50%, 250=28.92%
cpu : usr=0.31%, sys=19.00%, ctx=6755544, majf=0, minf=196632
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.2%, 32=99.7%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
issued rwts: total=245760,0,0,0 short=0,0,0,0 dropped=0,0,0,0
latency : target=0, window=0, percentile=100.00%, depth=32
Run status group 0 (all jobs):
READ: bw=8369MiB/s (8775MB/s), 8369MiB/s-8369MiB/s (8775MB/s-8775MB/s), io=240GiB (258GB), run=29367-29367msec
10 一些题外话
非常喜欢用网卡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