對於對網路通訊效能要求高、需要低延遲和高輸送量的TCP應用,如果需要使用eRDMA加速網路通訊,可以通過NetACC,無需修改應用代碼即可適配eRDMA。本文為您介紹NetACC及其使用方法。
NetACC當前處於公測階段。
NetACC簡介
NetACC(Network Accelerator)是一個使用者態網路加速庫,利用eRDMA的低時延、高吞吐等優勢,通過相容socket介面,實現對現有TCP應用的加速。
適用情境
NetACC適用於網路開銷較大的情境:
高PPS(Packets per Second)情境:尤其是大量收發小包的情境。使用NetACC可以降低CPU開銷,提升系統吞吐能力,例如在Redis處理請求的情境中。
對網路時延敏感的情境:eRDMA的網路時延比TCP更低,可以提升網路響應速度。
反覆建立短串連的情境:NetACC可以最佳化二次串連的速度,加快連線速度,提升系統效能。
安裝NetACC
安裝方式
通過eRDMA驅動安裝
安裝eRDMA驅動時候,NetACC也會一併安裝。關於eRDMA驅動的安裝,請參見為已有執行個體配置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
,您可以在設定檔中配置NetACC的使用參數,如線程數、日誌路徑等。設定檔樣本如下:
使用NetACC
您可以通過netacc_run
命令或者設定環境變數LD_PRELOAD
的方式在應用中整合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。
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地址。更多資訊,請參見建立新執行個體時配置eRDMA。
具體操作
分別遠端連線Server端和Client端的ECS執行個體。
具體操作,請參見通過密碼或密鑰認證登入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常用測試結果指標說明。