FreeBSD 的 InfiniBand 支持
现时 InfiniBand 硬件已经相当廉价。有些 4x 的 InfiniBand 适配器已经可以在 $100 以内拿到。由于 InfiniBand 可以提供高带宽、低延迟的数据传输,而且点对点对联不需要交换机,因此可以以十分低廉的价格满足近实时同步,或分离存储服务这样的需求。
今年年初的时候, Isilon、我厂 和 Panasys 联合资助了 FreeBSD 上的 InfiniBand 协议栈的实现。这个实现基于 OpenFabrics Alliance 的 OFED,对基于 Mellanox 芯片的多种常见的 InfiniBand 卡都提供了支持。这些代码目前已合并至 FreeBSD 的开发主线,并将随 FreeBSD 9.0-RELEASE 发布。
目前关于 InfiniBand 在 FreeBSD 上的使用介绍还很少,并且目前 InfiniBand 相关的支持还没有默认启用,所以在这里进行一些简要的介绍:
首先是编译系统。在 /etc/make.conf 中添加:
WITH_OFED=
相关的内核配置包括:
options OFED # OFED协议栈,必需
options OFED_DEBUG_INIT # 调试
options SDP # SDP (Sockets Direct Protocol) 协议
options SDP_DEBUG # SDP 调试
options IPOIB # IP-over-InfiniBand
options IPOIB_CM # IP-over-InfiniBand Connection Mode
options IPOIB_DEBUG # IPoIB-CM 调试
以及下列设备:
device mlx4ib # ConnectX InfiniBand支持
device mlxen # ConnectX 万兆以太网支持
device mthca # Mellanox Technologies HCA (只有IB)
如果使用的是 ConnectX 卡,则可以用 mlxen 令其呈现为一个网卡。
重新联编、安装内核和world之后,系统会提供下列函数库来供开发使用:
- libibcm
- libibcommon
- libibmad
- libibumad
- libibverbs
- libmlx4
- libmthca
- libopensm
- libosmcomp
- libosmvendor
- librdmacm
- libsdp
比较常用的是 RDMA CM 和 SDP 的库。其中,通过使用 LD_PRELOAD,libsdp可以让(二进制的) TCP 程序不加修改的直接走 SDP 协议;RDMA 适合对性能要求更高的场合。需要说明的是,如果用 SDP 协议的话,还需要运行子网管理服务 opensm。
总体上使用和 Linux 上的 OFED 差不多,现成的程序不需要做太多修改即可直接运行。
什么?可不可以用 IPoIB 直接跑现有的 TCP/IP 应用?再好好想想,这个开销是很大的,总之个人建议完全不要用IPoIB。