AWS ENA Express 网络技术解析

1. ENA 基础功能

1.1 什么是 ENA?

ENA(Elastic Network Adapter)是 AWS 为 EC2 实例提供的高性能网络适配器,包含硬件和软件两个部分

硬件部分

  • Nitro Card 上的网络硬件:ENA 的硬件实现在 AWS Nitro System 的 Nitro Card 上
  • 支持高达 100 Gbps 的网络速度
  • 使用 SR-IOV(Single Root I/O Virtualization)技术

软件部分

  • ENA 驱动程序:需要在操作系统中安装
    • Linux:ENA Linux kernel driver
    • Windows:ENA Windows driver
    • FreeBSD:ENA FreeBSD driver

信息来源

1.2 ENA 的工作原理

ENA 使用 SR-IOV(Single Root I/O Virtualization) 技术:

  • 硬件层面:Nitro Card 提供网络硬件支持
  • 软件层面:操作系统需要安装相应的 ENA 驱动程序
  • 两者配合实现增强网络功能

1.3 哪些实例支持 ENA?

所有基于 Nitro System 的实例都支持 ENA,例如:

  • 通用型:T3, T4g, M5, M6i, M7i 等
  • 计算优化:C5, C6i, C7i 等
  • 内存优化:R5, R6i, R7i 等
  • 存储优化:I3, I4i 等

ENA 支持级别

AWS 的 ENA 支持有三个级别:

  • unsupported - 不支持
  • supported - 支持(可选)
  • required - 必需(强制要求)

示例查询

aws ec2 describe-instance-types \
    --instance-types t3.xlarge \
    --query 'InstanceTypes[0].{InstanceType:InstanceType, Hypervisor:Hypervisor, EnaSupport:NetworkInfo.EnaSupport}'

结果

{
    "InstanceType": "t3.xlarge",
    "Hypervisor": "nitro",
    "EnaSupport": "required",
    "NetworkPerformance": "Up to 5 Gigabit"
}

1.4 ENA 默认启用情况

使用最新 AMI 时,ENA 驱动已安装且默认启用:

默认启用的系统

  • Amazon Linux(最新 HVM AMI)
  • Ubuntu(最新 HVM AMI)
  • RHEL(最新 AMI)
  • SUSE(最新 AMI)
  • CentOS(最新 AMI)

需要手动配置

  • Windows Server(需要安装驱动并设置 enaSupport 属性)
  • 较旧的 AMI

详见Enable enhanced networking on your instance

"The latest HVM AMIs already have the ENA driver installed and enhanced networking enabled. Therefore, if you launch an instance with the latest AMI on a supported instance type, enhanced networking is already enabled for your instance."


2. ENA Express 增强功能

2.1 ENA Express 是什么?

ENA Express 是AWS 在 2022 年底推出的一个 ENA 的增强功能特性,通过在 Nitro Card 硬件上实现 SRD (Scalable Reliable Datagram) 协议来提升网络性能, 对 TCP 和 UDP 协议透明工作。

⚠️ 不要混淆 ENA Express 和 EFA

  • ENA Express:通用网络加速,对应用透明,无需修改代码
  • EFA (Elastic Fabric Adapter):HPC/ML 专用网络接口,需要使用 MPI/NCCL 等特殊库
  • 两者都使用 SRD 协议,但用途和使用方式完全不同

标准 ENA 与 ENA Express 的对比:

特性 ENA 标准 ENA Express
协议 TCP/UDP SRD
单流带宽 最高 5 Gbps 最高 25 Gbps
P99 延迟 基准 降低最多 50%
P99.9 延迟 基准 降低最多 85%
启用方式 自动(Nitro 实例) 手动配置
额外费用
工作位置 Nitro Card Nitro Card (SRD 协议)

2.2 适用场景

ENA Express 主要为 HPC/ML 高性能计算场景设计,适合:

  • HPC/ML 应用
  • 数据库应用
  • 分布式文件系统
  • 分布式存储系统
  • 媒体编码
  • 高吞吐量工作负载

2.3 如何使用 ENA Express

2.3.1 前提条件

硬件要求

  • ✅ 使用支持 ENA Express 的实例类型(通常 8xlarge 及以上)
  • ✅ 两端实例都必须启用 ENA Express (单端启用无法获得性能提升)
  • ✅ 两端实例都在同一可用区(AZ)

软件要求

  • 无需安装额外驱动(最新 AWS AMI 通常已满足要求)
  • ✅ 确保 ENA 驱动版本足够新:
    • Linux: 驱动版本v2.2.9+ (完整带宽)
    • Linux: 驱动版本v2.8+ (支持指标监控)
    • Windows: 驱动版本v2.2.3+

自动协商

发送实例启用 ENA Express
        ↓
    发起连接
        ↓
接收实例检测 ENA Express
        ↓
  ┌─────────────────┐
  │ 两端都启用?     │
  └─────────────────┘
      ↓         ↓
      是        否
      ↓         ↓
   使用 SRD    回退到标准 ENA

如果通信的任一端未启用 ENA Express,连接会自动回退到标准 ENA,不会影响连通性。

2.3.2 启用方法

ENA 驱动已经包含了 ENA Express 的支持,只需通过配置启用即可:

  • 配置修改后立即生效
  • 无需重启实例
  • 对应用透明,无需修改代码

方法 1:使用 AWS CLI(推荐)

# 仅为 TCP 流量启用 ENA Express
aws ec2 modify-network-interface-attribute \
    --network-interface-id eni-1234567890abcdef0 \
    --ena-srd-specification 'EnaSrdEnabled=true'

# 同时为 TCP 和 UDP 流量启用 ENA Express
aws ec2 modify-network-interface-attribute \
    --network-interface-id eni-1234567890abcdef0 \
    --ena-srd-specification 'EnaSrdEnabled=true,EnaSrdUdpSpecification={EnaSrdUdpEnabled=true}'

# 在附加网络接口时启用 ENA Express
aws ec2 attach-network-interface \
    --network-interface-id eni-1234567890abcdef0 \
    --instance-id i-1234567890abcdef0 \
    --device-index 1 \
    --ena-srd-specification 'EnaSrdEnabled=true,EnaSrdUdpSpecification={EnaSrdUdpEnabled=true}'

方法 2:使用 AWS Console

  1. 进入 EC2 控制台
  2. 导航到 Network Interfaces
  3. 选择已附加到实例的网络接口
  4. 点击 ActionsManage ENA Express
  5. 勾选 Enable 复选框
  6. (可选)勾选 Enable UDP 以支持 UDP 流量
  7. 点击 Save

方法 3:在启动实例时配置

可以在启动模板或启动实例向导中预先配置 ENA Express。

2.3.3 验证配置

检查 ENA Express 状态

aws ec2 describe-network-interfaces \
    --network-interface-ids eni-1234567890abcdef0 \
    --query 'NetworkInterfaces[0].Attachment.EnaSrdSpecification'

预期输出

{
    "EnaSrdEnabled": true,
    "EnaSrdUdpSpecification": {
        "EnaSrdUdpEnabled": true
    }
}

使用 AWS 提供的检查工具 ENA Utilities (Linux):

wget https://github.com/amzn/amzn-ec2-ena-utilities/raw/main/ena-express/check-ena-express-settings.sh
chmod +x check-ena-express-settings.sh
sudo ./check-ena-express-settings.sh

该脚本会检查:

  • 驱动版本是否满足要求
  • 系统配置是否优化
  • 提供配置建议

2.4 最佳实践

1. 同时启用 TCP 和 UDP

  • 如果应用使用 UDP,记得启用 UDP 支持
  • 否则 UDP 流量会回退到标准 ENA

2. Linux 系统优化配置

启用 ENA Express 后,建议进行以下系统优化以获得最佳性能:

# 1. 设置 MTU(如果使用 jumbo frames)
sudo ip link set dev eth0 mtu 8900

# 2. 增加接收环大小
sudo ethtool -G eth0 rx 8192

# 3. 设置 TCP 小队列限制(增加单个 socket 的排队数据量)
sudo sh -c 'echo 1048576 > /proc/sys/net/ipv4/tcp_limit_output_bytes'

# 4. 禁用字节队列限制(增加设备队列的排队数据量)
sudo sh -c 'for txq in /sys/class/net/eth0/queues/tx-*; do echo max > ${txq}/byte_queue_limits/limit_min; done'

注意:Amazon Linux 发行版默认已禁用字节队列限制。

3. 监控性能

  • 使用 CloudWatch 监控 ENA Express 指标
  • 需要驱动版本 2.8+

参考文档:


3. SRD 协议技术原理

虽然使用 ENA Express 不需要了解 SRD (Scalable Reliable Datagram) 的技术细节,但理解 SRD 的工作原理可以帮助:

  • 理解为什么 ENA Express 能提升性能
  • 理解为什么需要大规格实例
  • 理解为什么必须在同一 AZ
  • 如何优化应用以充分利用 ENA Express

接下来,我们将介绍 SRD 协议的技术原理,了解它如何实现这些性能提升。

3.1 为什么需要 SRD?

传统 TCP 在数据中心环境的局限:

  • 队头阻塞(Head-of-Line Blocking):一个丢包阻塞整个流
  • ECMP 哈希冲突:静态路径分配导致热点
  • 重传超时长:最小 50ms 的重传延迟
  • 单路径限制:单流带宽上限 5 Gbps

这些问题对 HPC 和 ML 工作负载的影响尤其严重,这类应用采用 BSP(Bulk Synchronous Parallel)计算模型,整个集群性能取决于最慢节点,使得尾延迟成为关键因素。

AWS 为此设计了 SRD 协议, 其核心设计理念: "Reliable but Out-of-Order Delivery"(可靠但无序交付)。 SRD 将 可靠性顺序性 解耦:

  • ✅ 在传输层保证可靠到达(不丢包)
  • ❌ 不保证按发送顺序到达(允许乱序)
  • 📦 将数据包排序责任上移到应用层(由 MPI/Libfabric 处理)

这种设计避免了队头阻塞,允许充分利用多路径并行传输。

3.2 SRD 同类技术对比

SRD 作为 AWS 为 AWS Nitro System 设计的专有协议,与传统 HPC 网络技术的对比:

技术 开发者 网络类型 需要 PFC 多路径 无序交付 主要用途
SRD AWS 以太网 ❌ 否 ✅ 64条 ✅ 是 EFA/ENA Express
InfiniBand Mellanox/NVIDIA 专用 ✅ 是 ❌ 单路径 ❌ 否 HPC/ML
RoCE v2 标准 以太网 ✅ 是 ❌ 单路径 ❌ 否 HPC/ML

SRD 的独特优势

  • 不需要 PFC(优先级流控制),避免大规模网络中的队头阻塞和死锁
  • 多路径传输,充分利用数据中心网络的多条路径
  • 运行在标准以太网上,无需专用硬件

3.3 SRD 关键技术特性

3.3.1 多路径负载均衡

工作机制

  • 最多使用 64 条并行路径
  • 发送方通过操纵数据包封装控制 ECMP 路径选择
  • 根据每条路径的 RTT(往返时间)动态避开拥塞路径
  • 路径失败时快速重路由,无需重建连接

3.3.2 拥塞控制

目标

  • 最小化队列积压
  • 预防丢包而非依赖丢包检测
  • 获得公平带宽份额

算法特点

  • 类似 BBR 算法,但针对数据中心多路径优化
  • 基于每连接的动态速率限制
  • 通过 RTT 变化检测拥塞
  • 结合飞行中字节数限制

检测机制

  • 大多数路径的 RTT 上升 → 全局拥塞
  • 估计速率低于发送速率 → 拥塞
  • 单条路径拥塞 → 独立处理,重路由

3.3.3 无序交付

为什么不保证顺序?

保证顺序的代价

  • 造成队头阻塞
  • 增加延迟和降低带宽
  • 需要大量缓冲区资源
  • 限制可扩展性

SRD 方案

  • Nitro Card 保证可靠性(不丢包)
  • 将排序责任交给上层应用(MPI 等)
  • 应用层更了解哪些消息需要排序
  • 避免不必要的延迟

适用性

  • 对于字节流协议(如 TCP)不可行
  • 对于基于消息的语义很容易实现
  • MPI 标记消息只需在使用相同标记时保序

3.3.4 硬件实现

在 Nitro Card 上实现的优势

  • 亚毫秒级重传:避免 TCP 的 50ms 最小重传超时
  • 快速响应拥塞:无需等待 OS 调度
  • 零性能抖动:绕过主机 OS 和 Hypervisor
  • 最接近物理网络层:最快适应网络行为

3.4 工作流程

 

关键流程说明

  1. 发送端(Nitro Card)

    • 将数据包分散到最多 64 条路径
    • 监控每条路径的 RTT
    • 动态避开拥塞/故障路径
    • 基于速率估计调整发送速率
  2. 网络层(多路径传输)

    • 数据包通过不同路径到达
    • 自动避开拥塞路径
    • 数据包可能乱序到达
  3. 接收端(Nitro Card)

    • 接收乱序数据包
    • 保证可靠性(检测并重传丢失包)
    • 直接交付给应用层(不重排序)
  4. 应用层(MPI/Libfabric)

    • 根据应用需求重排序
    • 消息标记匹配
    • 流控制

3.5 性能数据

根据 AWS 官方论文(link)的实验数据:

Incast 场景(48 个流汇聚)

指标 TCP SRD
中位 FCT 1.5-3x 理想值 接近理想值
最大 FCT 3-20x 理想值 接近理想值
抖动 极低

ECMP 不平衡场景

指标 TCP SRD
中位延迟 50% 高于理想 15% 高于理想
尾延迟 1-2 个数量级高 低于 TCP 平均值

4. 实例支持和限制

4.1 支持的实例类型

最小规格要求:通常是 8xlarge 及以上

通用型实例

  • ✅ m6i.8xlarge 及以上
  • ✅ m6a.12xlarge 及以上
  • ✅ m7i.12xlarge 及以上
  • ❌ m6i.large/xlarge/2xlarge/4xlarge
  • ❌ t3 系列(所有规格)

计算优化实例

  • ✅ c6i.8xlarge 及以上
  • ✅ c7i.12xlarge 及以上
  • ❌ c7i.2xlarge 及更小规格

内存优化实例

  • ✅ r6i.8xlarge 及以上
  • ✅ r7i.12xlarge 及以上

查询实例是否支持

aws ec2 describe-instance-types \
    --instance-types c7i.2xlarge \
    --query 'InstanceTypes[0].{InstanceType:InstanceType, EnaSrdSupported:NetworkInfo.EnaSrdSupported}'

结果示例

{
    "InstanceType": "c7i.2xlarge",
    "EnaSrdSupported": false
}

4.2 使用限制

通信要求

  • ✅ 必须在**同一可用区(AZ)**内通信
  • ✅ 发送和接收实例都必须启用 ENA Express
  • ❌ 不支持跨 AZ 或跨区域
  • ❌ 不支持 Local Zone

网络路径要求

  • ❌ 实例间不能有中间件盒子(middleware boxes)
  • ✅ 必须是直接通信

5. 参考资料

5.1 关键概念

概念 说明
ENA 基础网络适配器,硬件+软件
ENA Express ENA 的增强功能
SRD Scalable Reliable Datagram 协议
SR-IOV Single Root I/O Virtualization
Nitro Card AWS 自研硬件,实现 ENA 和 SRD

5.2 常用命令

# 查询实例 ENA 支持
aws ec2 describe-instance-types \
    --instance-types <instance-type> \
    --query 'InstanceTypes[0].NetworkInfo.EnaSupport'

# 查询实例 ENA Express 支持
aws ec2 describe-instance-types \
    --instance-types <instance-type> \
    --query 'InstanceTypes[0].NetworkInfo.EnaSrdSupported'

# 启用 ENA Express
aws ec2 modify-network-interface-attribute \
    --network-interface-id <eni-id> \
    --ena-srd-specification 'EnaSrdEnabled=true'

# 查看 ENA Express 状态
aws ec2 describe-network-interfaces \
    --network-interface-ids <eni-id> \
    --query 'NetworkInterfaces[0].Attachment.EnaSrdSpecification'

5.3 技术文档

  1. ENA Express: Improved Network Latency and Per-Flow Performance on EC2
  2. Using ENA Express to improve workload performance on AWS
  3. In the search for performance, there's more than one way to build a network
  4. SRD 协议技术论文 A Cloud-Optimized Transport Protocol for Elastic and Scalable HPC
  5. PERF05-BP05: Choose network protocols to improve performance
Next Post Previous Post
No Comment
Add Comment
comment url