如果您在Alibaba Cloud Linux 3系統中啟用了共用記憶體通訊SMC(Shared Memory Communication),在使用過程中若遇到無法正常通訊、部分連接埠不可用以及與TCP相比應用效能未見提升等問題,可以參考本文提供的方案進行排查並解決。
啟用SMC後應用效能對比TCP沒有提升
問題描述
使用SMC加速應用TCP串連之後,應用的效能與直接使用TCP對比並沒有提升。
問題原因及解決方案
由於某些原因,導致應用建立的SMC串連回退到TCP,此時無法使用RDMA加速網路通訊。詳細的回退排查和解決方案,請參見啟用SMC後回退無法使用RDMA加速。
應用的網路通訊開銷在整個應用中佔比較小。例如應用是傾向於CPU密集型,網路通訊在應用中佔比較低。
由於RDMA資料包相較於TCP需要佔用更多的頭部空間以攜帶與RDMA相關的資訊,因此在頻寬滿載的情況下,RDMA傳輸的資料頻寬會略低於TCP。您可以考慮啟用巨型幀(Jumbo Frames)來緩解這個問題。更多資訊,請參見巨型幀(Jumbo Frames)。
應用的網路通訊模型不適用SMC。例如:
頻繁建立、銷毀串連(短串連)的情境。SMC建立串連涉及到RDMA資源建立和申請等慢速路徑,根據不同應用短串連的佔比,效能對比TCP可能沒有收益。
資源受限的情境。SMC通訊所使用的資源受限於機器記憶體和eRDMA網卡規格,資源不足可能導致SMC回退到TCP。更多資訊,請參見共用記憶體通訊(SMC)使能和配置說明。
啟用SMC後無法正常通訊
問題描述
使用Alibaba Cloud Linux 3開啟SMC之後,訪問某些地址(例如某些公網服務)不通,但是可以ping通。關閉SMC之後恢複正常。
問題原因
某些伺服器實現上沒有嚴格遵守TCP規範,在處理TCP options時,可能重放TCP options,導致SMC協議識別出現問題。
A TCP implementation MUST (MUST-6) ignore without error any TCP Option it does not implement, assuming that the option has a length field.更多資訊,請參見RFC 9293。
如果用於表徵支援SMC的TCP option被重放,就會使得本端誤認為對端服務具備SMC能力,引起握手錯誤,導致請求(例如curl)失敗,而ping(ICMP協議)成功的現象。
您可以通過通訊鏈路檢查診斷此類問題。
解決方案
對於重放SMC TCP option的非預期現象,由於是網路中間節點或對端的錯誤行為,無法從根本上避免,建議通過基於BPF策略的SMC協商控制,避免此鏈路訪問使用SMC通訊。
通過smc_run啟用SMC無效
問題描述
根據共用記憶體通訊(SMC)使能和配置說明通過smc_run ./foo在應用程式維度啟用SMC後,使用smcr l觀察發現沒有成功建立的link group,使用smcss -a也看不到串連或是看到一側串連出現回退。
問題原因
smc_run透明啟用SMC的原理是通過LD_PRELOAD將smc-tools中提供的動態連結程式庫優先於其他庫之前載入,在優先載入的動態連結程式庫的socket(2)中對socket的family和protocol進行修改。因此,若應用程式並非通過動態方式連結(如靜態連結),則smc_run無法成功透明啟用SMC。
解決方案
根據共用記憶體通訊(SMC)使能和配置說明提供的sysctl net.smc.tcp2smc啟用SMC。
啟用SMC後導致部分連接埠不可用
問題描述
載入SMC後,65500後的16個連接埠(即65500~65515)不可用,bind(2)這些連接埠會導致返回EADDRINUSE。
問題原因
由於SMC-R+eRDMA實現方式的特殊性,SMC模組將會佔用ERI所在net namespace下65500開始的16個連接埠作為OOB建連的預留連接埠,在dmesg中可以查看到如下提示資訊:
smc: smc: load SMC module with reserve_mode
NET: Registered protocol family 43
smc: netns <netns ID> reserved ports [65500 ~ 65515] for eRDMA OOB
smc: adding ib device erdma_0 with port count 1
smc: ib device erdma_0 port 1 has pnetid如果連接埠佔用失敗則SMC模組無法使用eRDMA裝置。
解決方案
卸載SMC模組後將會釋放這些連接埠。卸載方法請參見在阿里雲ECS上使用SMC。
啟用SMC後使用IPv6地址出現回退
問題描述
在使用IPv6地址的應用程式中啟用SMC,通過smcss命令可以觀察到SMC回退到TCP協議棧的現象,回退原因代碼為0x03030000或0x0x09990000。
問題原因
阿里雲eRDMA裝置與SMC目前均不支援使用IPv6地址。如果應用程式層使用IPv6地址,會導致SMC回退到TCP協議棧。
解決方案
在對建立串連啟用SMC前,根據實際需求選擇以下任意一種方法禁用IPv6地址。
方案一:禁用IPv6地址。
執行以下命令,禁用所有網路介面的IPv6地址。
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1 sysctl -w net.ipv6.conf.default.disable_ipv6=1執行以下命令,禁用特定網路介面的IPv6地址。
<NetInName>替換為具體的網路介面名。sudo sysctl -w net.ipv6.conf.<NetInName>.disable_ipv6=1
方案二:在
5.10.134-17.3及更高版本的核心上,使用IPv4-mapped IPv6地址。
在極限PPS情境下SMC效能不如TCP
問題描述
當網路壓力達到ECS執行個體規格定義的網路收發包PPS上限時,啟用SMC使用eRDMA後應用程式的QPS(Queries Per Second)表現不如TCP。
TCP流量:通過
sar -n DEV 1命令查看網路介面每秒傳輸包數量rxpck/s和txpck/s,確定網路壓力是否達到PPS上限。SMC的eRDMA流量:通過
eadm stat -d <ibdev_name> -l命令來查看eRDMA網路介面每秒傳輸包數量,確定網路壓力是否達到PPS上限。更多eadm的資訊,請參見使用eadm工具進行eRDMA故障診斷和排查。
問題原因
由於RDMA協議的網路包設計與TCP不同,RDMA對於相同數量網路請求產生的網路包數量更多,更易達到執行個體規定的PPS上限,導致應用程式的QPS無法繼續增長。
解決方案
該問題僅出現在達到PPS上限的極限網路壓力情況下,例如使用benchmark壓測時。在實際情境中網路流量壓力極少會達到執行個體PPS上限。如果確實出現因PPS上限導致SMC效能劣於TCP的實際情境,則建議不在此情境下使用SMC。
啟用SMC後回退無法使用RDMA加速
問題描述
啟用SMC並替換應用的TCP串連,此時運行smcss -a命令可以看到建立的串連已經自動回退(fallback)到TCP。
問題原因
SMC建立串連時,如果發生異常會自動回退到TCP串連,此時SMC串連仍然可以正常通訊,但是無法享受RDMA帶來的效能提升。SMC發生回退時會提供回退原因編號,根據回退編號可以協助分析和定位問題。
解決方案
運行
smcss -a命令,查看SMC串連的回退編號。返回結果樣本:
State UID Inode Local Address Peer Address Intf Mode ACTIVE 00000 0156721 192.168.99.21:60188 192.168.99.22:8090 0000 TCP 0x03010000 ACTIVE 00000 1202539 172.16.4.189:44780 172.16.4.190:1811 0000 SMCR其中第一條記錄Mode列為TCP,意味著該SMC串連回退到TCP,同時回退編號為0x03010000。第二條記錄Mode列為SMCR,則說明已經正常建立SMC-R串連。如果Mode列顯示的回退編號為兩個(例如0x05000000/0x03030001),其中第一個回退編號為本地的回退原因,第二個回退編號為對端的回退原因,通常是由於對端回退導致了本機無法正常建立SMC串連而回退。
根據回退編號,從下表中查看可能的原因和解決方案。
啟用SMC後常見網路營運工具的資料與預期不符
問題描述
使用Alibaba Cloud Linux 3開啟SMC-R之後,常見的網路分析工具tcpdump、Wireshark等,網路監控工具ss(Socket Statistics)、netstat等,觀察到的網路流量與預期不符或無法觀察到預期流量。
問題原因
這是因為SMC-R是基於RDMA的網路通訊技術,目前常見的網路營運工具只能分析或監控TCP流量,無法識別RDMA的網路資料報文。這會導致實際的網路資料和網路營運工具中顯示的資料不匹配。
解決方案
可以嘗試使用RDMA相關的營運工具進行資料分析或監控。更多資訊,請參見監測和診斷eRDMA。
在GPU或SCC執行個體上載入SMC模組不可用
問題描述
在GPU或SCC執行個體上載入SMC模組,模組不可用。
問題原因
這類執行個體中安裝了Mellanox廠商版本OFED驅動,預設載入的是OFED中的SMC模組,不具備實際功能。且由於安裝Mellanox OFED驅動後RDMA相關函數的符號發生變化,載入核心內建的SMC模組會出現Unknow symbol錯誤而無法載入成功。
解決方案
目前Alibaba Cloud Linux 3 SMC模組不支援在GPU或SCC等執行個體中使用。
啟用SMC後setsockopt/getsockopt部分SOL_SOCKET或SOL_TCP層選項效果與預期不符
問題描述
啟用SMC並替換應用的TCP串連後,原本作用於TCP串連的部分SOL_SOCKET或SOL_TCP層選項通過setsockopt或getsockopt設定失敗,或設定成功但無法起到預期效果。
問題原因
使用SMC替換TCP協議棧後,資料路徑上基於共用記憶體完成通訊,協議棧設計和資料傳遞方式都與TCP有著很大的不同。因此,部分SOL_SOCKET或SOL_TCP層選項不再適用。
解決方案
對照下表查看Alibaba Cloud Linux 3中SMC對SOL_SOCKET或SOL_TCP層選項的支援情況。
SMC對SOL_SOCKET或SOL_TCP層選項的支援情況可以分為以下3種類型:
Y:支援,設定/擷取選項返回成功,並且能夠達到預期效果。
M:不支援,設定/擷取返回成功,但由於SMC與TCP設計的不同,無法達到預期效果。
N:不支援,設定/擷取返回失敗,回退到TCP(回退原因編號:0x03060000或0x03010001)。