共享内存通信(SMC)使用说明

更新时间:2025-03-06 08:51:39
重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文将介绍如何启用SMC,如何设置SMC加速范围以及如何配置SMC暴露出的各种接口以获得最佳的加速效果。

在阿里云ECS上使用SMC

Alibaba Cloud Linux 3提供并优化了SMC-R内核协议栈,您可以通过以下步骤使用SMC-R。

前期准备

  1. 创建支持ERIECS实例。

    SMC-R基于RDMA实现,在阿里云上使用SMC-R需要创建支持ERI功能的ECS实例,以获得云上弹性RDMA(eRDMA)能力。具体操作,请参见在企业级实例上使用eRDMA

    重要

    阿里云eRDMA设备与SMC目前均不支持使用IPv6地址。如果应用层使用IPv6地址,会导致SMC回退到TCP协议栈。

  2. 加载smcsmc_diag内核模块。

    sudo modprobe smc
    sudo modprobe smc_diag

    通过dmesg命令查看内核打印信息。如果看到如下信息,说明加载成功。

    smc: smc: load SMC module with reserve_mode
    NET: Registered protocol family 43
    smc: netns <netns ID> reserved ports [65500 ~ 65515] for eRDMA OOB
    smc: adding ib device erdma_0 with port count 1
    smc:    ib device erdma_0 port 1 has pnetid

    (可选)不再使用SMC后可通过下述方式卸载SMC模块。

    sudo rmmod smc_diag
    sudo rmmod smc
  3. 执行以下命令,安装smc-toolsaliyun-smc-extensions运维工具。

    sudo yum install -y smc-tools
    sudo yum install -y aliyun-smc-extensions

将应用程序的TCP socket运行于SMC协议栈

Alibaba Cloud Linux 3 SMC-R支持两个维度的socket协议透明转换。

net namespace维度socket协议转换

Alibaba Cloud Linux 3提供了net namespace维度的socket协议透明转换功能,可以通过sysctl net.smc.tcp2smc开关将net namespace中所有符合如下条件的TCP socket转换为SMC socket。

  • familyAF_INET

  • typeSOCK_STREAM

  • protocolIPPROTO_IP(0)或IPPROTO_TCP(6)

替换过程如下图所示。

image

net namespace维度开启透明转换的操作步骤如下。

  1. 执行以下命令,打开net namespace范围全局替换开关net.smc.tcp2smc

    此后新创建的TCP socket将被转变为SMC socket,而存量的TCP socket不受影响。

    sudo sysctl net.smc.tcp2smc=1

    默认情况下,sysctl net.smc.tcp2smc=0,处在禁用状态。

  2. 执行以下命令,在当前net namespace中运行任意TCP socket应用程序。

    示例中的foo需替换为具体程序名。

    ./<foo>

    此时foo应用程序创建的TCP socket将被透明替换为SMC socket,由SMC-R协议栈处理应用程序网络行为。如原理概述中所述,如果通信对端同样支持SMC-R协议并协商成功,则两端将基于RDMA网络完成数据传输,否则将安全回退使用TCP网络传输。

  3. (可选)执行以下命令,关闭net namespace范围全局替换开关。此后新创建的TCP socket不再被转换,而存量已被转换的SMC socket不受影响。

    sudo sysctl net.smc.tcp2smc=0

进程维度socket协议转换

Alibaba Cloud Linux 3还提供了进程维度的协议透明转换功能,该功能的使用基于SMC运维工具smc-tools

使用smc-tools工具中的脚本smc_run运行应用程序,smc_run通过环境变量LD_PRELOADsmc-tools工具集中的libsmc-preload.so定义为优先加载的动态库。libsmc-preload.so将把应用程序及其子进程中符合如下条件的TCP socket转换为SMC socket。

  • familyAF_INET

  • typeSOCK_STREAM

  • protocolIPPROTO_IP(0)或IPPROTO_TCP(6)

说明

smc_run使用LD_PRELOAD来拦截glibc中的socket()系统调用,因此对不使用glibc或是静态链接的应用无效。

替换过程如下图所示。

image

在进程维度开启透明转换的操作步骤如下。

执行以下命令,在应用程序foo执行命令前增加smc_run前缀。

示例中foo需替换为具体进程名。

smc_run ./<foo>

此时foo应用程序创建的TCP socket将被透明替换为SMC socket,由SMC-R协议栈处理应用程序网络行为。如原理概述中所述,如果通信对端同样支持SMC-R协议并协商成功,则两端将基于RDMA网络完成数据传输,否则将安全回退使用TCP网络传输。

基于BPF策略的SMC协商控制

在实际使用中,net namespace或进程维度的SMC使能有时粒度仍然过粗。例如,服务端在net namespace中有多个网络监听端口,希望仅针对有性能加速诉求的端口上的连接使用SMC,对其余如管控端口上的连接安全回退到使用TCP通信。

为此,Alibaba Cloud Linux 3在上述维度开启SMC透明转换的基础上,支持进一步使用BPF技术控制连接是否使用SMC协商。典型流程为:

  1. 使能和配置BPF策略,设置细粒度的SMC协商控制。

  2. 开启net namespace或进程维度的SMC使能。具体操作,可参见将应用程序的TCP socket运行于SMC协议栈

原理概述中所述,通信双方在TCP连接握手过程中使用特殊的TCP选项标明自身支持SMC-R,并确认对端是否同样支持SMC-R。一旦协商成功,后续通信双方的网络传输将基于RDMA网络完成,否则将安全回退到使用TCP网络传输。

默认情况下,SMC socket总是会发起和响应这个特殊的TCP选项。但是可以通过BPF技术进一步基于端口或IPv4地址的策略来控制是否发起或响应这个特殊的TCP选项,从而实现更细粒度的SMC使能控制。

为此,Alibaba Cloud Linux 3smc-tools中提供smc-ebpf工具来实现BPF策略的使能和配置。

执行下列命令,查看smc-ebpf是否安装成功。

smc-ebpf policy help

结果如下所示,说明smc-ebpf安装成功。

smc-ebpf policy help
 Usage: smc-ebpf policy COMMAND [OPTIONS]
        smc-ebpf policy load [OPTIONS]    load policy
    --init                                load policy with pre-defination config
        smc-ebpf policy stop              stop policy
        smc-ebpf policy unload            unload policy
        smc-ebpf policy init              init policy with default config
        smc-ebpf policy clear             clear all policy config
        smc-ebpf policy dump              display all policy config
        smc-ebpf policy config [OPTIONS]  config policy
        smc-ebpf policy delete [OPTIONS]  delete policy
    --ip [IPv4]                           target IPv4 address
    --port                                target port
    --mode [auto|disable|enable]          target mode
 Examples:
    smc-ebpf policy load
    #disable port 80 to use smc
    smc-ebpf policy config --port 80 --mode disable
    #delete ip xxx.xxx.x.x/24 policy
    smc-ebpf policy delete --ip xxx.xxx.x.x --mask 24

加载smc-ebpf

执行下列命令,加载smc-ebpf

sudo smc-ebpf policy load
警告
  • smc-ebpf需要在待配置的连接创建前完成加载,即smc-ebpf对在其加载前创建的连接无效。

  • smc-ebpf配置的策略是系统全局的,无法针对特定的netns(容器)进行独立配置。

  • smc-ebpf相关功能仍在持续推进上游社区标准化中,未来存在接口的变动的可能,目前仅作为实验性功能。

  • 结果如下所示,表示加载成功。

    # sudo smc-ebpf policy load
    Registered smc_sock_negotiator_ops anolis_smc id xxx
  • 否则,在当前环境中无法使用这项功能。原因排查方向包括:

    • 确认操作系统内核版本在ANCK 5.10.134-016及以上。您可以通过uname -r命令查看内核版本。

    • 确认您有权限加载BPF程序,一个常见的原因可能是您使用的POD容器没有加载BPF程序的能力或者您的用户特权等级不足,您可以向您环境的提供商咨询更多信息。

端口策略默认行为

smc-ebpf加载后,若没有任何端口策略匹配目标端口时,默认禁止目标端口使用SMC协商。

例如:

  • smc-ebpf加载后未配置任何端口策略,那么所有端口都被禁止使用SMC协商;

  • smc-ebpf加载后仅配置一条允许80端口使用SMC协商的策略。那么使用8080端口时,由于没有任何策略匹配到8080端口,则禁止8080端口使用SMC协商;

特别地,您可以通过执行以下命令,将端口0配置为enable来修改默认行为到:在没有任何端口策略匹配目标端口时,允许目标端口使用SMC协商。

sudo smc-ebpf policy config --port 0 --mode enable

同样地,您可以通过执行以下命令,将端口0配置为disable来再次改变默认行为到:在没有任何端口策略匹配目标端口时,禁止目标端口使用SMC协商。

sudo smc-ebpf policy config --port 0 --mode disable

配置基于端口的策略

在默认行为的基础上,可添加针对特定端口的策略。

例如:

  • 示例一:只允许80端口使用SMC协商,其他端口均禁止使用SMC协商。

    执行以下命令,添加允许80端口使用SMC协商的策略。

    sudo smc-ebpf policy config --port 80 --mode enable

    执行以下命令,查看端口策略配置结果。

    sudo smc-ebpf policy dump

    输出结果示例:

    • "key": 80代表策略针对端口80。

    • "mode": 代表禁止或允许使用SMC协商,2代表允许,0代表禁止。

    # sudo smc-ebpf policy dump
    [{
            "key": 80,
            "value": {
                "mode": 2,
                [其余字段普通使用者无需关注]
            }
        }
    ]

    若不再需要此策略,执行以下命令,删除上述针对80端口的策略。

    sudo smc-ebpf policy delete --port 80

    再次执行dump命令,结果如下所示,说明配置被成功删除。

    # sudo smc-ebpf policy dump
    []
  • 示例二:只禁止80端口使用SMC协商,其他端口均允许使用SMC协商。

    执行以下命令,修改默认行为到:在没有任何端口策略匹配目标端口时,允许目标端口使用SMC协商。并添加禁止80端口使用SMC协商的策略。

    sudo smc-ebpf policy config --port 0 --mode enable
    sudo smc-ebpf policy config --port 80 --mode disable

    此后只有80端口被禁止使用SMC协商,其他没有匹配策略的端口则被允许使用SMC协商。

IPv4地址策略默认行为

与端口策略不同的是,IPv4地址策略仅对Client socket有效,用于在Client socket连接Server时根据Server IPv4地址控制Client是否使用SMC协商。

说明

所有配置的端口和IPv4地址策略共同组成“与”逻辑,即连接匹配的所有策略均允许使用SMC协商时才会使用SMC协商,任意匹配条件禁止使用SMC协商时均不会使用SMC协商。

smc-ebpf加载后,若没有任何IPv4地址策略匹配目标Server IP时,默认允许对目标Server IP使用SMC协商。

例如:

  • smc-ebpf加载后未配置任何IPv4地址策略,那么Client socket连接所有Server IP时都被允许使用SMC协商;

  • smc-ebpf加载后仅配置一条禁止在访问192.168.1.0/24时使用SMC协商的策略。那么在访问192.168.3.11时,由于没有任何策略匹配到192.168.3.11,则允许在访问192.168.3.11时使用SMC协商;

特别地,您可以通过执行以下命令,将0.0.0.0/32配置为disable来修改默认行为到:在没有任何IPv4地址策略匹配目标Server IP时,禁止对目标Server IP使用SMC协商。

sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode disable

同样地,您可以通过执行以下命令,将0.0.0.0/32配置为enable来恢复默认行为到:在没有任何IPv4地址策略匹配目标Server IP时,允许对目标Server IP使用SMC协商。

sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode enable

配置基于IPv4地址的策略

在默认行为的基础上,可配置针对IPv4地址的策略,用于在Client socket连接特定Server IP时控制Client是否使用SMC协商。

说明

设置的IPv4地址过滤规则只针对Client socket连接Server IPv4地址时控制Client是否使用SMC协商。Server socket是否使用SMC协商不受IPv4地址过滤规则的影响。

例如:

  • 示例一:只允许Client在连接192.168.2.0/24时使用SMC协商,访问其他服务端时均禁止使用SMC协商。

    执行以下指令,将0.0.0.0/32配置为disable来修改默认行为到:在没有任何IPv4地址策略匹配目标Server IP时,禁止对目标Server IP使用SMC协商。并添加允许对192.168.2.0/24服务端地址使用SMC协商的策略。

    sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode disable
    sudo smc-ebpf policy config --ip 192.168.2.0 --mask 24 --mode enable

    执行以下指令,查看IPv4策略设置结果。

    sudo smc-ebpf policy dump

    输出结果示例:

    • key:代表策略针对的IPv4地址;

    • value:代表禁止或允许使用SMC协商,pass代表允许,denied代表禁止。

    # sudo smc-ebpf policy dump
    key:     0.0.0.0/32           value:   "denied"
    key:     192.168.2.0/24       value:   "pass"

    若不再需要上述IPv4地址策略,执行以下命令,删除针对0.0.0.0/32192.168.2.0/24的策略。

    sudo smc-ebpf policy delete --ip 192.168.2.0 --mask 24
    sudo smc-ebpf policy delete --ip 0.0.0.0 --mask 32
  • 示例二:只禁止Client在连接192.168.2.0/24时使用SMC协商,访问其他服务端时均允许使用SMC协商。

    执行以下指令,添加禁止对192.168.2.0/24服务端地址使用SMC协商的策略。

    sudo smc-ebpf policy config --ip 192.168.2.0 --mask 24 --mode disable

    无需其他操作,因为smc-ebpf加载后,若没有任何IPv4地址策略匹配目标Server IP时,默认允许对目标Server IP使用SMC协商。所以除192.168.2.0/24以外的服务端地址均允许使用SMC协商。

清除策略

执行以下命令,清除所有配置的策略。

sudo smc-ebpf policy clear

执行后所有配置将会被删除,此时默认行为将恢复到:禁止协商SMC,即针对所有端口均禁止使用SMC协商,针对所有IPv4地址均允许使用SMC协商,两类策略共同组成“与”逻辑,最终禁止所有连接使用SMC协商。

在阿里云ACK上使用SMC

在阿里云容器服务ACK中,可以通过ACK eRDMA Controller组件启用SMC。eRDMA Controller提供了eRDMA网卡的管理、调度以及Pod的网络能力。具体操作,请参见使用SMC-R透明加速应用网络

说明

在阿里云ECS上使用SMC类似,在阿里云ACK上使用SMC同样可以在Node上配置基于BPFSMC细粒度使能策略。

参数配置说明

SMC协议栈通过sysfs及用户态工具smc-tools等方式提供多种配置接口,以下将介绍SMC的可配置功能。

通过sysfs配置参数

内核参数

参数说明

内核版本限制

配置建议

内核参数

参数说明

内核版本限制

配置建议

net.smc.autocorking_size

SMC-R提供autocork特性,功能上与TCP autocork类似,将多个小数据包聚合成更大的数据包一次性发送,在不影响乒乓时延性能的前提下,提高小包场景下的吞吐性能。

autocorking_size用于配置聚合数据包的上限大小。

默认值:65535。

有效值:0~4294967295,0表示关闭。

内核5.10.112-11及以上版本。

在小包且注重带宽的场景中,可调整此参数至合适的数值,以实现最佳的带宽效果。

pipeline收发且注重时延场景中,可以将此配置设置为0,以避免autocork对流水线处理造成滞后。

net.smc.autosplit_size

SMC提供autosplit特性,将一个大数据包拆分成多个小数据包分批发送,以提高大包场景下的时延性能。当数据包大小超过autosplit_size1.3倍时,将被拆分。

默认值:131072。

有效值:32768~536870912。

内核:

  • 5.10.134-18及以上版本。

  • 5.10.134-17.3及以上的17系列版本。

  • 5.10.134-16.5及以上的16系列版本。

在大包且注重时延的场景中,可以适当调整此参数,以达到最佳的时延效果。

net.smc.experiment_vendor_options

阿里云实验特性选项。

默认值:4294967295(0xFFFFFFFF)。

内核5.10.134-16及以上版本。

不建议修改。

net.smc.global_mem

SMC整机内存水位控制,当SMC协议栈所维持的收发缓冲区大小大于等于global_mem[2]后,所有新建的SMC连接都将回退到TCP。

默认值:[25%整机内存,50%整机内存,75%整机内存]。

内核:

  • 5.10.134-18及以上版本。

  • 5.10.134-17.3及以上的17系列版本。

  • 5.10.134-16.5及以上的16系列版本。

可根据期望的内存水位配置global_mem[2]

net.smc.limit_smc_hs

控制是否在建连压力大时主动回退到TCP。

默认值:1。

有效值:

  • 0:关闭

  • 1:开启

内核:

  • 5.10.134-18及以上版本。

  • 5.10.134-17.3及以上的17系列版本。

  • 5.10.134-16.5及以上的16系列版本。

建议设置为1,开启。

在特定情况下,如不希望SMC协议栈根据连接压力自动回退,可将其设置为0。

net.smc.mem

SMC在当前net namespace内存水位控制,当net namespace中所有SMC连接所使用的收发缓冲区大小大于等于mem[2]后,所有此net namespace内新建的SMC连接都将回退到TCP。

默认值:[25%整机内存,50%整机内存,75%整机内存]。

内核:

  • 5.10.134-18及以上版本。

  • 5.10.134-17.3及以上的17系列版本。

  • 5.10.134-16.5及以上的16系列版本。

可根据期望的内存水位配置mem[2]

net.smc.rmem

SMC socket默认接收缓冲区大小。没有使用setsockopt()主动设置接收缓冲区(SO_RCVBUF)大小时,将使用此值。

默认值:262144。

有效值:

  • SMC-R:16384(16K)~536870912(512M)

  • SMC-D:16384(16K)~1048576(1M)

内核5.10.134-14及以上版本。

  • 当本侧监控指标Rx/Buffer full占比较高时,应适当增大本地接收缓冲区大小。

  • 当本侧监控指标Tx/Buffer full(remote)Tx/Buffer too small(remote)的占比较高时,应适当增加对端接收缓冲区的大小。

  • 当内存资源紧张,且减少缓冲区大小不会影响网络性能时可适当减少缓冲区大小。

具体内容,请参见协议栈监控

net.smc.wmem

SMC socket默认发送缓冲区大小。没有使用setsockopt()主动设置发送缓冲区(SO_SNDBUF)大小时,将使用此值。

默认值:262144。

有效值:

  • SMC-R:16384(16K)~536870912(512M)

  • SMC-D:16384(16K)~1048576(1M)

内核5.10.134-14及以上版本。

  • 当本侧监控指标Tx/Buffer fullTx/Buffer too small占比较高时,应适当增加本地发送缓冲区大小。

  • 当内存资源紧张,且减少缓冲区大小不会影响网络性能时可适当减少缓冲区大小。

具体内容,请参见协议栈监控

net.smc.smcr_buf_type

SMC-R的收发缓冲区内存类型。使用物理连续内存能够拥有更优性能,但是通常物理连续内存难以获得,可能会导致缓冲区降级到比预期小。相反,虚拟连续内存较易获取,但性能会稍逊。

修改此值后,将在新创建的LGR所承载的SMC连接上生效,已有的LGR不受影响。

默认值:2。

有效值:

  • 0:物理连续内存。

  • 1:虚拟连续内存。

  • 2:优先使用物理连续内存,无法获取时使用虚拟连续内存。

内核5.10.134-12及以上版本。

不建议修改。

net.smc.smcr_max_conns_per_lgr

SMC-R中一个LGR能够承载的SMC连接数量上限。

默认值:32。

有效值:

  • 1~255(5.10.134-18及以上版本,5.10.134-17.3及以上的17系列版本,5.10.134-16.5及以上的16系列版本)。

  • 16~255(其他版本)。

内核5.10.134-16.1及以上版本。

谨慎修改。

  • 对于大吞吐场景,可以适当减少每个LGR所承载的SMC连接数量,以确保各个SMC连接能够获得更多的RDMA带宽。

  • 不建议增大该值。

net.smc.smcr_max_links_per_lgr

SMC-R中一个LGR包含的RDMA RC连接(SMC Link)数量。

默认值:1。

有效值:1~2。

内核5.10.134-16.1及以上版本。

不建议修改。

net.smc.smcr_testlink_time

SMC-RRDMA RC连接(SMC Link)的心跳包间隔时间(单位:秒)。当SMC Link上没有数据传输时,每隔smcr_testlink_time秒传输16字节数据确认链路可用。

默认值:30。

有效值:0~2147483647,0代表关闭心跳检查。

内核5.10.134-13及以上版本。

不建议修改。

net.smc.tcp2smc

当前net namespace范围内TCPSMC透明转换的开关。开启后此net namespace下新创建的TCP socket将在内核中被劫持,替换familyprotocol参数后成为SMC socket,运行于SMC协议栈。

默认值:0。

有效值:

  • 0:关闭net namespace SMC替换。

  • 1:打开net namespace SMC替换。

内核5.10.134-16及以后版本。

  • 设置为1开启net namespace维度TCPSMC透明替换。

  • 设置为0关闭net namespace维度TCPSMC透明替换。

配置EID参数

EID(Enterprise ID)是SMCv2协议中引入的概念,只有配置了相同EID的两个系统才能通过SMCv2通信,否则将回退到使用TCP通信。一个系统最多可以配置8EID。

image

Alibaba Cloud Linux 3eRDMA设备只允许配合SMCv2协议使用。Alibaba Cloud Linux 3系统初始配置了SMCV2-DEFAULT-UEID这一EID,因此初始状态下所有Alibaba Cloud Linux 3节点间均可以使用SMCv2配合eRDMA通信,无需额外手动配置。

若在特殊情况下需要通过修改EID控制通信范围,配置方式如下。

  1. 查看已有EID。

    smcr ueid show
  2. 添加新的EID。

    EID最多可包含32个字符,允许使用大写字母(A-Z)、数字(0-9)、连字符(-)以及点(.)。第一个字符必须为字母或数字,且点(.)不可连续使用。

    sudo smcr ueid add <EID>
  3. 删除已有EID。

    sudo smcr ueid del <EID>

实践案例:使用EID避免跨可用区的SMC-R通信

为了更好地发挥SMC-R的加速效果,推荐在同可用区内使用SMC-R加速,跨可用区仍使用TCP通信。通过将可用区ID添加为EID,实现在同可用区内使用SMC-R加速,跨可用区时自动回退到TCP通信。具体配置步骤如下。

  • 方式一:分步配置EID

    1. 执行以下命令,通过阿里云ECS实例元数据获取可用区ID。详细内容,请参考实例元数据

      ZONE_ID=$(curl -s -m 1 100.100.100.200/latest/meta-data/zone-id | tr "[:lower:]" "[:upper:]")
    2. 执行以下命令,将可用区ID添加为EID。

      sudo smcr ueid add $ZONE_ID
    3. 执行以下命令,删除默认的SMCV2-DEFAULT-UEID

      smcr ueid | grep SMCV2-DEFAULT-UEID > /dev/null && sudo smcr ueid del SMCV2-DEFAULT-UEID
  • 方式二:使用aliyun-smc-extensions工具的aliyunsmc-ueid服务一键配置EID

    1. 执行以下命令,启动aliyunsmc-ueid服务,此服务会自动将可用区ID添加为EID,同时删除默认EID。

      sudo systemctl start aliyunsmc-ueid
    2. (可选)执行以下命令,配置开机自启动aliyunsmc-ueid服务。这是由于EID配置不具备持久化的功能,在OS重启时会恢复到默认状态。

      sudo systemctl enable aliyunsmc-ueid

配置PNET ID参数

TCP通信中,网络流量通过以太网接口(ENI)进出。当透明转换TCP通信到SMC-R通信时,SMC-R协议栈将使用与此以太网接口相关联的RDMA网络接口(ERI)。

这种关联关系有以下两种形式。

  • 目标ENI上直接开启eRDMA能力得到的ERI,SMC-R协议栈将自动关联此ENIERI。

    这种情况下SMC-R协议栈能够自动识别并使用ENI关联的ERI,无需额外操作。

  • 其他ENI上开启eRDMA能力得到的ERI,需要使用PNET IDERI与目标ENI关联。

    以如下情况为例:

    节点中存在以太网接口eth0eth1,其中仅eth0开启RDMA接口erdma_0

    此时若TCP流量从eth0收发,切换为SMC-R后能够自动寻找到关联的erdma_0,使用RDMA网络通信。即上述第一种自动关联的情况。

    TCP流量从eth1收发,切换为SMC-R后则无法自动寻找到erdma_0接口,进而回退到TCP。此时可以使用同一PNET ID关联eth1erdma_0,以告知SMC-R可以使用erdma_0接口承载eth1的流量。

    image

    使用PNET ID关联ENIERI步骤如下:

    • 执行以下命令,将目标ENIERI配置上相同的PNET ID:

      • 为以太网接口ENI配置PNET ID。

        sudo smc_pnet -a <PNET ID> -I <eth_interface>
      • eRDMA接口ERI配置PNET ID。

        sudo smc_pnet -a <PNET ID> -D <rdma_interface>

      PNET ID的合法格式为最多 16 个大写字母数字字符(不含空格)。

    • 执行以下命令,检查配置的PNET ID参数。

      # sudo smc_pnet

      输出结果示例:

      # sudo smc_pnet
      00163E0CD751 n/a erdma_0 1
      00163E0CD751 eth1 n/a 255

      示例中erdma_0绑定了PNET ID:00163E0CD751,eth1也绑定了PNET ID:00163E0CD751。这样一来,原本通过eth1接口收发数据的TCP通信在启用SMC-R后就可以通过erdma_0接口收发数据。

实践案例:在自建容器环境下使用PNET ID关联POD中的以太网接口和宿主机上的eRDMA接口

在共享宿主机ERI的自建容器场景中,多个POD共享宿主机上的一个或多个eRDMA网卡。通过为POD以太网接口veth和宿主机eRDMA接口设置相同的PNET ID,可使容器内开启SMC-R后,内核协议栈能够正确地寻找到宿主机上的eRDMA网络接口,进而使用RDMA网络加速容器veth接口上的网络流量。

image

具体配置步骤如下。

  1. 在容器net namespace下为容器以太网接口(以eth0为例)配置PNET ID。

    sudo ip netns exec <pod netns> smc_pnet -a <PNET ID> -I eth0
  2. 在宿主机net namespace下为eRDMA接口(以erdma_0为例)配置PNET ID。

    sudo smc_pnet -a <PNET ID> -D erdma_0

实践案例:在ECS Redis场景使用SMC

  1. 创建两台ECS实例,一台实例作为Redis客户端,另一台实例作为Redis服务端。具体参数说明,请参见自定义购买实例

  2. 加载smcsmc_diag内核模块。

    sudo modprobe smc
    sudo modprobe smc_diag
  3. 执行以下命令,分别为两台实例安装Redis。

    sudo yum install redis -y
  4. 分别在两台实例上执行以下命令,使用EID避免跨可用区SMC-R通信。

    sudo systemctl start aliyunsmc-ueid
  5. 分别在两台实例上执行以下命令,配置基于端口的BPF策略。只允许Server IP地址在vswitch网段内且服务端口为6379的连接使用SMC协商。

    1. 执行以下命令,加载smc-ebpf

      sudo smc-ebpf policy load
    2. 配置针对端口的策略,只允许对6379端口使用SMC协商。

      sudo smc-ebpf policy config --port 6379 --mode enable
    3. 配置针对IPv4地址的策略,只允许对在vswitch网段内的Server IP使用SMC协商。

      sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode disable
      cidr=$(curl -s -m 1 100.100.100.200/latest/meta-data/vswitch-cidr-block)
      sudo smc-ebpf policy config --ip \
        $(echo ${cidr} | awk -F'/' '{print $1}') --mask \
        $(echo ${cidr} | awk -F'/' '{print $2}') --enable;
  6. 分别在两台实例上执行以下命令,配置net namespace维度协议透明转换。

    sudo sysctl -w net.smc.tcp2smc=1
  7. Redis服务端实例上执行以下命令,启动Redis服务。

    IP需替换为服务端实例主网卡的私有IP地址。

    redis-server --bind <IP> --port 6379 --protected-mode no --save
  8. Redis客户端实例上连接或测试Redis服务端。

    • 执行以下命令,连接Redis服务端。

      redis-cli -h <IP> -p 6379
    • 执行以下命令,使用redis-benchmark进行压测。

      redis-benchmark -h <IP> -p 6379 -n 1000000 -t set -c 100
  • 本页导读 (1)
  • 在阿里云ECS上使用SMC
  • 前期准备
  • 将应用程序的TCP socket运行于SMC协议栈
  • 基于BPF策略的SMC协商控制
  • 在阿里云ACK上使用SMC
  • 参数配置说明
  • 通过sysfs配置参数
  • 配置EID参数
  • 配置PNET ID参数
  • 实践案例:在ECS Redis场景使用SMC