本帖最后由 Entropy.S.I 于 2023-10-20 18:27 编辑
DIY NAS小记 | Mini高性能集群部署(第一集)
Oct-2023 by ア熵增焓减ウ | yult-entropy@qq.com | entropylt@163.com
0 写在前面 9月初笔者给朋友课题组设计了一套小集群,为了省钱,存储(NAS)部分是自行采购散件DIY的,组网也使用了二手硬件。NAS和交换机从下单散件到组装、调试完毕花了10天,原计划等到集群部署完成后综合起来写一篇帖子分享出来,但期间出现了一些问题,计算节点迟迟没有到货,故先把NAS部分单独发出来。
1 简介 采购这些散件已过去一个多月,行情有很大变化,因此价格仅供参考。 如果追求极致省钱,网卡也可以选用同为CX3 Pro芯片的拆机HP544+FLR。 18TB HDD没有选希捷EXOS X18,因为在Backblaze近几年的硬盘故障报告中,希捷EXOS大容量氦气HDD故障率远高于从HGST继承来的WDC Ultrastar系列。建议读者自行搜索Backblaze的报告。 这套方案刚好耗尽了LGA 3647平台上从CPU直接引出的44+4条PCIe Lane,对强迫症很友好。 比较遗憾的是该存储没有冗余电源,拉低了整个系统的可用性。 存储系统的基本环境是Ubuntu Server + OpenZFS + NFS over RDMA (RoCE),没有直接采用TrueNAS Scale,因为目前此系统不支持RoCE。用上了ZFS中所有有助于提升IO性能的特性,包括ARC、L2ARC (Cache) VDEV、ZIL (SLOG) VDEV以及Metadata (Special) VDEV。其中,ARC是192GB RAM,Cache VDEV是2块致态7100 1TB 2-way stripe,SLOG VDEV是2块Intel傲腾900P 280GB 2-way mirror,Special VDEV是3块致态7100 1TB 3-way mirror。 Data pool的策略是2组6盘RAID Z1 VDEV。由于所购买硬盘是同一生产批次的,故分别对每个RAID Z1 VDEV中的1块HDD进行“老化”,这样做可以在一定程度上防止VDEV中多块HDD同时故障。笔者所采用的“老化”手段是插到自己的服务器上运行一天4K随机性能测试。 交换机没有RoCE所需的关键特性,因此整个存储网络并不是严格意义上的RDMA网络,但后续的实测表明,仅在服务端和客户端主机上启用RDMA,并使用NFS over RDMA挂载共享目录,存储的随机读写性能也明显高于普通以太网方案。 交换机是某大厂自行定制的(即“白牌交换机”),刚到手时没有任何技术资料,噪音极大,且卖家称其仅支持40G和10G速率,不支持其他速率,建议当作傻瓜交换机使用。笔者不信邪,依靠个人经验和直觉断断续续摸索了几天,实现了LACP链路聚合、风扇转速调节、更改端口速率。期间还不慎把交换机折腾变砖了一次,经过研究,进入系统shell修复了配置文件。后来笔者把这些经验都手把手传授给了卖家。
2 安装过程照片
▼一堆18TB HDD,贴了标签以便区分,“I”指的是连接到主板SFF-8643接口上的HDD,“E”指的是连接到HBA卡SFF-8087接口上的HDD
▼给网卡和HBA卡的背面贴上导热垫,和M.2扩展卡的巨大散热片粘在一起,帮助散热
▼考虑到可靠性,给3组HDD分别接了一条大4P电源模组线,但是给系统盘用的SATA电源线没地方接了,只能再从下面拉回一个大4P接口,转接给系统盘供电
▼交换机(48*10G SFP+ & 4*40G QSFP)
3 配置过程截图
▼设置PCIe拆分和速率参数,速率强制设为Gen 3是因为实测auto的情况下某些SSD偶尔会降速到Gen 2或Gen 1
▼先安装Windows跑个分,CPU功率230W,16核3.9GHz,对于第一代Xeon可扩展CPU来说这是很夸张的频率
▼R23分数19655 pts,AMD Ryzen 7950X的一半
▼12*18TB HC550,Windows带区卷RAID 0
▼5*致态7100 @ PCIe Gen3 x4,Windows带区卷RAID 0
▼2*傲腾900P,Windows带区卷RAID 0
▼Windows SMB,默认启用RDMA,HDD池
▼Windows SMB,默认启用RDMA,傲腾900P
▼Ubuntu Server 22.04.3 LTS,额外安装了Desktop GUI,不要问为什么不一开始就装Desktop版,因为只有Server版才能在安装过程中选择RAID安装
▼配置RDMA,此为配置完后的ibv_devinfo -v命令输出(部分)
▼利用Windows PC的Internet连接共享功能,即使校园网有web登录认证机制,集群也可以统一接入校园网/互联网(本质上Windows PC充当路由器)
▼给接入集群万兆交换机的网卡添加2个IP地址,使集群子网与Windows PC互通
▼netplan网络配置,网关为Windows PC在集群子网中的IP地址(10.0.0.3),DNS与Windows PC相同(192.168.31.1),MTU=9000
▼使用ping工具确认服务器-交换机-客户端的mtu设置正确
▼创建ZFS pool,此为创建完毕后的zpool status命令输出
4 ZFS粗略调优 笔者调节了以下参数,将其写在了/etc/modprobe.d/zfs.conf文件中,以便系统开机后能自动加载这些参数。 - options zfs l2arc_noprefetch=0
- options zfs zfs_arc_lotsfree_percent=2
- options zfs zfs_arc_max=191106155315
- options zfs l2arc_write_boost=10000000000
- options zfs l2arc_write_max=10000000000
复制代码获得“zfs_arc_max=191106155315”的命令: - grep '^MemTotal' /proc/meminfo|awk '{printf "%d", $2 * 1024 * 0.95}'
复制代码应当根据实际情况设置比例参数,现在这台NAS只用于集群NFS,故系统服务占用RAM极少,留5%足够。
5 FIO性能测试 PC通过10GbE RoCE挂载NASNFS共享目录,Sync模式。 64GiB文件,128KiB数据块,顺序写 参数: - [global]
- directory=/bmg_pool0/home/bmg-admin
- ioengine=libaio
- direct=1
- thread=1
- iodepth=4
- log_avg_msec=500
- group_reporting
- [test_64g]
- bs=128k
- size=64G
- rw=write
- write_bw_log=64g-128k-w
- write_iops_log=64g-128k-w
- write_lat_log=64g-128k-w
复制代码结果:
64GiB文件,8KiB数据块,随机读 参数: - [global]
- directory=/bmg_pool0/home/bmg-admin
- ioengine=libaio
- direct=1
- thread=1
- iodepth=32
- log_avg_msec=500
- group_reporting
- [test_64g]
- bs=8k
- size=64G
- rw=randread
- write_bw_log=64g-8k-randr
- write_iops_log=64g-8k-randr
- write_lat_log=64g-8k-randr
复制代码结果:
64GiB文件,8KiB数据块,随机读写(7:3) 参数: - [global]
- directory=/bmg_pool0/home/bmg-admin
- ioengine=libaio
- direct=1
- thread=1
- iodepth=32
- log_avg_msec=500
- group_reporting
- [test_64g]
- bs=8k
- size=64G
- rw=randrw
- rwmixread=70
- write_bw_log=64g-8k-randrw
- write_iops_log=64g-8k-randrw
- write_lat_log=64g-8k-randrw
复制代码结果:
256GiB文件,128KiB数据块,随机读 参数: - [global]
- directory=/bmg_pool0/home/bmg-admin
- ioengine=libaio
- direct=1
- thread=1
- iodepth=32
- log_avg_msec=500
- group_reporting
- [test_256g]
- bs=128k
- size=256G
- rw=randread
- write_bw_log=256g-128k-randr
- write_iops_log=256g-128k-randr
- write_lat_log=256g-128k-randr
复制代码结果:
256GiB文件,128KiB数据块,随机读写(7:3) 参数: - [global]
- directory=/bmg_pool0/home/bmg-admin
- ioengine=libaio
- direct=1
- thread=1
- iodepth=32
- log_avg_msec=500
- group_reporting
- [test_256g]
- bs=128k
- size=256G
- rw=randrw
- rwmixread=70
- write_bw_log=256g-128k-randrw
- write_iops_log=256g-128k-randrw
- write_lat_log=256g-128k-randrw
复制代码结果:
6 整活 强行在这台NAS上安装了2片TITAN V,由于一颗650W电源不够用,又掏出了另一颗在床头柜上吃灰3年的电源。利用这套诡异的配置测试了TITAN V跑ReaxFF模拟的性能,测试结果将在未来单独发布。
|