文档

NetACC使用说明

更新时间:

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

  • 本页导读 (1)
文档反馈