一、现网故障
某数据中心核心交换机采用DPDK实现用户态高速转发。
硬件配置:
-
双路Intel Xeon服务器
-
Intel 100G Ethernet Controller
-
每端口8个RX Queue
-
每Queue绑定一个PMD线程
-
150Mpps转发能力
系统已经稳定运行一年。
某天上线一项新业务后:监控开始报警:
-
PPS下降约8%
-
P99时延增加
-
偶发丢包
-
CPU依然100%
-
网卡Error为0
所有工程师第一反应:是不是DPDK处理不过来了?
经过查看:
CPU:
100%
RX Queue:
正常
TX Queue:
正常
Descriptor:
正常
RSS:
均衡
所有常规指标:全部正常。
二、第一轮排查
首先查看DPDK统计:
struct rte_eth_stats stats;
rte_eth_stats_get(port, &stats);
得到:
imissed = 0
rx_nombuf = 0
ierrors = 0
说明:RX Ring没有丢包。
继续查看:
ethtool -S
同样:
CRC Error:0
DMA Error:0
Link:正常。
问题越来越奇怪。
核心知识点一
DPDK能够统计的:
只是:RX Descriptor之后。
而:真正的数据路径:远比RX Ring长。
三、真正的数据进入流程
很多开发者认为:
数据包:进入网卡。
立即:DMA到RX Ring。
实际上:Intel网卡内部:
还有:Packet Buffer。
真实流程:
MAC
↓
Packet Buffer
↓
Packet Scheduler
↓
RX Queue
↓
Descriptor
↓
DMA
↓
DPDK
DPDK:根本看不到:Packet Buffer。
四、什么是Packet Buffer?
Packet Buffer:位于:MAC与DMA之间。
作用:缓存:刚刚收到的数据包。
为什么需要它?
因为:PCIe DMA:速度:并不是:无限快。
Packet Buffer:负责:吸收:瞬时流量。
类似高速缓存。
核心知识点二
Packet Buffer:不是:RX Ring。
RX Ring:属于:软件。
Packet Buffer:属于:网卡ASIC内部。
二者完全不同。
五、什么是Microburst?
业务:平均:80Gbps。
但是:某1μs:
突然:100Gb数据:一起到达。
平均:没有超。
瞬时:已经超过:Packet Buffer容量。
于是:Buffer耗尽。
六、Backpressure开始工作
Packet Buffer满以后。
NIC开始Backpressure。
不同网卡实现不同。
例如:
-
暂停DMA
-
Flow Control
-
PFC
-
Drop
Intel网卡:通常优先保护内部Pipeline。
结果:新的Packet直接丢弃。
注意:
此时:RX Ring仍然没有满。
DPDK根本不知道。
核心知识点三
Packet:可能:在DMA之前就已经丢掉。
因此:DPDK统计不到。
七、为什么CPU一直100%?
因为:PMD一直Polling。
但是:Packet根本没有进入RX Descriptor。
CPU一直空轮询。
所以:CPU100%。
吞吐下降。
这就是:很多工程师误判:CPU性能的原因。
八、如何定位?
首先:
观察:业务流量。
发现:平均:没有变化。
继续:抓:100ns级:Traffic。
发现:存在:Microburst。
随后:查看:NIC Buffer相关:Vendor统计。
发现:Packet Buffer:Occasionally Full。
至此:问题彻底定位。
核心知识点四
平均带宽:不能说明:瞬时压力。
Microburst:通常只有几微秒。
但是:
足以耗尽Packet Buffer。
九、为什么以前没有?
以前:
业务都是长流。
Packet连续。
DMA可以持续搬运。
现在:
大量RPC、小包、AI业务。
导致:
Packet集中到达。
于是:
Packet Buffer更容易瞬时耗尽。
十、工程优化
第一:
增加:RX Queue。
提高:DMA并行度。
第二:
合理设置Burst。
避免软件进一步放大Burst。
第三:
开启:PFC。
减少:Drop。
第四:
优化:业务发送节奏。
第五:
对于:AI业务。
增加:Traffic Shaping。
核心知识点五
DPDK:
解决的是软件转发。
Packet Buffer:
属于硬件缓存。
因此:
很多Microburst问题。
仅靠DPDK无法解决。
十一、优化结果
优化:发送节奏。
增加:RX Queue。
调整:Burst。
重新压测。
结果:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| PPS | 下降8% | 恢复 |
| P99 | 18μs | 8μs |
| Microburst Drop | 存在 | 基本消失 |
CPU:仍然100%。
但是:业务恢复。
核心知识点总结
知识点一
DPDK只能看到DMA之后的数据。
知识点二
Packet Buffer位于MAC与RX Ring之间。
知识点三
Packet Buffer属于NIC硬件资源。
知识点四
Microburst首先冲击Packet Buffer,而不是RX Queue。
知识点五
Packet可能在进入Descriptor之前就已经丢失。
知识点六
DPDK统计不到Packet Buffer内部发生的丢包。
知识点七
CPU100%并不能说明Packet已经进入软件。
知识点八
AI、RPC、小包业务更容易产生Microburst。
知识点九
PFC、Traffic Shaping、Queue设计需要协同优化。
总结
很多DPDK性能优化都集中在CPU、NUMA、Cache、Descriptor和RSS等软件层面,但随着100G、200G甚至400G交换机逐渐普及,越来越多的问题开始发生在软件之前。Packet Buffer作为网卡内部用于吸收突发流量的重要硬件资源,往往决定了系统面对Microburst时的承受能力。一旦Packet Buffer耗尽,Backpressure机制就会启动,数据包甚至还没有进入RX Ring便已经被丢弃,因此DPDK完全无法感知。理解Packet Buffer、Backpressure以及Microburst之间的关系,对于设计真正高性能、高可靠的DPDK交换机具有重要意义,也是现代高速网络软件工程中容易被忽视却至关重要的一环。
9087

被折叠的 条评论
为什么被折叠?



