使用弹性eRDMA可以获得超低的延迟,更快地处理请求。本文介绍如何基于eRDMA部署共享内存通信SMC(Shared Memory Communication)和Redis,然后基于SMC测试Redis处理请求的能力。
背景信息
共享内存通信SMC是一种兼容socket层、使用共享内存技术实现的高性能内核网络协议栈。根据共享内存技术的不同,SMC又可以细分为基于Internal Shared Memory(ISM)技术的SMC over DMA(SMC-D)和基于Remote Direct Memory Access(RDMA)技术的SMC over RDMA(SMC-R)。详细信息,请参见共享内存通信(SMC)适用性说明。
目前Alibaba Cloud Linux 3基于弹性RDMA(eRDMA)提供SMC-R加速能力,在阿里云上使用SMC-R需要创建支持eRDMA的ECS实例,以获得云上弹性RDMA(eRDMA)能力。
准备工作
购买两台支持eRDMA的实例,勾选自动安装eRDMA驱动,并且在主网卡开启eRDMA网络接口。两台ECS实例分别作为服务端和客户端。具体操作,请参见自定义购买实例。
本示例参数如下所示:
规格:ecs.g8i.8xlarge
镜像:Alibaba Cloud Linux 3.2104 LTS 64位
网络:两台实例属于同一安全组,默认内网互通
实例主网卡的私网IP地址:Server端(192.168.0.25)、Client端(192.168.0.24)。您需要根据实际情况替换IP地址。
说明本文以在实例的主网卡上开启eRDMA网络接口为例进行测试,那么这里的192.168.0.25即服务端所在ECS实例的主网卡的私网IP地址。
如果您是通过辅助弹性网卡上开启eRDMA网络接口进行测试,那么这里的IP地址,需要改为您实际的辅助弹性网卡的私网IP地址。更多信息,请参见步骤三:为ECS实例绑定ERI。
步骤一:部署SMC
分别远程连接Server端和Client端的ECS实例。
具体操作,请参见使用Workbench登录Linux实例。
分别在两台ECS实例上执行以下命令,部署SMC-R模块。
modprobe smc && modinfo smc分别在两台实例上执行以下命令,关闭本机的IPv6模式,确保ERI下可以正常创建eRDMA连接。
重要阿里云eRDMA设备与SMC目前均不支持使用IPv6地址。如果应用层使用IPv6地址,会导致SMC回退到TCP协议栈。更多信息,请参见启用SMC后使用IPv6地址出现回退。
自
ANCK 5.10.134-17.3版本开始,SMC支持使用IPv4-mapped IPv6地址。
sysctl net.ipv6.conf.all.disable_ipv6=1分别在两台实例上执行以下命令,打开SMC eRDMA开关,使流量优先走eRDMA。
此后新创建的TCP socket将被转变为SMC socket,而存量的TCP socket不受影响。
sysctl net.smc.tcp2smc=1分别在两台实例上执行以下命令,安装SMC的监控诊断工具集smc-tools。
smc-tools是IBM开发的SMC-R监控诊断工具,为您提供了多个维度的SMC-R跟踪诊断,主要包括:
smcr:提供SMC-R相关资源统计信息。
smcss:提供SMC socket相关信息。
yum install -y smc-tools安装完成后,可以执行
smcss -a命令查看当前的流量路径。[root@iZxxx]# smcss -a State UID Inode Local Address Peer Address Intf Mode ACTIVE 00000 4257589 192.168.8.123:45058 192.168.8.126:20003 0000 SMCR ACTIVE 00000 4264206 192.168.8.123:20004 192.168.8.130:54626 0000 SMCR ACTIVE 00000 4264207 192.168.8.123:20004 192.168.8.136:54900 0000 SMCR ACTIVE 00000 4308684 192.168.8.123:20004 192.168.8.134:38578 0000 SMCR ACTIVE 00000 4308694 192.168.8.123:20004 192.168.8.126:60554 0000 SMCR ACTIVE 00000 4308692 192.168.8.123:20004 192.168.8.126:60568 0000 SMCR ACTIVE 00000 4261731 192.168.8.123:49490 192.168.8.122:20004 0000 SMCR ACTIVE 00000 4257634 192.168.8.123:49500 192.168.8.122:20004 0000 SMCR ACTIVE 00000 4257638 192.168.8.123:42866 192.168.8.129:20003 0000 SMCR ACTIVE 00000 4264236 192.168.8.123:53768 192.168.8.135:20003 0000 SMCR ACTIVE 00000 4272479 192.168.8.123:34978 192.168.8.128:20003 0000 SMCR ACTIVE 00000 4277256 192.168.8.123:42840 192.168.8.127:20003 0000 SMCR LISTEN 00000 4253132 0.0.0.0:38567
步骤二:部署Redis
在ECS实例上部署SMC后,您需要继续在实例上部署Redis。
分别远程连接Server端和Client端的ECS实例。
具体操作,请参见使用Workbench登录Linux实例。
执行以下命令,分别为两台实例安装Redis。
sudo yum install -y redis在Server端实例上执行以下命令,启动Redis服务端。
redis-server --bind 192.168.0.25 --port 6379 --protected-mode no --save说明192.168.0.25为Server端实例主网卡的主私有IP,6379为需要监听的端口,请您在自行测试时按实际情况替换。
[root@xxx Z ~]# redis-server --bind 192.168.0.25 --port 6379 --protected-mode no --save 69313:C 23 Apr 2025 15:14:05.302 # o000o000o000o Redis is starting o000o000o000o 69313:C 23 Apr 2025 15:14:05.302 # Redis version=6.2.17, bits=64, commit=00000000, modified=0, pid=69313, just started 69313:C 23 Apr 2025 15:14:05.302 # Configuration loaded 69313:M 23 Apr 2025 15:14:05.302 * monotonic clock: POSIX clock_gettime Redis 6.2.17 (00000000/0) 64 bit Running in standalone mode Port: 6379 PID: 69313 https://redis.io 69313:M 23 Apr 2025 15:14:05.303 # Server initialized 69313:M 23 Apr 2025 15:14:05.303 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 69313:M 23 Apr 2025 15:14:05.303 * Ready to accept connections在Redis客户端上连接和测试。
执行以下命令,连接Redis服务端。
redis-cli -h 192.168.0.25 -p 6379执行以下命令,使用redis-benchmark进行压测。
以下命令模拟从100个客户端向服务端发送1,000,000次SET命令的请求:
redis-benchmark -h 192.168.0.25 -p 6379 -n 1000000 -t set -c 100
您也可以在打开SMC-R后,启动多个压测进程进行混合压测,参考以上步骤再部署1个Redis客户端,在2个Redis客户端上分别启动多个压测进程,然后在Redis服务端上查看每秒的操作次数OPS(Operation Per Second)。
在Redis客户端上同时启动8个SET压测进程的示例命令:
redis-benchmark -h 192.168.0.25 -p 6379 -n 100000000 -t set --threads 8 -c 100在Redis客户端上同时启动8个GET压测进程的示例命令:
redis-benchmark -h 192.168.0.25 -p 6379 -n 1000000 -t get --threads 8 -c 100在Redis服务端上查看OPS的示例命令:
redis-cli -h 192.168.0.25 -p 6379 info | grep instantaneous_ops_per_sec说明请新打开一个远程连接窗口,然后输入查看命令。

