ip网络(套接字API)和非ip网络(InfiniBand Ve
在我的认知里只接触过ip通信,一看到非ip网络还有些兴奋。
你将学到一般IP通信是怎么原理,RDMA通讯又是怎么工作的?
ip网络和非ip网络介绍
大多数现在网络设备都属于两个非常广泛类别的网络之一:基于IP的网络。对于大多数网络设备来说,通过ip地址通信,是互联网的标准。这通常包括以太网,电缆调制解调器,DSL调制解调器,拨号调制解调器, Wi-Fi,VPN连接等。
当然也存在非IP网络,这些通常是非常特定的利基(niche)网络,值得一提的是在使用中不断成长的Infiniband。由于InfiniBand不是IP网络,通常使用IP网络的许多功能和配置不适用于Infiniband。
了解 InfiniBand 和 RDMA 技术
通常提到InfiniBand会想到两个不同的东西。一个是InfiniBand网络的物理链接层协议,另一个是高级编程API,名为InfiniBand Verbs API,是一种远程直接内存访问(RDMA)技术的实施。
RDMA通讯与一般IP通讯不同,原因是他们会绕过通讯过程中的内核干扰,并极大减少一般处理网络通讯所需的 CPU 消耗。
在典型的 IP 数据传输中,机器 A 中的应用程序 X 会向机器 B 中的应用程序 Y 发送同样的数据。作为传输的一部分,机器 B 的内核必须首先接收数据,解码数据包标头,确定该数据属于应用程序 Y,然后唤醒应用程序 Y,等待应用程序 Y 在内核中执行读取 syscall,然后必须手动将该数据从内核的自主内部内存空间复制到应用程序 Y 提供的缓存中。这个过程意味着大多数网络流量都必须在系统的主内存总线间至少复制两次(一次是主机适配器使用DMA将该数据放到内核提供的内存缓存中,另一次是内核将该数据移动到应用程序的内存缓存中),同时也意味着计算机必须执行大量上下文切换,以便在内核上下文和应用程序 Y 上下文之间进行切换。这些操作都会在网络通讯处于极高频率时造成极高的系统 CPU 负载。
RDMA协议可让机器中的主机适配器了解网络何时会有数据包,那个应用程序应该接收该数据包,以及该数据应进入该应用程序内存空间的那个部分。这样就不会向内核发送该数据包并进行处理,然后再复制到用户的应用程序内存,而是将该数据包直接放到应用程序的缓存中,没有任何进一步的干预。这样就可以极大减少高速网络通讯的负载。但大多数 IP 联网应用程序依赖的标准伯克利套接字 API 无法实现此功能,因此必须提供其自己的API,即InfiniBand Verbs API,同时必须在应用程序可直接使用RDMA技术前将其移植到这个API。
Redhat7已经支持InfiniBand硬件和InfiniBand Verbs API。另外也有两种技术支持non-InfiniBand硬件使用InfiniBand Verbs API。它们分别是iWARP (Internet Wide Area RDMA Protocol) 和RoCE/IBoE (RDMA over Converged Ethernet, 重命名为InfiniBand over Ethernet)。这两些技术都有个底层技术:IP网络链路层。大多数来说一旦IP网络特性配置后,只要硬件驱动安装后,RDMA特性自动生效。The kernel drivers are always included with each kernel Red Hat provides, 如果操作系统安装时没有选择InfiniBand安装包则需要手工安装用户命名空间驱动。
需要的用户空间软件包:
iWARP:Chelsio hardware — libcxgb3 或者libcxgb4,具体要看硬件版本。
RoCE/IBoE:Mellanox hardware — libmlx4 或者 libmlx5,具体要看硬件版本。另外,要求用户编辑 /etc/rdma/mlx4.conf 或者 /etc/rdma/mlx5.conf,以便为 RoCE/IBoE设定正确的端口类型。要求用户编辑 /etc/modprobe.d/mlx4.conf 或者 /etc/modprobe.d/mlx5.conf 文件,以便在以太网中为无损服务配置数据包优先响应(在一些交换机中称之为 “no-drop”),以此切换连接到该网络的网卡。
安装完这些驱动包(正常的RDMA包安装后都有这些驱动包),可以使用RDMA应用进行测试并查看RDMA协议通信过程。然而并不是所有的应用程序包括RedHat7都支持iWARP or RoCE/IBoE设备。这是因为iWARP上的建链协议不同于InfiniBand链路层连接。假如应用程序在使用librdmacm connection management library时出现问题,它将兼容处理iWARP和InfiniBand的不同。假如应用程序尝试自己的连接管理,必须支持iWARP否则无法工作。faq这段硬翻译的没懂。
与INFINIBAND及RDMA相关的软件包
因为 RDMA 应用程序与基于伯克利套接字的应用程序有很大不同,而在一般 IP 联网中,大多数在 IP 网络中使用的应用程序无法直接在 RDMA 网络中使用。RedHat7为RDMA网络管理、测试及调试、高级软件开发API及性能分析提供大量不同的软件包。
要使用这些网络,需要安装这些软件包的一部分或全部(这个列表并不全面,但包括与 RDMA 有关的最重要软件包)。
必须安装的软件包:
rdma — 负责 RDMA 栈的内核初始化。
libibverbs — 提供 InfiniBand Verbs API。
opensm — 子网管理器(只需要在一台机器中安装,且只能在没有激活子网管理器的构造中安装)。
user space driver for installed hardware — 以下软件包之一:infinipath-psm、libcxgb3、libcxgb4、libehca、libipathverbs、libmthca、libmlx4、libmlx5、libnes 及 libocrdma。注:libehca 只用于 IBM Power Systems 服务器。
推荐的软件包:
librdmacm、librdmacm-utils 和 ibacm — 可以识别 InfiniBand、iWARP 和 RoCE 之间不同的连接管理库,也可以正确打开跨这些硬件类型的连接,运行确认该网络操作的一些简单测试程序,并可将该库整合到缓存守护进程,以便在大型集群中更快地进行主机解析。
libibverbs-utils — 基于简单 Verbs 的程序查询安装的硬件,并确认使用该结构的通讯。
infiniband-diags 或 ibutils — 为InfiniBand结构管理提供大量有用的调试工具。这些工具只为 iWARP 或 RoCE 提供有限功能,因为大多数工具可在 InfiniBank 链接层工作,但无法在 Verbs API 层使用。
perftest 和 qperf — 用于各种 RDMA 通讯类型的性能测试应用程序。
rdma 软件包提供 /etc/udev.d/rules.d/70-persistent-ipoib.rules 文件。这个 udev 规则文件可用来修改 IPoIB 设备的默认名称(比如 ib0 和 ib1),以便提供更有描述性的名称。
~]$ ip link show ib0
8: ib0: >BROADCAST,MULTICAST,UP,LOWER_UP< mtu 65520 qdisc pfifo_fast state UP mode DEFAULT qlen 256
link/infiniband 80:00:02:00:fe:80:00:00:00:00:00:00:f4:52:14:03:00:7b:cb:a1 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
link/infiniband 后紧接着的是 IPoIB 接口的 20 字节硬件地址。重新命名只需要以上使用黑体标注的最后 8 位地址。用户可采用适合他们的任何命名方案。例如:如果将 mlx4 设备连接到 ib0 子网结构中,则可使用 device_fabric 命名规则将其命名为 mlx4_ib0。唯一要避免的是使用标准名称,比如 ib0 或者 ib1,因为这些名称会与内核自动分配的名称冲突。
libibverbs-utils 软件包中的简单测试程序可帮助您确定 RDMA 操作是否正常。ibv_devices 程序显示该系统中目前所有设备,而 ibv_devinfo 命令会给出每个设备的具体信息。
可使用简单的 ping 程序,比如 infiniband-diags 软件包中的 ibping 测试 RDMA 连接性。ibping 程序采用客户端/服务器模式。必须首先在一台机器中启动 ibping 服务器,然后再另一台机器中将 ibping 作为客户端运行,并让它与 ibping 服务器相连。
配置 IPOIB
IPoIB 的角色是在 InfiniBand RDMA 网络顶层提供 IP 网络模拟层。这样就可以让现有应用程序无需修改即可在 InfiniBand 网络中运行。但那些应用程序的性能相比原本使用 RDMA 通讯编写的应用程序要低。因此大多数 InfiniBand 网络中有一些应用程序集合必须使用其全部网络性能,而对另一些应用程序来说,如果不需要修改为使用 RDMA 通讯,则性能降级是可以接受的。IPoIB 可让那些不那么主要的应用程序在网络中以其原有形式运行。
因为 iWARP 和 RoCE/IBoE 网络实际上是在其 IP 链接层顶层附带 RDMA 层的 IP 网络,他们不需要 IPoIB。因此,内核会拒绝在 iWARP 或 RoCE/IBoE 设备中创建任何 IPoIB 设备。
可将 IPoIB 设备配置为以数据报或连接模式运行。不同之处在于 IPoIB 层尝试在通讯另一端机器中打开的队列对类型。在数据报模式中会打开不可靠、断开连接的队列对;而在连接模式中会打开可靠且连接的队列对。
使用数据报模式时,不可靠、断开的队列对不允许大于 InfiniBand 链接层 MTU 的数据包通过。IPoIB 层会在要传输的 IP 数据包顶部添加一个 4 字节的 IPoIB 标头。因此,IPoIB MTU 必须比 InfiniBand 链接层小 4 字节。因为在 InfiniBand 链接层 MTU 一般为 2048 字节,则数据报模式中的 IPoIB 设备则通常为 2044 字节。
使用连接模式时,可靠且连接的队列对类型允许大于 InfiniBand 链接层 MTU 的信息通过,同时在两端均采用主机适配器处理数据包片段并将其组合。这样使用连接模式时不会对通过 InfiniBand 适配器发送的 IPoIB 信息有大小限制,但 IP 数据包只有 16 个字节字段,因此最大字节数只能为 65535。最大允许的 MTU 实际较小,因为我们必须确定不同 TCP/IP 标头也适合这个大小限制。因此,连接模式中获得 IPoIB MTU 最大为 65520,这样可保证为所有需要的 TCP 标头提供足够的空间。
连接模式选项通常有较高性能,但也会消耗更多的内核内存。因为大多数系统考虑的是性能而不是用内存消耗,因此连接模式是最常用的用户模式。
但如果将系统配置为连接模式,它必须可以使用数据报模式发送多播流量(InfiniBand 交换机及结构无法使用连接模式传递多播流量),且可以在与未配置连接模式的主机通讯时返回数据报模式。管理员应意识到如果他们要运行发送多播数据的程序,且那些程序要以接口中的最大 MTU 发送多播数据,则需要将该接口配置为数据报操作,或者使用将多播程序配置为将其发送数据包大小限制在数据报允许的数据包范围内的其他方法。
参考
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/networking_guide/ch-Configure_InfiniBand_and_RDMA_Networks