NetACC(Network Accelerator)是一個使用者態網路加速庫,利用eRDMA的低時延、高吞吐等優勢,通過相容socket介面,實現對現有TCP應用的加速。對於對網路通訊效能要求高、需要低延遲和高輸送量的TCP應用,可以通過NetACC,無需修改應用代碼即可適配eRDMA,實現網路加速。
NetACC當前處於公測階段。
NetACC適用情境
NetACC適用於網路開銷較大的情境:
高PPS(Packets per Second)情境:尤其是大量收發小包的情境。使用NetACC可以降低CPU開銷,提升系統吞吐能力,例如在Redis處理請求的情境中。
對網路時延敏感的情境:eRDMA的網路時延比TCP更低,可以提升網路響應速度。
反覆建立短串連的情境:NetACC可以最佳化二次串連的速度,加快連線速度,提升系統效能。
安裝NetACC
安裝方式
通過eRDMA驅動安裝
安裝eRDMA驅動的時候,NetACC也會一併安裝。關於eRDMA驅動的安裝,請參見為ECS執行個體安裝eRDMA驅動。
單獨安裝
如果您需要使用特定版本的NetACC或者您需要臨時使用NetACC等,您可以在ECS執行個體上執行以下命令,單獨安裝NetACC:
sudo curl -fsSL https://netacc-release.oss-cn-hangzhou.aliyuncs.com/release/netacc_download_install.sh | sudo sh
設定檔及參數最佳化
安裝NetACC後預設設定檔是
/etc/netacc.conf
,允許使用者根據需要調整參數,如訊息大小NACC_SOR_MSG_SIZE
、RDMA記憶體註冊大小NACC_RDMA_MR_MIN_INC_SIZE
和NACC_RDMA_MR_MAX_INC_SIZE
、QP承載連結數NACC_SOR_CONN_PER_QP
、IO線程數NACC_SOR_IO_THREADS
等,以最佳化效能。設定檔樣本如下:
使用NetACC
您可以通過netacc_run
命令或者設定環境變數LD_PRELOAD
的方式在應用中整合NetACC。使用之前,請您仔細閱讀NetACC使用注意事項。
netacc_run
命令
netacc_run
是一個工具,用於啟動應用程式時載入NetACC庫,通過在應用程式命令之前增加netacc_run
,使用者可以比較方便地啟動應用程式並應用NetACC加速。
netacc_run
提供了很多配置選項,比如IO線程數(-t)、QP複用數(-p)等,這些參數可以協助最佳化NetACC的效能。通過netacc_run
命令設定的參數會覆蓋設定檔中的參數。
使用樣本:
以本文中Redis應用為例,在Redis命令之前增加
netacc_run
即可實現應用NetACC。啟動Redis服務
netacc_run redis-server
啟動Redis基準測試
netacc_run redis-benchmark
設定LD_PRELOAD
環境變數
LD_PRELOAD
是一個環境變數,用於指定在程式啟動時積極式載入的共用庫。如果您需要在指令碼中自動化NetACC的載入,您可以通過LD_PRELOAD
指定NetACC加速庫。
執行以下命令,查看NetACC動態庫的位置:
ldconfig -p | grep netacc
返回資訊如下所示:
執行以下命令,設定
LD_PRELOAD
環境變數來指定預先載入庫:LD_PRELOAD=/lib64/libnetacc-preload.so your_application
此處
your_application
是您想要加速的應用程式。使用樣本:以本文中Redis應用常用命令為例:
啟動Redis服務
LD_PRELOAD=/lib64/libnetacc-preload.so redis-server
啟動Redis基準測試
LD_PRELOAD=/lib64/libnetacc-preload.so redis-benchmark
NetACC監控
netacc_ss
是NetACC中內建的監控工具,您可以執行netacc_ss
命令監控使用了NetACC加速的TCP應用進程收發資料的狀態。在Server端和Client端均可以執行該命令進行監測。netacc_ss
命令詳細說明如下:
執行如下命令,查看使用了NetACC加速的TCP應用進程收發資料的狀態:
netacc_ss -s all -p <進程ID>
您可以通過執行ps -ef | grep <進程名稱>
命令查詢進程ID。
NetACC使用注意事項
使用NetACC時,只有使用支援eRDMA的網卡(IP地址)建立的串連才會被轉換為RDMA串連,其他串連還是會使用TCP。
說明如果網路通訊的任一端的網卡不支援彈性RDMA介面,那麼NetACC將無法建立RDMA串連,而是會回退到使用TCP串連。
使用NetACC時,如果您需要在多個進程之間進行網路通訊,您不能將RDMA的socket檔案描述符(fd)通過核心的處理序間通訊(IPC)機制發送給其他進程。
說明RDMA串連是基於特定的隊列對(Queue Pair,QP)建立的,而這些QP不支援在不同進程之間直接共用,因此RDMA串連不能在進程間共用。
NetACC架構目前不支援IPv6協議,為了確保在使用NetACC時不出現IPv6相關的衝突或錯誤,建議通過執行
sysctl net.ipv6.conf.all.disable_ipv6=1
命令來禁用系統中的IPv6功能。NetACC動態庫不支援熱更新,熱更新可能造成不可預期的錯誤,更新前請先停止應用進程。
NetACC目前不支援TCP協議中的部分通訊端選項,包括SO_REUSEPORT,SO_ZEROCOPY和TCP_INQ。
NetACC依賴於glibc,無法在非glibc環境下工作,比如Golang。
使用NetACC前,建議您通過執行
ulimit -l unlimited
命令來設定進程可以鎖定的實體記憶體的最大量為無限制。說明如果ulimit -l參數設定得過小,那麼在RDMA註冊記憶體時可能會因為超出了系統允許的記憶體鎖定限制而失敗。
在NetACC中,當應用程式監聽一個TCP連接埠以進行通訊時,NetACC會為這個TCP連接埠額外監聽一個RDMA連接埠(TCP連接埠加20000),以便在RDMA網路環境中進行高效的資料轉送。
說明如果RDMA連接埠被佔用或者超過了有效連接埠範圍,會導致無法正常建立串連。請您合理分配,以避免連接埠衝突。
在NetACC中,當一個父進程使用
fork()
系統調用建立子進程後,子進程預設情況下不會繼承父進程已經建立的socket串連。說明fork()後無法繼承父進程建立的socket串連,可能會導致無法正常通訊,需要重建立立socket串連。
在NetACC中,QP複用功能預設是關閉的。
您可以在NetACC的設定檔中通過
NACC_SOR_CONN_PER_QP
或者在運行netacc_run
時候指定QP複用數(-p),配置單個QP承載的串連數大於1,即允許多個串連複用1個QP,從而開啟QP複用功能。如果開啟QP複用功能,因為減少了QP的數量,從而減少了管理開銷和資源消耗,特別是在高並發串連的情境下,可以提升整體的通訊效率。
當QP複用功能開啟時,多個RDMA串連可能會共用同一個本地連接埠號碼。這是因為在RDMA中,連接埠號碼是用來標識QP的,而不是用來區分串連的。如果多個串連共用同一個QP,它們也會共用同一個本地連接埠號碼。
說明如果應用程式需要區分不同的本地連接埠號碼(例如,為了實現不同的服務或監聽不同的連接埠),那麼不應該開啟QP複用功能。因為一旦開啟,多個串連將無法通過本地連接埠號碼來區分,這可能會導致連接埠衝突。
Redis應用中使用NetACC
NetACC在Redis應用中的作用
提升系統吞吐能力
NetACC適用於處理每秒需要處理大量資料包的情境,在Redis處理大量請求時,可以降低CPU開銷並提升系統輸送量。
提升網路響應速度
對於需要快速網路響應的Redis應用,NetACC利用eRDMA提供的低時延特性,可以顯著提升網路響應速度。
Redis效能基準測試中使用NetACC
redis-benchmark
是Redis內建的一個效能測試工具,它可以類比多個用戶端同時對Redis發送請求,以此來評估Redis伺服器在不同負載下的效能表現。
測試情境
在redis-benchmark
中使用NetACC,類比100個clients,4個threads,迴圈5000000次set操作。
準備工作
購買兩台支援eRDMA的執行個體,勾選自動安裝eRDMA驅動,並且在主網卡開啟eRDMA網路介面。兩台ECS執行個體分別作為Redis的服務端和用戶端。
本樣本參數如下所示:
鏡像:均為Alibaba Cloud Linux 3
執行個體規格:均為ecs.g8ae.4xlarge
執行個體主網卡的私網IP地址:Server端(172.17.0.90)、Client端(172.17.0.91)。在以下測試中,您需要根據實際情況替換IP地址。
說明本文以在執行個體的主網卡上開啟eRDMA網路介面為例進行測試,那麼這裡的172.17.0.90即Redis服務端所在ECS執行個體的主網卡的私網IP地址。
如果您是通過輔助彈性網卡上開啟eRDMA網路介面進行測試,那麼這裡的IP地址,需要改為您實際的輔助彈性網卡的私網IP地址。更多資訊,請參見為ECS執行個體綁定ERI。
具體操作
分別遠端連線Server端和Client端的ECS執行個體。
具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體。
確認兩台ECS執行個體的eRDMA驅動安裝完成。
在執行個體啟動後,您可以通過
ibv_devinfo
命令確認已安裝完畢:如果正確安裝完成後,命令返回如下所示:
如果尚未完成安裝,命令返回如下所示(eRDMA相關驅動程式的安裝可能需要幾分鐘,您可以稍後再嘗試):
在兩台ECS執行個體上分別執行以下命令安裝Redis。
sudo yum install -y redis
安裝完成後,返回資訊如下所示:
通過
redis-benchmark
進行Redis效能的基準測試。使用NetACC加速測試
在Server端的ECS執行個體上,執行以下命令,以NetACC加速的方式啟動Redis服務:
netacc_run redis-server --port 6379 --protected-mode no
說明您需要替換對應的6379為您實際啟動Redis服務的連接埠號碼,詳見redis-server常用命令參數說明。
本測試以
netacc_run
命令方式加速,關於更多使用NetACC方式,請參見使用NetACC。
正確啟動後,返回如下所示:
在Client端的ECS執行個體上,執行以下命令,開啟Redis基準測試:
netacc_run redis-benchmark -h 172.17.0.90 -p 6379 -c 100 -n 5000000 -r 10000 --threads 4 -d 512 -t set
說明您需要替換對應的172.17.0.90和6379為您實際啟動Redis服務的伺服器的IP地址和連接埠號碼,詳見redis-benchmark常用命令參數說明。
不同的網路環境下測試結果不同,本文測試資料僅供參考,具體執行結果以您的實際環境為準。
可以看到最下面的Summary資訊,最後列印的是77萬左右的rps。關於指標詳細說明,詳見redis-benchmark常用測試結果指標說明。
未使用NetACC加速測試
在Server端的ECS執行個體上,執行以下命令,啟動Redis服務:
redis-server --port 6379 --protected-mode no --save
說明您需要替換對應的6379為您實際啟動Redis服務的連接埠號碼,詳見redis-server常用命令參數說明。
正確啟動後,返回如下所示:
在Client端的ECS執行個體上,執行以下命令,開啟Redis基準測試:
redis-benchmark -h 172.17.0.90 -c 100 -n 5000000 -r 10000 --threads 4 -d 512 -t set
說明您需要替換對應的172.17.0.90和6379為您實際啟動Redis服務的伺服器的IP地址和連接埠號碼, 詳見redis-benchmark常用命令參數說明。
不同的網路環境下測試結果不同,本文測試資料僅供參考,具體執行結果以您的實際環境為準。
可以看到最下面的Summary資訊,最後列印的是33萬左右的rps。關於指標詳細說明,詳見redis-benchmark常用測試結果指標說明。