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收发数据。
- 本页导读 (1)