技術分享
[產品介紹] NSADI介紹
作者/黃俊源
前言HPE Integrity NonStop X型主機除了提供卓越的高效性能外,針對異質平台的介接,除了以往socket程式以外,亦提供新的低延遲傳輸架構 – NSADI (NonStop Application Direct Interface),藉由低延遲的InfiniBand網路,讓NonStop上的應用程式直接以RDMA (Remote Direct Memory Access)模式與Linux上的應用程式溝通。筆者將針對此架構之應用、環境需求、使用注意事項等與各位分享。
NSADI架構應用
NSADI主要利用NonStop X內部採用InfiniBand做為系統連線基礎架構,藉由此架構的延展,提供透過NonStop kernel-level的InfiniBand(IB)系統連接到外部的Linux server,以提供低延遲的傳輸環境。目前API提供下列的應用方式:
一、IB Verbs/Remote Direct Memory Access (RDMA) Communication Manager (CM):
RDMA_CM是一個通訊管理的函式庫,提供NonStop與Linux之間建立一個reliable的資料傳輸,這API是以socket為基礎,並且納入Queue Pair(QP)語法,基本上通訊是透過指定的RDMA設備,而資料傳輸則是message-based。
二、RDMA Sockets (rsockets):
屬於IB Verbs/RDMA CM的前端,rsocket可應用於sockets-based的應用程式;基本上從socket API轉換成rsocket API主要針對原有socket API名稱前須加上r,目前NonStop上支援的rsocket API彙整如下:raccept, rbind, rclose, rconnect, rgetpeername, rgetsockname, rgetsockopt, rlisten, rread, rreadv, rrecv, rrecvfrom, rrecvmsg, rshutdown, rsocket, rsend, rsendmsg, rsendto, rsetsockopt, rwrite, rwritev
三、Preload Library:
則是允許原有socket-based應用程式可以在不修改程式情況下,直接透過IB做資料傳輸。
IB Verbs/RDMA CM APIs不管是直接或是間接透過rsocket或是Preload,都是屬於OFED標準規範的一部分;目前NSADI遵循OFED 1.5.4版本,目前版本需要注意事項:
- NonStop目前針對standard rsocket或是Preload尚未支援完整的function,如fork()、exec()、poll()、select()等。
- 目前版本僅支援IPv4的addressing。
環境需求
一、硬體環境說明
NSADI支援NonStop X NS7以及NS3系列,目前NS7支援連接8個Linux server;NS3支援連接2個Linux server。
下列為NSADI拓樸架構圖:

《圖一》
針對c7000與IB ADI switch實體連接圖如下列範例:

《圖二》
NonStop X internal IB switch上port 17主要是保留供透過NSADI連接到外部server,基本上其連線方式有下列幾種模式:
- 連接單一個NSADI switch以便連接外部server。
- 透過fan-out的NSADI switch(扇形連接)連接外部server。
- 不透過NSADI switch直接連接外部server。
NonStop X系統在IPoIB網路上,針對每一個IB末端點都會指派一個獨一無二IP address,以NonStop X IP address制定規則為A.B.C.D,其中每個數值分別意義如下:
- A表任意值,預設為10。
- B由兩個設定組成,最高位元數值表示fabric,其他數值表示實體設備。
Fabric中0(0x00=0)表示x-fabric,1(0x80=128)表示y-fabric。 - 實體設備中:
0表示MEU。
1表示CPU。
2表示storage CLIM。
3表示network CLIM。
4表示open CLIM(Telco或是IB CLIM)。
10~13表示NSADI external server。 - C表Expand Node Number。
- D表實體資源類型,可用範圍為0~255。
- 下列為針對expand node number為123連接的NSADI external server IP address範例:
《圖三》
二、軟體環境說明
針對外部的Linux server或是OSS環境,其header file主要放置於:
- /usr/include/InfiniBand
- /usr/include/rdma
針對NonStop X,IB-based API透過SUT佈署後,主要會放置於$system.zxdll,主要有兩個DLL library,WUIBDLL以及WPIBDLL。程式編譯時可以直接連結對應的DLL檔案,也可以指定-l uib以便讓編譯工具自行搜尋library位置。
使用注意事項
針對NSADI,下列為環境的使用上之注意事項:
一、NSADI僅支援64 bit OSS採用POSIX User Thread (PUT)的程式。
二、針對外部的Linux server (RHEL)其OFED library必須為1.5.4或是之後的版本。
三、NSADI支援OFED ABI version 3或是之後版本。
四、所有外部Linux server必須採用NonStop所認可的IB PCI adapter、cable、switch,否則會導致IB通訊中斷。
五、Subnet Manager(SM)不可以在NonStop IB SAN上的external server啟動,因為在NonStop SAN上主要控制權是落在NonStop上。
六、任何外部server如果啟動rogue Subnet Manager被偵測到,將會導致其所連接的IB switch port被停用。
七、NonStop OS針對RDMA CM port number有些是保留給NonStop本身使用,所以NSADI client須選用這些以外的port與NSK連接。
八、IPoIB的連線無法使用於external server與NSK CPU之間,不過可以用於external server之間的連線。
九、OSS程式如果使用Preload library,須注意不能綁INADDR_ANY。
針對在應用開發的時候相關注意事項彙整如下:
一、Error number(errno):
當使用NonStop IB API碰到錯誤時所回傳的errno都是定義在 /usr/include/errno.h。NonStop IB API回傳錯誤的方式基本上會比照標準制定,例如:
- 當錯誤發生時,會return -1並且將詳細錯誤代碼設定於errno變數。
- 直接回傳errno表示錯誤發生並且提供詳細錯誤代碼。
二、實體連接Port number:
每一個NonStop IB端點都會採用dual port HCA來連接兩個NonStop IB網路,HCA port 1連接X-fabric SAN,HCA port 2連接Y-fabric SAN。NonStop X internal IB switch上port 17保留連接NSADI external server。
三、RDMA CM port numbers:

《圖四》
四、IB times:
下表列出幾個時間關係的欄位並且提供對應轉換到usec的數值。詳細資訊可以參考InfiniBand architecture specification(參考網址連結)

《圖五》
五、CQ completion vectors:
NonStop IB Verbs執行工具ibv_create_cq()中的comp_vector argument將作為選擇IPU的機制,下表為comp_vector在NonStop IB Verbs使用時可以支援的數值。

《圖六》
六、Memory management:
針對IB在記憶體與HCA利用DMA engine固定實體位址(physical address)做轉換,這樣的動作virtual memory subsystem就不會swap out記憶體,因此在開始做轉換前,對應buffer的虛擬位址(virtual address)必須轉換成實體位址,而這處理轉換以及固定佔用記憶體(pinning memory)就是記憶體登記(memory registration)。一般而言IB記憶體登記相對耗資源,因為系統需要做轉換及鎖定記憶體。當執行一些NonStop IB Verbs而且沒有直接導到client應用程式,會有IB data轉換buffer被建立。IB Verbs所對應的記憶體區域會被佔用或是釋放都是藉由系統相關的記憶體管理function,如NonStop上的mmap()以及mumap() function。
針對NonStop X系統,新的privileged RDMA services function推出,藉此用於針對NonStop IB Verbs使用時內部記憶體登記等所需之工作。
下列為IB於User Space需要在HCA保留並且登記的記憶體緩衝區:
- Receive Buffers
- Send Buffers
- RDMA Buffers
目前記憶體登記處理(memory registration process)會透過ibv_reg_mr() verb。當RDMA service執行這記憶體登記作業時,他會做下列工作:
- 鎖定對應的記憶體。
- 虛擬記憶體位址轉換成實體記憶體位址。
- HCA設定所需適當的屬性參數。
所登記的記憶體位置定義稱為Memory Region(MR)。下表簡單列出client-initiated NonStop IB Verbs及其間接觸發所需的記憶體管理動作。詳細內容可參閱對應API的online manpage。例如ibv_reg_mr() manpage就會包含ibv_mr structure的說明。

《圖七》
如果對應要登記使用的記憶體碰到錯誤,client-initiated NonStop IB Verbs針對所觸發的memory allocate就會回應ENOMEM的錯誤訊息。
七、Fault tolerance:
受限於標準IB Verbs/RDMA不管是直接或是透過rsocket/Preload protocol,都不包含fabric發生問題的故障處理,所以容錯機制便需要建置於兩端的應用程式上做控制。
八、Security:
針對連接外部server並沒有提供作加密的資料處理,如果有這方面的考量可能須由應用程式做處理。
另外由於NonStop CPU以及CLIM都有NSADI-based InfiniBand Access Control List (IBACL)的功能機制,因此如果
- 外部server上被發現啟動Subnet Manager,將會導致所連接的IB switch上的port被停用。
- 針對NSK以及CLIM上untrusted GUID logic連線或是從external server企圖連接到NonStop端所保留的RDMA CM port,都會被拒絕或是忽略。
九、Standard Linux APIs not supported:
下列標準Linux APIs並不支援OSS端的client程式,包含fork()、exec()、select()、poll()。
十、Compiler directive for Preload clients:
如果client程式使用Preload library的時候,於編譯時需要指定compiler directive, -D_PRELOAD_SUPPORT_FUNCTIONS。
[注意]:如果NSADI程式會用到傳統TCP/IP sockets以及NSADI所支援的任意介面(IB Verbs/RDMA CM,rsockets,Preload)當在編譯時,也需要指定此compiler directive。
十一、NSADI不支援的APIs:
針對IB Verbs下列為目前不支援的API:
ibv_attach_mcast, ibv_detach_mcast, ibv_event_type_str, ibv_node_type_str, ibv_port_state_str, ibv_query_gid, ibv_query_pkey
針對RDMA_CM下列為目前不支援的API:
rdma_create_ep, rdma_destroy_ep, rdma_freeaddrinfo, rdma_getaddrinfo, rdma_join_multicast, rdma_leave_multicast, rdma_migrate_id, rdma_set_option
針對rsocket下列為目前不支援的API:
rfcntl, riomap, riounmap, riowrite, rpoll, rselect
測試數據
依據HPE ping/pong測試,從Linux Client傳送N bytes資料至NSK端後直接回傳N bytes資料,並比較TCP/IP socket程式與NSADI程式測試結果,測試結果數據如下:

《圖八》
結論
由於NonStop X內部升級採用低延遲的InfiniBand網路架構,因此藉由NSADI提供NonStop與Linux平台介接的新選項,藉由RDMA的技術,減少作業系統所需處理的成本,並且提升傳輸效能。
NSADI提供rsocket以及Preload Library,讓原有TCP/IP socket程式可以簡單升級成以NSADI介面做溝通,簡化NSADI技術應用的門檻。
<作者目前服務於凌群電腦NSK服務總處>
參考資料
1.Michael Rice Mike Clapper, HPE NonStop X NSADI Overview and Usage
2.NonStop Application Direct Interface Reference Manual