Mellanox Infiniband 网卡固件刷新大幅提升IO带宽
本文的内容是向你介绍为戴尔、Sun或者惠普重新贴牌的Mellanox Infiniband网卡建立和刷新自制固件的方法。有了自定义固件,你就能在Windows Server 2012使用RDMA功能了,它可以将你的文件共享能力提升至3280MB每秒,将近25万的IOPS。这几天OEM Mellanox Infiniband网卡用户常见的问题就是,他们没法找到开启RDMA(远程直接数据存取)的固件修订版本。性能优势十分明显。
什么?我的Infiniband网卡在Windows Server 2012里没有RDMA?
要寻求更好的文件共享性能,给你的Windows Server 2012机器里安一个戴尔、Sun或者惠普品牌的40千兆InfiniBand网卡,这种卡都是采用 Mellanox ConnectX-2 固件的。最新的微软操作系统为这种卡内置了IPoIB驱动,所以你只要重启一下系统就能用了。分配一个IP地址,设置一下共享,然后就能测试一下吞吐量了。在你的客户端机器上运行IOMeter基准测试,连接到文件服务器,查看结果,如下图所示——挺快但还不够快。
测试结果中的1958MB/s的意思是,你的40千兆网卡的传输大概只在15千兆左右。那其他那些带宽都跑哪儿去了呢?要查明原因,你要打开一个PowerShell窗口。Get-NetOffloadGlobalSetting显示NetworkDirect的状态是开启,也就是说你可以使用RDMA——如果你的卡支持这个功能的话。
运行Get-NetAdapterRdma,显示该卡已经被设置为可以使用RDMA。那为什么不能用呢?
即便有一个配置正确的系统——而且Windows Server 2012默认情况就下就是配置好的——如果你的卡的固件不适用于操作系统,你也不能使用RDMA。接着查找问题,关键的PowerShell查询命令是Get-SmbServerNetworkInterface,它(见下图)可以直观地显示出我们的InfiniBand卡不能在Windows Server 2012里使用IPoIB RDMA。Windows系统日志里还有更多内容,但我们不需要;我们已经知道怎么回事了。
问题出在老旧的固件上
我们的卡在规格说明里承诺提供RDMA,原来,要在Windows Server 2012上使用,你的Mellanox固件版本必须在2.9.8350以上。你可以用多种方式查到你的固件版本。最简单的方式就是Windows设备管理器,如下图示,它显示,此卡的固件版本为2.9.1000,不支持RDMA。
下载一个固件更新器不行吗?
Mellanox在其Windows 2012安装程序里提供的固件版本为2.10.720,但那个installer不会更新第三方的贴牌网卡。戴尔和惠普的最新固件版本是2.9.1000,不支持RDMA。我这还有几个Sun卡,正在用的版本是2.7.8130。固件不更新,我们就没法使用RDMA,但厂商(到现在为止)还没有更新它们的安装程序。
解决办法就是自制固件
幸运的是,还是有解决办法的:自己制作固件并刷新。实际操作比听上去容易多了。第一次的话也能要花30分钟。之后,这一过程顶多两分钟。我们将从已经安装的 Infiniband 开始,使用自带的微软驱动,以及上面配置的IP地址信息。
制作和刷新固件版本2.10.720的步骤:
1. 安装Mellanox WinMFT
2. 获取该卡设备ID
3. 获取该卡Board ID
4. 下载 .mlx文件
5. 下载 .ini文件
6. 使用mlxburn制作并刷新固件
刷新固件的具体步骤:
1)安装Mellanox WinMFT软件包。它提供给我们所需的制作和刷新固件的工具。本文撰写时,最新版本为2.7.2,安装程序名为WinMFT_x64_2_7_2.msi。
2) 现在我们需要获取此卡的一些信息。在命令行提示窗口,运行命令mst status,来获取卡的PCI ID。我的卡,如下图,ID是mt26428_pci_cr0,你的可能跟这个差不多,除非你有好几个卡。顺便提一句,数字26428是戴尔夹层卡的设备ID(一种产品标识符)。你可能注意到了,这个设备ID和一些Sun,惠普,Mellanox ConnectX-2双端口QDR卡的设备ID一样,这表明我们的戴尔卡确实是一款标准的Mellanox产品,尽管使用了戴尔专有的固件。
3)现在知道了卡的PCI ID,我们还要查明其他几个属性。在同一个命令行提示窗口里,运行命令flint -d query(一般为 flint -d mt26428_pci_cr0 query ),记下你卡的Board ID。见下图,戴尔的Board ID为DEL09A0000009。某些Sun卡的Board ID为SUN0170000009。 #p#page_title#e#
4)下载原始的固件文件到你的Infiniband服务器的一个文件夹里。原始的固件文件是一个扩展名为.mlx的大的文本文件。我使用的版本是2.10.720,固件文件名为fw-ConnectX2-rel.mlx,是我从用于Windows 2012的Mellanox 4.2驱动安装程序中提取的。你可以从这里下载我的固件文件http://www.openida.com/wp-content/uploads/fw-ConnectX2-rel.zip。如果不想下载我的版本,你也可以从Mellanox安装程序中提取自己的固件文件。启动安装程序,让它运行,查看文件夹c:users\appdatalocal emp,找到扩展名为.mlx的文件。
5) 下载 .ini 文件,把它放到 .mlx 固件文件的同一目录。我的Dell PowerEdge C6100夹层卡的版本在这里http://www.openida.com/wp-content/uploads/DEL09A0000009.zip。该 .ini 文件必须与Board ID匹配,因此你需要将它命名为“DEL09A0000009.ini”。如果你下载了我的版本,请跳过第六步。如果你不想使用我的固件文件,你可以通过编辑和重命名非贴标Mellanox卡的.ini文件自己制作。在Mellanox安装程序仍在运行时,到c:users\appdatalocal emp文件夹中找到名为MHQH29C_A1-A2.ini的文件。编辑内容(以戴尔为例),属性Name = DEL09A0000009,PSID = DEL09A0000009,然后将文件更名为DEL09A0000009.ini。如果你用的是Sun ConnectX-2卡,只要把文件属性和文件名中的戴尔Board ID改为Sun Board即可。
6) 你现在就可以制作新的固件镜像并刷到自己的卡上了。这两步用一个命令就能完成,而且必须是在你的服务器装有 Infiniband 卡的情况下完成。打开Windows命令行提示窗口,目录指向你的下载文件位置。输入命令mlxburn.exe -dev -fw ,你那儿应该是mlxburn.exe -dev mt26428_pci_cr0 -fw fw-ConnectX2-rel.mlx。
在运行此命令时,mlxburn会查找你的卡的Board ID。然后到文件夹下寻找有该Board ID的.ini文件。随后mlxburn使用.mlx固件文件和.ini文件来制作固件镜像,并将其烧录到卡中。完成后,重启服务器,让新的固件生效。
检查你的工作
要想检查新的固件版本,打开Windows命令提示行窗口,运行命令 flint -d (举例flint -d mt26428_pci_cr0)。查看固件版本,确认是否为 2.10.720,或者是你用的mlx文件版本。
现在检查你的卡能否使用RDMA了。打开PowerShell窗口,输入Get-SmbServerNetworkInterface。如下图,你的 Infiniband 端口现在应该显示 RDMA 可用。
最后,运行吞吐量测试。这次的结果为3,279MB/s – 相当于实际文件共享吞吐量为 25.6 千兆。
更令人惊讶的是RDMA的IPoIB难以置信的低延迟。IOMeter测试4kb随机传输显示,平均延迟仅为.51毫秒,将近250,000 的4kb随机IOPS ——一个大约2009年的Window文件服务器。
其他细节
本文的文件服务器是Dell PowerEdge C6100 XS23-TY3 node,双英特尔至强L5520处理器,Dell QDR Infiniband夹层卡(不到200美元)。我用的默认设置全新安装 Windows 2012服务器。为了测试,我需要一个比Infiniband卡还快的文件系统——这可不容易。为了达到此目的,我在文件服务器上运行了免费的StarWind RAM disk软件,并配置了四个8GB 内存盘。在本地使用IOMeter测试时,这些内存盘的吞吐能力超过9GB每秒,这足以赶上一个 Infiniband 卡。这些超快的磁盘之后被设置为标准的Windows共享。
用于测试的客户端是另一台一模一样的Dell C6100 node,使用 Mellanox Grid Director 4036 Infiniband交换机连接到服务器上。在 IPoIB 网络上装上了这四个共享卷之后,我开始在客户端机器上使用IOMeter进行吞吐量和IOPS测试。吞吐量测试存取规范是:1MB传输,100%随机和100%读取,其他设置均为默认值。IOPS测试,传输大小为4kb。我在四个磁盘上的每一个都使用的测试文件大小为16,000,000个扇区,队列深度为32。 在IOMeter中,你可以通过多选对多个卷进行测试。其他设置均为默认值。比如,Windows防火墙打开,大型页面没有启动。 #p#page_title#e#