DPDK高性能交换机深度实践:一次Mbuf External Buffer设计缺陷引发的性能雪崩

一、故障背景

某大型数据中心部署基于DPDK的软件交换机。

主要功能:

  • VXLAN Gateway
  • EVPN Leaf
  • ACL
  • Telemetry
  • ERSPAN Mirror

硬件配置:

项目配置
CPUIntel Xeon Gold 6430
网卡Intel E810
DPDK23.11
PMD Core32
Hugepage1GB

上线压测:

96Mpps

稳定运行。


某次升级后新增:

ERSPAN镜像

功能。


随后开始出现:

96Mpps
↓
84Mpps
↓
76Mpps
↓
68Mpps

但:

CPU = 100%

始终如此。


二、第一轮排查

检查:

rte_eth_stats_get()

结果:

imissed=0
ierrors=0
rx_nombuf=0

正常。


RSS:

32 Queue均衡

正常。


ACL:

Lookup Cycles稳定

正常。


FIB:

DIR24_8稳定

正常。


所有传统方向均被排除。


三、一个关键现象

问题只在:

开启ERSPAN

时出现。

关闭后:

96Mpps

恢复。


说明:

问题与:

Packet Copy

有关。


四、开发团队的优化方案

为了避免复制数据包。

采用:

rte_pktmbuf_attach_extbuf()

即:

External Buffer模式。


如下图:

https://images.openai.com/static-rsc-4/aH34pfytDEYxEzJGO-vhl2WIQZ2ylMr36J-9NchbCGTB9dl9tq4c35DNBDUjJ7t4ysQM_NyyAFvF85VEzJooq_AQcXagM_U9qCI8bRjdRawvDGCFZnalJDEGVON1dMWFWxH2TcTaVp1LuosHgEvHgngEGYvjy47tsNar9RYDkpWw6SxBMhKQAteDlTk3ucp5?purpose=fullsize

https://images.openai.com/static-rsc-4/Mgj_JbZrve0hUvzG1i6uLxCLH9f86OmuD0VlXVyK9m8-gYEPAqseUWKXuO-0kK7kiIlW3E9AofdPNI5iCmNiioR-gGk7kasqyYLh2tc4YCYh2HHOeyUnRfeP29MaoH8bIzj7V9fBerZc_DGb5T-Tl99nvgkCMElD_BGq41rR4Rsta9rQeZHT23-afp4d9hMZ?purpose=fullsize

https://images.openai.com/static-rsc-4/ww3oAS_UMvPd1SH5T7SauuJobzn43fuka6zerwJrnr5sh1aEYg02kxdBpMqkUi6j20_FlPqVAg6B8XSBTrIUS2E8QJcHcCNnX3HwkTF79SdHX3ZYudaHykN496jUf6-0lmwZeU7IUBpbGZU3BAU2shNBxscl9QDenyar6XrKL3f8Vd-kO18bj3Fy8fSPFklZ?purpose=fullsize


原始包:

mbufA
  ↓
buffer

镜像包:

mbufB
  ↓
同一个buffer

避免:

memcpy()

理论上性能更好。


五、External Buffer工作原理

普通模式:

mbuf
+
data buffer

绑定。


释放:

rte_pktmbuf_free()

直接回收。


External Buffer模式:

mbufA
      \
       buffer
      /
mbufB

需要:

RefCnt

管理。


六、问题开始出现

交换机每秒:

90M+
Packets

每个镜像包:

RefCnt++

释放:

RefCnt--

理论上:

没问题。


但现场Perf显示:

atomic operations

激增。


七、RefCnt为什么昂贵

引用计数:

rte_mbuf_ext_refcnt_update()

内部:

atomic_add()

意味着:

Cache Line Ownership Transfer

如下图:

https://images.openai.com/static-rsc-4/LkioRTiB5bOt_Qx-1znDPBHcJQbkTkOADdBaQTbGhoFtt_yUKJab9rjzI160ERVg1Hz_US27lIWXEjYmzeeak2Rw0V8QbKTRG4VkRe8SUOJkQItE6caeGAbZMRvoXneBFFkYhd-WNXWQaNNykeOjOGsfysQj83ov7njKsk3OAmDmJhs_4q_WNggdt2h6-xjF?purpose=fullsize

https://images.openai.com/static-rsc-4/Ucc-oXuLyDtNxM-18gGBEko0LYM3PPmPfbb6x47IKz3Zji0wqcIeop6l_0wpxmlOSSYmNauJOOZX0WcJ9uzjLLPEhFUL_U4vxvcpesin66XogkPpIo2oULQ3smgKDx5dP3CAmqTyibGA3S6mJEXPzwuOIfEHv0mngEDT7y8tRFQ7Ancm44S0-Pu1qEPg-W6-?purpose=fullsize

https://images.openai.com/static-rsc-4/3ALFwdp-97QeA6xav-WsvpmyggFnayh6iph8ShdW0C_5I-3Ywe8LUklw6YByfJeZ6Go1WIP-GfRWBkqbDt6guKZq2y_tEocJ3m6JaN7IP_P2vtJeEGj3fWsT2JeyfNl4ufnHF5z1Gj-F6vUL_oBlEOO-onHCGVu5-qYxY_9dJLQ9Pa44ZqHMWHL2POrOTtas?purpose=fullsize


八、真正的问题:Cache Line Bounce

假设:

Core5:

Mirror Flow A

Core12:

Mirror Flow B

共享:

同一个RefCnt

结果:

缓存线:

Core5
↓
Core12
↓
Core5
↓
Core12

不断迁移。


形成:

Cache Bounce

九、Perf证据

统计:

perf stat

发现:

mem_load_retired.l3_miss

增长:

5倍

同时:

lock instructions

增长:

8倍

十、第二层放大效应

不仅引用计数。

回收路径也被影响。


正常:

free
↓
mempool

External Buffer:

free
↓
refcnt check
↓
callback
↓
mempool

增加:

分支预测失败

十一、第三层放大效应

由于:

Mirror Traffic

占比不断增加。


系统出现:

External Buffer
占总包量70%

导致:

atomic hotspot

越来越严重。


十二、为什么CPU始终100%

因为:

PMD:

while(1)
{
    rte_eth_rx_burst();
    process();
    rte_eth_tx_burst();
}

永不休眠。


CPU:

100%

正常。


但:

Cycles/Packet

不断增长。


十三、根因闭环

完整链路:

ERSPAN
    ↓
External Buffer
    ↓
RefCnt Atomic
    ↓
Cache Bounce
    ↓
L3 Miss增加
    ↓
Cycles/Packet增加
    ↓
PPS下降

十四、如何验证

统计:

perf stat

关注:

lock instructions
cache-to-cache transfer

使用:

perf c2c

分析:

热点Cache Line

即可发现:

RefCnt字段

成为热点。


十五、优化方案

方案一

小包直接复制。

不要共享Buffer。


即:

rte_pktmbuf_copy()

对于:

64B~256B

往往更快。


方案二

大包使用External Buffer。


例如:

>512B

启用共享。


方案三

Per-Core Mirror Queue。

避免:

跨Core共享RefCnt

方案四

Mirror独立Pipeline。

如下图:

https://images.openai.com/static-rsc-4/lWZfxqMhwR1n0nBWrcIC2G3Nv6e1goH0MQW3YGDNheF6NCK-4Yt_ueAVIB9wesO6oJmvkQDiMgi5DppMSiHdH_NfsUAww4GKkB6sam9FOkqp-wwvzKmcdtBdpypKEwtUpnmR9wTBibxYiwmdjacUQmgSOkI0NLQkYVXmnMC-OdnJKWePUATyqY-85beBc0ip?purpose=fullsize

https://images.openai.com/static-rsc-4/_-O_bGaHMIDhQLwBv4cSYlvrOojR71SeSTs55tbN6m1b-cQdeGgCgCN484ZxPbc9z3EjxfalyLu2tLAOREbyEhLIJUF8vpXQjXV_gIvt3Be627MwnnhGqDhkco_it4ZsQKGvZn4QbiSOUblSNRyABqZLQi59jhw8ozcE5glGgvcZp3vvqRCgBowiSfEffsjA?purpose=fullsize

https://images.openai.com/static-rsc-4/_ymxpSrdDqVblU-2YUOF1Llsr1mkNGkBdFRjBKEwrKO5uZRVYKgBy-2mv51pIRs_5us7BkKNkOhgcXv1kC_Pr4Ac1MQXmL9l1YDfNrNA0nu9Mx_jnI6CBxeUSUoj2A_c2xFtuxYN47KpKoJ1OJZO6eyMQxAz-F0ykAMkaCa0JUyDU2g5QvNJceZbz_RAH7y0?purpose=fullsize


避免:

Forward Path
Mirror Path

争用同一生命周期。


十六、优化结果

优化前:

指标数值
PPS68M
LLC Miss18%
Atomic Ops
RTT P994.8ms

优化后:

指标数值
PPS95M
LLC Miss4%
Atomic Ops
RTT P990.8ms

核心知识点总结

1

零拷贝不一定更快。


2

External Buffer节省的是:

Memory Copy

成本。


但增加了:

Cache Coherency

成本。


3

在几十Mpps以上场景:

Atomic Cost

往往比:

Memcpy Cost

更昂贵。


4

共享数据结构比复制数据更容易成为瓶颈。


5

PMD线程100%运行时。

真正要看:

Cycles Per Packet

而不是CPU利用率。


6

DPDK中的性能问题很多来自:

生命周期管理

而非数据处理逻辑。


7

高性能交换机设计中:

“减少共享”往往比“减少复制”更重要。

这是一个与本项目此前所有文章完全不同的方向,属于Mbuf架构与生命周期管理层面的性能问题,也是很多高端交换机、流量镜像设备和Packet Broker产品在后期扩容时才会暴露出来的深层瓶颈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.HeBoYan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值