穷人的集群

2020-07-06 09:44:22

这一部分可能只是我的追逐,但我觉得即使是一家初创量化基金也需要一个计算集群。我甚至曾经听过一个笑话,说任何有自尊的Quant都应该能够扩展他们的计算需求,以填满任意数量的服务器。我刚刚构建的集群是一个低预算的旧集群,由一堆杂乱无章的剩余和翻新的服务器组成,并与eBay上的部分连接在一起。但我对此感到非常自豪!

新服务器的成本很高,而实际的CPU成本只占成本的一小部分。这些服务器是为不能容忍停机的使用情形而设计的,管理员在远程,所有硬件甚至软件都必须由某些签订昂贵合同的公司提供支持。相比之下,我的集群只设计用于研究。停机是可以的,只要没有数据丢失,并且我可以轻松地重新启动和运行。因此,我的重点只是在有限的预算下最大化性能。我正在针对每美元的计算进行优化。(顺便说一句,我发现PassMark CPU标记可以准确地反映每个CPU处理我的工作负载的能力。)。购买翻新的企业级设备有一种耻辱,我不明白。三年前售价25000美元的基本计算服务器现在只需250万美元,在metservers.com或stalliontek.com等网站进行翻新。这两家公司也都提供保修。更好的是,这些是已经存在的真正的服务器,可以立即发货给您,而不是因为世界范围内的内存短缺等问题而等待数月的新服务器。新的Mellanox 100GbE InfiniBand卡每张售价795美元,但在易趣上,56GbE卡每张40美元就可以买到。

内存确实会推高服务器的成本,使价格翻一番或三倍。我不认为在RAM上加载在规模上是划算的。取而代之的是,我推荐NVMe驱动器作为一种负担得起的替代方案。翻新的Dell R630服务器的典型RAM为DDR4-2133,带宽为136 Gbps。三星970 EVO Plus 2TB NVMe硬盘的读取速度为28Gbps。有了正确的软件,旧的InfiniBand卡可以通过同时读取群集中其他2-3个机盒上的NVMe驱动器来最大限度地利用其56Gbps的带宽。对于我的工作负载,这足够接近RAM速度,I/O不再是瓶颈,我可以专注于只完成计算。

我还选择了零售NVMe硬盘。它们的成本远远低于企业级NVMe驱动器,并且速度(PCIe Gen 3.0 x4)与除最新企业级驱动器之外的所有企业级驱动器相同。企业级驱动器的优势在于寿命更长,以数百或数千TB的写入来衡量)。但是我倾向于读的比写的多得多。另一个优势是一些企业硬盘是双端口的。这是一项高可用性功能,允许两台主机访问同一驱动器,在主机发生故障时保持连接。但正如我已经说过的,我不需要昂贵的高可用性功能。

拥有分布式文件系统简化了群集上的编码。它让人感觉就像在一台大机器上工作一样。每个作业都使用传统的POSIX系统调用读取和写入本地挂载的共享文件系统。

在搜索了文件系统评论之后,我决定使用MooseFS作为我的健壮存储。它很容易配置。它可以处理我收集的各种大小的驱动器,并且对驱动器甚至整个服务器的故障都很健壮。它还有一个很好的基于浏览器的监控工具。我已将其设置为将每个数据块的一个副本存储在SSD上,并将复制的块存储在常规旋转磁盘上。客户端配置为首选SSD块服务器,这使得读取速度相当快。注意:块服务器标签适用于整个服务器,因此如果您想明确确定从SSD读取的优先顺序,请不要在一台服务器中混合使用SSD和HDD。

我考虑过支付MooseFS Pro的费用,但觉得太贵了。对于版本3.x和4.x的20TB终身许可,报价为1,620美元,如果是非商业用途,报价为810美元。获得Pro许可证的主要两个好处是:1)获得多个在线主服务器的高可用性,而不仅仅是元日志记录器;2)获得擦除编码,以便更有效地使用存储空间。我对擦除编码很感兴趣,但对于慢速存储,大磁盘真的很便宜。因此,存储一个文件的多个完整副本并不是什么大不了的事。

为了提高速度,我选择了带NVMe驱动器的BeeGFS。BeeGFS支持带InfiniBand的RDMA(远程直接内存访问),因此它可以在不涉及CPU的情况下在机箱之间移动数据。它非常快。它也相对容易配置。我把它当作易失性存储器来对待,而且我没有设置“伙伴镜像”。因为如果我的硬件出现故障,我会丢失数据,所以我经常与健壮的存储进行rsynch。我很失望地发现,即使是Pro BeeGFS也不支持擦除编码。与这些昂贵的NVMe驱动器一起使用会更有意义。H

对分布式文件系统进行基准测试非常复杂,而且依赖于工作负载。但一切都如我所愿。我的集群基本上是超聚合的,在每台服务器上组合了CPU和存储。但是,我确实有一些仅作为客户端/CPU的服务器。它们的功率较小,所以我一直关闭它们的电源,直到需要,以节省能源。我在eBay上买了一个APC AP7911A机架式PDU,因此很容易控制不同端口的电源。

构建集群非常有趣,以前缓慢的过程现在快得令人兴奋。但我现在急于开始真正的研究,不要再胡乱摆弄基础设施了。

作为非HPC人员,了解InfiniBand并获得网络功能是构建群集最困难的部分。我花了很长时间,大量阅读和反复试验。出于这个原因,我认为有必要发布详细的说明,说明最终对我起作用的是什么。我不认为我能从我的InfiniBand网络中获得所有可能的东西,但我仍然对此感到非常满意。

我用的是79DJ3 Mellanox ConnectX-3 CX353A FDR InfiniBand+56GbE/40GbE单QSFP+RDMA卡。我在eBay上订购的最新款是35美元一件。我相信PCIe通道无法处理双端口卡的全部带宽,这就是为什么我继续使用更简单的单端口卡/设置。我确实不得不为我的几台高调PCIe电脑订购更换支架。

我用的是Mellanox MC2207130-0A1 1.5M IB FDR QSFP铜缆,每根大约20美元。光纤电缆更适合长距离使用,但这些无源电缆工作得很好。

有两个交换机可以正常工作。第一个是小型非管理型交换机Mellanox SX6005。它使用的价格约为90美元:

如果您有多台交换机,您可以用菊花链将它们连接在一起。您甚至可以在它们之间铺设多条电缆,这将减少交换机之间的瓶颈。不需要特殊配置,只需插上多根电缆,就能在一定程度上分散负载。

InfiniBand网络需要正好有一个子网管理器。管理型交换机可以提供此服务,但需要在配置界面中启用。非托管交换机无法提供此服务。在这种情况下,您需要在一台服务器上运行子网管理器。在CentOS 7上安装很简单:

我在集群上使用CentOS7,因为目前MooseFS和BeeGFS都不支持CentOS8。当我第一次使用Ubuntu时,让InfiniBand工作要困难得多。为了让BeeGFS正常工作,我还不得不对其内核进行降级。我不认为这么麻烦是值得的,CentOS7运行得很好。

#install Packagesyum groupinstall";Infiniband support#yum install net-tools mstflint InfiniBand-Diags iperf#Disable Firewallsystemctl status Firewalldsystemctl stop Firewalldsystemctl Disable Firewalld#Disable SELINUXNano/etc/selinux/config#set,然后rebootSELINUX=DISABLED#启动RDMA服务ystemctl start。

#检查设备的PCI地址spci|GREP Mellanox#04:00.0网络控制器:Mellanox Technologies MT27500系列[ConnectX-3]#so";04:00.0";是地址。

接下来,使用PCI地址查找卡的PSID,并记下当前固件版本:

#识别适配卡的PSID(输出的最后一行)mstflint-d 04:00.0 q#镜像类型:fs2#固件版本:2.32.5100#固件发布日期:3.9.2014#ROM信息:type=pxe version=3.4.306 proto=IB#设备ID:4099#描述:节点端口1端口2系统镜像#GUID:e41d2d0300b2bdc0 e41d2d0。

#从Mellanox网站下载与您的卡PSID:http://www.mellanox.com/page/firmware_table_dell?mtag=oem_firmware_downloadAdaptersDell相匹配的固件BIN文件EMC ConnectX-3 Firmware Download Center2.42.5000079DJ3DEL1100001019http://www.mellanox.com/downloads/firmware/fw-ConnectX3-rel-2_42_5000-079DJ3-FlexBoot-3.4.752.bin.zip。

因此,可以在此处找到079DJ3卡的最新驱动程序。下载并解压缩它。接下来,将新固件刻录到卡中:

#将固件烧录到lspci设备idmstflint-d 04:00.0-i/root/fw-ConnectX3-rel-2_42_5000-079DJ3-FlexBoot-3.4.752.bin b#ctX3-rel-2_42_5000-079DJ3-FlexBoot-3.4.752.bin b#闪存上的当前固件版本:2.32.5100#新固件版本:2.42.5000#在没有签名的情况下烧录fs2固件映像-OK#恢复签名-OK重新启动#查询设备参数以验证新配置mstconfig-d 04:00.0 q

一件很酷的事情是你可以给你的InfiniBand卡一个IP地址。您可以通过InfiniBand协议发送IP数据包。这样做效率不高,但与通常的1GbE端口相比,速度仍然快得离谱。

#config ib0Nano/etc/sysconfig/network-scripts/ifcfg-ib0DEVICE=ib0TYPE=infinibandBOOTPROTO=staticIPADDR=10.10.10.101NETMASK=255.255.255.0NETWORK=10.10.10.0BROADCAST=10.10.10.255ONBOOT=yesNM_CONTROLLED=no#然后重新启动网络或整个计算机ystemctl重新启动网络#验证新固件已成功烧录:ifconfigethtool-ib0#或ethtool ib0#驱动程序:ib_ipoib#版本:1.0.0#固件-版本:2.42.5000#扩展-ROM-版本:#bus-info:0000:04:00.0#Supports-Statistics:yes#support-。test:no#support-eeprom-access:no#support-register-dump:no#support-priv-flag:no#验证驱动程序和ConnectX-3是否处于升级状态。

#在一台服务器(10.10.10.101)上测试InfiniBand RDMA#,在另一台服务器(客户端)上运行:RDMA_SERVER#。运行:rdma_client-s 10.10.10.101#rdma_client:start#rdma_client:end 0#InfiniBand performance test#on server runib_send_bw-d mlx4_0-i 1-F--report_GBits#on client runib_send_bw-d mlx4_0--i 1-F--report_GBits 10.10.10.101#Bytes#Iterations BW Peak[GB/sec]BW Average[GB。我';#用另一个盒子测试以太网速度#首先启动侦听服务器:iperf-s#,然后瞄准服务器运行Testperf-c 10.10.10.101iperf-c 10.10.10.101-P 2#--#Client连接到10.10.10.101,tcp端口5001#tcp窗口大小:314KByte(default)#--#[5]本地10.10.10.102端口42002与10.10.10.101端口5001#[3]本地10.10.10.102端口42000与10.10.10连接。.101端口5001#[ID]间隔传输带宽#[5]0.0-10.0秒16.4 GB#14.1 GB/秒#[3]0.0-10.0秒16.3 GB 14.0 GB/秒#[SUM]0.0-10.0秒32.7 GB/秒28.1 GB/秒#延迟TESTB_READ_LATIB_WRITE_LAT 10.10.10.101#一台服务器上的另一个RDMA测试,运行";在客户端上,运行udaddy-s 10.10.10.101";#udaddy:启动客户端#udaddy:正在连接#启动数据传输#接收数据传输#数据传输完成#测试完成#返回状态0