计算化学公社

标题: DIY NAS小记 | Mini高性能集群部署(第一集) [打印本页]

作者
Author:
Entropy.S.I    时间: 2023-10-20 18:15
标题: DIY NAS小记 | Mini高性能集群部署(第一集)
本帖最后由 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的报告。

在PCIe Gen 3平台上使用PCIe Gen 4 SSD是因为看中了致态7100的耐久度(推荐看此视频:https://www.bilibili.com/video/BV19a4y137p3)。

这套方案刚好耗尽了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 安装过程照片
▼机箱正面

▼机箱侧面

▼机箱背面

▼CPU、内存

▼安装CPU

▼主板

▼三件套

▼一堆致态7100 & 转接卡

▼傲腾900P

▼傲腾900P - U.2转接卡

▼一堆硬盘包装盒

▼一堆18TB HDD,贴了标签以便区分,“I”指的是连接到主板SFF-8643接口上的HDD,“E”指的是连接到HBA卡SFF-8087接口上的HDD

▼古董级HBA卡

▼古董级40G网卡MCX341A

▼给网卡和HBA卡的背面贴上导热垫,和M.2扩展卡的巨大散热片粘在一起,帮助散热

▼事后发现HBA卡温度依然达到了70℃

▼又加了一把TL-C12C

▼考虑到可靠性,给3组HDD分别接了一条大4P电源模组线,但是给系统盘用的SATA电源线没地方接了,只能再从下面拉回一个大4P接口,转接给系统盘供电

▼NAS上层

▼NAS下层

▼待机功率200W,国家电网战略合作伙伴

▼交换机(48*10G SFP+ & 4*40G QSFP)

3 配置过程截图
▼主板架构图

▼BIOS首页

▼设置PCIe拆分和速率参数,速率强制设为Gen 3是因为实测auto的情况下某些SSD偶尔会降速到Gen 2或Gen 1

▼在BIOS中为系统盘配置RAID 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粗略调优

ZFS有大量可调的参数,参考官方手册:https://openzfs.github.io/openzfs-docs/Performance%20and%20Tuning/Module%20Parameters.html

笔者调节了以下参数,将其写在了/etc/modprobe.d/zfs.conf文件中,以便系统开机后能自动加载这些参数。

  1. options zfs l2arc_noprefetch=0
  2. options zfs zfs_arc_lotsfree_percent=2
  3. options zfs zfs_arc_max=191106155315
  4. options zfs l2arc_write_boost=10000000000
  5. options zfs l2arc_write_max=10000000000
复制代码

获得“zfs_arc_max=191106155315”的命令:

  1. grep '^MemTotal' /proc/meminfo|awk '{printf "%d", $2 * 1024 * 0.95}'
复制代码

应当根据实际情况设置比例参数,现在这台NAS只用于集群NFS,故系统服务占用RAM极少,留5%足够。

此外,需对父数据集手动设置atime=off


5 FIO性能测试

PC通过10GbE RoCE挂载NASNFS共享目录,Sync模式。

64GiB文件,128KiB数据块,顺序写
参数:
  1. [global]
  2. directory=/bmg_pool0/home/bmg-admin
  3. ioengine=libaio
  4. direct=1
  5. thread=1
  6. iodepth=4
  7. log_avg_msec=500
  8. group_reporting

  9. [test_64g]
  10. bs=128k
  11. size=64G
  12. rw=write
  13. write_bw_log=64g-128k-w
  14. write_iops_log=64g-128k-w
  15. write_lat_log=64g-128k-w
复制代码
结果:
(, 下载次数 Times of downloads: 58)

64GiB文件,8KiB数据块,随机读
参数:
  1. [global]
  2. directory=/bmg_pool0/home/bmg-admin
  3. ioengine=libaio
  4. direct=1
  5. thread=1
  6. iodepth=32
  7. log_avg_msec=500
  8. group_reporting

  9. [test_64g]
  10. bs=8k
  11. size=64G
  12. rw=randread
  13. write_bw_log=64g-8k-randr
  14. write_iops_log=64g-8k-randr
  15. write_lat_log=64g-8k-randr
复制代码
结果:
(, 下载次数 Times of downloads: 58)

64GiB文件,8KiB数据块,随机读写(7:3)
参数:
  1. [global]
  2. directory=/bmg_pool0/home/bmg-admin
  3. ioengine=libaio
  4. direct=1
  5. thread=1
  6. iodepth=32
  7. log_avg_msec=500
  8. group_reporting

  9. [test_64g]
  10. bs=8k
  11. size=64G
  12. rw=randrw
  13. rwmixread=70
  14. write_bw_log=64g-8k-randrw
  15. write_iops_log=64g-8k-randrw
  16. write_lat_log=64g-8k-randrw
复制代码
结果:
(, 下载次数 Times of downloads: 51)

256GiB文件,128KiB数据块,随机读
参数:
  1. [global]
  2. directory=/bmg_pool0/home/bmg-admin
  3. ioengine=libaio
  4. direct=1
  5. thread=1
  6. iodepth=32
  7. log_avg_msec=500
  8. group_reporting

  9. [test_256g]
  10. bs=128k
  11. size=256G
  12. rw=randread
  13. write_bw_log=256g-128k-randr
  14. write_iops_log=256g-128k-randr
  15. write_lat_log=256g-128k-randr
复制代码
结果:
(, 下载次数 Times of downloads: 54)

256GiB文件,128KiB数据块,随机读写(7:3)
参数:
  1. [global]
  2. directory=/bmg_pool0/home/bmg-admin
  3. ioengine=libaio
  4. direct=1
  5. thread=1
  6. iodepth=32
  7. log_avg_msec=500
  8. group_reporting

  9. [test_256g]
  10. bs=128k
  11. size=256G
  12. rw=randrw
  13. rwmixread=70
  14. write_bw_log=256g-128k-randrw
  15. write_iops_log=256g-128k-randrw
  16. write_lat_log=256g-128k-randrw
复制代码
结果:
(, 下载次数 Times of downloads: 61)

6 整活

强行在这台NAS上安装了2片TITAN V,由于一颗650W电源不够用,又掏出了另一颗在床头柜上吃灰3年的电源。利用这套诡异的配置测试了TITAN V跑ReaxFF模拟的性能,测试结果将在未来单独发布。





作者
Author:
abin    时间: 2024-1-11 15:08
很棒记录.


既然, 这个Storage是提供给集群使用,
测试, 应该修改为:
在同一个时刻, 让所有的节点, 同时并行进行I/O,
再考察, Storage节点负载...
检查各个计算节点, 以及Storage节点, 是否存在I/O wait....

毕竟, 在集群里面, 比较重要的是并发I/O性能, 而非Storage本地读写.


作者
Author:
Entropy.S.I    时间: 2024-1-11 15:59
abin 发表于 2024-1-11 15:08
很棒记录.
原计划等到集群部署完成后综合起来写一篇帖子分享出来,但期间出现了一些问题,计算节点迟迟没有到货,故先把NAS部分单独发出来
PC通过10GbE RoCE挂载NASNFS共享目录,Sync模式






欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3