諸如主機適配器和 Ethernet 交換機之類的 LAN 網絡設備在過去幾年中得到了較大的發展,使得實現高達 40Gbps 的吞吐量以及低于 1 微秒的網絡延遲成為可能。計算能力和 LAN 設備不再是一個瓶頸。
相反,在這個高性能硬件的新時代里,tcp 之類的協議變成了真正的瓶頸。為了克服 tcp 局限性,人們開發了諸如 remote direct memory access (rdma) 之類的新協議。本文將介紹一種經濟高效的方法,可使用該方法在 db2 客戶端環境中實現 rdma 功能,而不需要重新編碼和重新編譯現有應用程序
RDMA 是一種支持計算機繞過操作系統(內核和 TCP 堆棧)訪問其他計算機上內存位置的機制。與傳統的基于 TCP 的軟硬件架構相比較,RDMA 有幾個優勢。內核旁路 (Kernel bypass) 意味著縮短了兩個應用程序之間的路徑,并減少了 CPU 利用率。通過直接在網絡適配器和應用程序內存(用戶空間)之間傳輸數據減少了特定于 TCP 的協議開銷,無需將數據復制到內核空間并進行緩存。
為了充分利用 RDMA 提供的所有優勢,需要使用 RDMA 語義或上層協議,比如 User-Level Direct Access Transport (uDAPL) 或 Message Passing Interface (MPI) 來編寫應用程序。然而,對于 RDMA 來說,重寫一個 TCP 應用程序可能非常昂貴,因此,針對這種情況開發了一個替代解決方案。該方法稱之為 Direct Socket Protocol (SDP),無需重新編碼任何應用程序。
SDP 是一個連線協議,在 RDMA 能力的適配器和套接字之間使用。鑒于這個原因,SDP 對應用程序是透明的,而標準流套接字的實現不需要使用另一個 API 替換。DB2 應用程序和 DB2 服務器無需修改就可在 SDP 或 TCP 上運行。用戶只需要在執行應用程序之前通過預加載 SDP 共享庫來選擇要使用的協議即可。所有關于 TCP 的設置,比如主機名、IP 地址和端口,均無需修改。
例如,一個使用 TCP 連接到服務器的 Java 應用程序也可以使用相同 JDBC URL 在 SDP 上運行。該 SDP 庫,一旦預加載之后,將根據一組在 /etc/libsdp.conf 中定義的規則,以及服務器接受的協議來決定必需啟動哪個協議。默認規則指定 SDP 作為第一個選項,如果連接失敗,SDP 庫將退回到 TCP。
一個應用程序可以只使用 SDP,或者只使用 TCP,或者同時使用二者。例如,可以將一個應用程序配置為使用 SDP 實現 DB2 數據庫連接以及使用 TCP 實現 LDAP 連接。數據庫和 LDAP 服務器可以在不同的物理機器上運行,或者運行在相同的機器上但偵聽不同的接口。本文稍后將討論各種場景以及如何應用規則。
硬件和軟件基礎架構
RDMA 需要專用的硬件和軟件基礎架構。本文將討論 Linux x86 平臺上的 SDP。
- 主機適配器
兩類主機適配器支持 RDMA:Infiniband 適配器和 RoCE 適配器。前者需要 Infiniband 交換機,而后者需要 Ethernet 交換機。
本例使用 Mellanox RoCE 適配器。本文提供的所有指令均適用于 Infiniband 適配器,只需稍作修改或無需修改。RoCE (RDMA over Converged Ethernet) 是 Infiniband over Ethernet 協議的一個實現。Converged Ethernet 網絡允許不同類型的協議共享同一個媒介。定期封裝 IP 數據包、Infiniband over Ethernet 和 Fiber Channel over Ethernet 的 LAN Ethernet 框架都可在一個 Ethernet 線路中共存。
- 設備驅動程序
這里有幾個關于操作 Mellanox 適配器所需要的設備驅動程序和工具。所有可用的設備驅動程序和工具都是以 OpenFabrics Alliance 維護的 OFED 堆棧為基礎。
- 操作系統
Red Hat Linux 6.2,內核版本 2.6.32-220.4.1.el6.x86_64。
- Ethernet 交換機
10Gbps RackSwitch G8264,操作系統版本 6.8.1.0。