全部產品
Search
文件中心

Elastic Compute Service:NetACC使用說明

更新時間:Jun 19, 2024

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相同。

  1. 分別遠端連線Server端和Client端的ECS執行個體。

    具體操作,請參見通過密碼或密鑰認證登入Linux執行個體

  2. 分別在Server端和Client端的ECS執行個體上執行以下命令,安裝NetACC。

    sudo curl -fsSL https://netacc-release.oss-cn-hangzhou.aliyuncs.com/release/netacc_download_install.sh | sudo sh
  3. 本文以Redis為例示範NetACC的加速效果,在Server端和Client端的ECS執行個體上分別執行以下命令安裝Redis。

    sudo yum install redis*
  4. 在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

    啟動效果如下:

    image..png

  5. 在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_run命令的協助資訊

Usage: netacc_run [ OPTIONS ] COMMAND

Run COMMAND using NetACC for TCP sockets

OPTIONS:
   -f <path>   set config file, default /etc/netacc.conf
   -p <num>    set max connections per QP, default 1
   -t <num>    set netacc io threads, default 4
   -s <num>    set netacc message size, default 16384
   -F <num>    fast connect mode, default 0
   -d          enable debug mode
   -T          use TCP first in connect
   -P <num>    polling cq time ms
   -A <str>    affinity CPU list, 0 | 1-3 | 1,3,4
   -i <num>    set cq comp_vector, default 0
   -h          display this message
   -v          display version info

另外,安裝NetACC後預設設定檔是/etc/netacc.conf。其效果和設定netacc_run參數相同,netacc_run設定的參數會覆蓋設定檔中的參數。預設設定檔樣本如下:

/etc/netacc.conf檔案樣本

[netacc]
# 一個buffer的size,一般發送資料區塊較大時適當調大這個參數可以提高效能;調小可以節省記憶體。
# int
NACC_SOR_MSG_SIZE=16384

# rdma首次註冊的mr大小,調小可以節省記憶體
#   NACC_SOR_MSG_SIZE的2的N次冪倍,最小為1倍
NACC_RDMA_MR_MIN_INC_SIZE=16384

# rdma最大單次註冊的mr大小(1MB ~ 512MB),調小可以節省記憶體
#   NACC_RDMA_MR_MIN_INC_SIZE的2的N次冪倍,最小為1倍,最大為512M
NACC_RDMA_MR_MAX_INC_SIZE=8388608

# 單個QP承載的連結數,適當調大可以最佳化效能;特殊情境只能調成1
# int
NACC_SOR_CONN_PER_QP=1

# netacc的線程數,如果吞吐較大可以適當增加
# int
NACC_SOR_IO_THREADS=1

# 空QP淘汰時間,單位ms,0代表立即淘汰,-1代表不會淘汰
NACC_EMPTY_QP_EXPIRE_MS=60000

# 允許存在的空QP總數
NACC_EMPTY_QP_MAX_ALL=100

# 每個目的地址允許存在的空QP總數
NACC_EMPTY_QP_MAX_PER=10

# connect使用rdma建連的機率,0 ~ 100
NACC_CONNECT_RDMA_PERCENT=100

# 是否預設開啟RDMA
NACC_ENABLE_RDMA_DEFAULT=1

# 記錄層級
# 0: TRACE
# 1: DEBUG
# 2: INFO
# 3: WARN
# 4: ERROR
# 5: FATAL
NACC_LOG_LEVEL=3

# 日誌路徑
NACC_LOG_PATH="/tmp/netacc.log"

# 下面是不常用或者不需要設定的參數

# 線程親和性設定
# string
NACC_SOR_AFFINITY=""

# 是否優先使用TCP建立連結
# bool
NACC_CONN_TCP_FIRST=0

NetACC監控

netacc_ss是NetACC中內建的監控工具,您可以執行netacc_ss -h命令監控NetACC收發資料的狀態。命令說明如下:

netacc_ss命令的協助資訊

netacc_ss -h
Usage:
 netacc_ss: [-p] <pid> [options]...
 Show monitoring information of specified netacc process

Options:
 -c   clear unused sock file
 -h   display this help
 -s   display specified monitoring metric[s]. [all|cfg|cnt|mem|qp|sock]
      all: all monitoring information
      cfg: configuration information
      cnt: counter information[default]
      mem: memory information
      qp : queue pair information
      sock: socket information
 -v   display netacc version

Examples:
 netacc_ss -p 12345 -s mem,cnt

使用NetACC監控命令如下:

netacc_ss -s sock -p <進程ID>
說明
  • 您可以通過ps -ef | grep <進程名稱>命令查詢進程ID,本文樣本的進程名稱為redis-server

  • 在Server端和Client端均可以執行該命令進行監測。

Server端執行該命令的返回結果樣本如下圖所示。其中所有sock串連都是RDMA串連,TCP串連不展示。最右側4列是收發的資料量,大於0則代表已經在使用eRDMA收發資料。

image..png