NetACC(Network Accelerator)是一個使用者態網路加速庫,可以通過LD_PRELOAD的方式載入使用,無需修改應用代碼。NetACC利用eRDMA的低時延、高吞吐、核心旁路、協議棧卸載等優勢,通過相容socket介面,實現對現有TCP應用的加速效果。本文為您介紹NetACC的功能、應用情境以及如何使用NetACC。
NetACC當前處於公測階段。
應用情境
NetACC適用於網路開銷較大的情境:
高PPS(Packets per Second)情境:尤其是大量收發小包的情境。使用NetACC可以降低CPU開銷,提升系統吞吐能力,例如在Redis處理請求的情境中。
對網路時延敏感的情境:eRDMA的網路時延比TCP更低,可以提升網路響應速度。
反覆建立短串連的情境:NetACC可以最佳化二次建連的速度,加快連線速度,提升系統效能。
操作步驟
準備工作
準備兩台支援eRDMA能力的ECS執行個體,分別作為Server端和Client端。本樣本的兩台ECS執行個體配置如下,實際測試以您實際環境為準:
鏡像:均為Alibaba Cloud Linux 3
執行個體規格:均為ecs.g8i.xlarge
執行個體主網卡的私人IP地址:Server端(172.16.52.67)、Client端(172.16.52.69)
具體操作,請參見在企業級執行個體上配置eRDMA。NetACC支援的作業系統版本以及執行個體規格,請參見使用限制。
使用NetACC
本文提供使用NetACC前後的兩種使用方式,對比兩種方式的效能差異,使用NetACC會起到明顯的加速效果。
TCP方式:未使用NetACC加速的預設,以TCP方式進行網路通訊。
通過NetACC使用eRDMA的方式:以eRDMA方式進行網路通訊。使用NetACC會有加速效果,比TCP的效能更好。通過設定環境變數也可以使用NetACC,效果和使用netacc_run相同。
分別遠端連線Server端和Client端的ECS執行個體。
具體操作,請參見通過密碼或密鑰認證登入Linux執行個體。
分別在Server端和Client端的ECS執行個體上執行以下命令,安裝NetACC。
sudo curl -fsSL https://netacc-release.oss-cn-hangzhou.aliyuncs.com/release/netacc_download_install.sh | sudo sh
本文以Redis為例示範NetACC的加速效果,在Server端和Client端的ECS執行個體上分別執行以下命令安裝Redis。
sudo yum install redis*
在Server端的ECS執行個體上執行以下命令,啟動應用的進程(本文以啟動Redis應用的進程
redis-server
為例)。說明命令中以下資訊僅為樣本,請您在操作時按實際環境替換:
Server端ECS執行個體主網卡的私人IP地址:172.16.52.67
監聽連接埠:6389(通過
sudo grep "^port" /<redis.conf檔案路徑>/redis.conf
命令查詢)
TCP方式
執行以下命令,啟動
redis-server
進程。redis-server --bind <Server端ECS執行個體主網卡的私人IP地址> --port <監聽連接埠> --protected-mode no --save
樣本命令:
redis-server --bind 172.16.52.67 --port 6389 --protected-mode no --save
通過NetACC使用eRDMA的方式
您可以使用netacc_run工具的方式,通過設定
-t
、-p
兩個參數啟動redis-server
進程。netacc_run -t <IO線程數> -p <QP複用數> redis-server --bind <Server端ECS執行個體主網卡的私人IP地址> --port <監聽連接埠> --protected-mode no --save
設定
-t
、-p
兩個參數值會影響NetACC的效能,不設定也可以。-t
:設定IO線程數,可能會影響NetACC的效能,一般設定成1或4。-p
:設定隊列數QP(QueuePair)複用的數量,複用QP可能會導致源連接埠號碼重複。設定成32代表最多32個連結複用一個QP,設定成1代表不複用QP。
有關netacc_run更多參數說明,請參見NetACC參數說明。
樣本命令:
netacc_run -t 1 -p 32 redis-server --bind 172.16.52.67 --port 6389 --protected-mode no --save
您也可以通過設定環境變數LD_PRELOAD的方式啟動
redis-server
進程。LD_PRELOAD=/usr/lib64/libnetacc-preload.so redis-server --bind <Server端ECS執行個體主網卡的私人IP地址> --port <監聽連接埠> --protected-mode no --save
樣本命令:
LD_PRELOAD=/usr/lib64/libnetacc-preload.so redis-server --bind 172.16.52.67 --port 6389 --protected-mode no --save
啟動效果如下:
在Client端的ECS執行個體上執行以下命令,測試連接和訪問Server端。
說明命令中以下資訊僅為樣本,請您在操作時按實際環境替換:
Server端ECS執行個體主網卡的私人IP地址:172.16.52.67
監聽連接埠:與Server端的相同,6389
測試情境:類比100個用戶端即100個串連向Server端同時發送100,000,000次SET命令的請求
TCP方式
執行以下命令,使用redis-benchmark進行壓測。
redis-benchmark -h <Server端ECS執行個體主網卡的私人IP地址> -p <監聽連接埠> -n 100000000 -t set --threads 8 -c 100
樣本命令:
redis-benchmark -h 172.16.52.67 -p 6389 -n 100000000 -t set --threads 8 -c 100
通過NetACC使用eRDMA的方式
您可以使用netacc_run工具的方式,使用redis-benchmark進行壓測。
netacc_run -t 4 -p 32 redis-benchmark -h <Server端ECS執行個體主網卡的私人IP地址> -p <監聽連接埠> -n 100000000 -t set --threads 8 -c 100
樣本命令:
netacc_run -t 4 -p 32 redis-benchmark -h 172.16.52.67 -p 6389 -n 100000000 -t set --threads 8 -c 100
您也可以通過設定環境變數LD_PRELOAD的方式進行壓測。
LD_PRELOAD=/usr/lib64/libnetacc-preload.so redis-benchmark -h <Server端ECS執行個體主網卡的私人IP地址> -p <監聽連接埠> -n 100000000 -t set --threads 8 -c 100
樣本命令:
LD_PRELOAD=/usr/lib64/libnetacc-preload.so redis-benchmark -h 172.16.52.67 -p 6389 -n 100000000 -t set --threads 8 -c 100
對比兩種方式的效能差異,可以看到使用NetACC起到了明顯的加速效果。
NetACC參數說明
您可以執行netacc_run -h
命令查看netacc_run命令的常用參數。命令說明如下:
另外,安裝NetACC後預設設定檔是/etc/netacc.conf
。其效果和設定netacc_run參數相同,netacc_run設定的參數會覆蓋設定檔中的參數。預設設定檔樣本如下:
NetACC監控
netacc_ss是NetACC中內建的監控工具,您可以執行netacc_ss -h
命令監控NetACC收發資料的狀態。命令說明如下:
使用NetACC監控命令如下:
netacc_ss -s sock -p <進程ID>
您可以通過
ps -ef | grep <進程名稱>
命令查詢進程ID,本文樣本的進程名稱為redis-server
。在Server端和Client端均可以執行該命令進行監測。
在Server端執行該命令的返回結果樣本如下圖所示。其中所有sock串連都是RDMA串連,TCP串連不展示。最右側4列是收發的資料量,大於0則代表已經在使用eRDMA收發資料。