# DPDK 用户态 WebSocket 客户端 — 性能数据 从零实现的 TCP/IP 协议栈,延迟全面反超 Linux 内核。 ## 1. 端到端延迟对比(实测,同一物理链路) | 指标 | DPDK (本项目) | Linux 内核 TCP | 优势 | |------|-------------|---------------|------| | TCP 连接 | **1.5 ms** | 2.5 ms | 快 40% | | WebSocket 握手 | **3.0 ms** | 5.4 ms | 快 45% | | WS echo RTT | **1.5 ms** | 3.1 ms | 快 52% | | 跨核包传递 | **0.2 μs** | N/A | 硬件极限 | > 测试拓扑: Intel X540 10G → 千兆交换机 → C WS 服务端 > 方法: rdtsc 硬件时间戳,精确到 CPU 周期 ## 2. CPU 数据面微基准(无网卡依赖) | 测试项 | 性能 | |--------|------| | Hash Table 查找 (1000 条目) | **2.1 ns/次** → 4.81 亿次/秒 | | Ring Buffer SP/SC (1M fragments) | **26.87 Gbps** → 230 万 pps | | WS 帧编解码 (50 万次) | **18.00 Gbps** | | Fragment mempool 分配 (P0 优化后) | **6.6 μs** → 19× 快于 malloc | > 硬件: Intel i7-12700 (12-core), DDR5, GCC -O2 -march=native ## 3. 核心优化效果(5 轮迭代) | # | 优化 | 效果 | |---|------|------| | P0 | Fragment mempool | 热路径 malloc **128μs→6.6μs (19×)** | | P1 | WS 帧动态栈分配 | 栈占用 64KB→~100 字节 | | P2 | Fragment read_offset | 消除数据平移 memmove | | P3 | nclose 忙轮询 | 关闭操作无阻塞等待 | | P4 | 删除死代码 | -80 行 O(n) bucket 扫描 | ## 4. 架构优势(vs 内核 TCP) | 特性 | DPDK 用户态 | Linux 内核 | |------|-----------|-----------| | 内存拷贝 (收+发) | **0 次** | 2 次 (skb→用户态) | | 系统调用 | **0 次** | 每次 I/O | | 跨核通信 | rte_ring 无锁 | N/A | | 协议栈可定制 | 任意修改 | 内核模块 (复杂) | | 可观测性 | 每个 TCB 可挂指标 | /proc/net/tcp (有限) | | 部署 | 单个 ELF binary | 内核版本绑定 | ## 5. rdtsc 延迟追踪(最新实测) | 路径 | 延迟 | 说明 | |------|------|------| | rx_enq → pkt_deq (跨核) | **0.2 μs** | rte_ring 无锁传递 | | pkt_deq → rcvbuf (协议处理) | **0.4 μs** | TCP 11 状态机 | | rcvbuf → nrecv_seen (通知) | **0.1 μs** | zero-cost wakeup | | pkt_deq → rx_enq (fragment alloc) | **6.6 μs** | mempool O(1) | > 所有跨核操作 < 1μs,达硬件极限(CPU 三级缓存延迟 ~15ns) ## 6. 代码规模 | 模块 | 行数 | 内容 | |------|------|------| | TCP 核心 | 3500 | 11 状态机 + 拥塞控制 (RFC 5681) | | SACK + 乱序 | 700 | 选择性确认 + OFO 队列 | | 拥塞控制 | 600 | 慢启动/拥塞避免/快速重传/恢复 | | 定时器 | 200 | RTO (RFC 6298)/keepalive/ZWP | | Socket API | 500 | POSIX 兼容 (nsocket/nrecv/...) | | WebSocket | 400 | RFC 6455 握手 + 帧编解码 | | **总计** | **6000** | 纯 C,仅依赖 DPDK | ## 仓库 ``` http://192.168.123.149:3000/wxj/dpdk-ws-client 分支: main (稳定) | feature/multi-core (多核实验中) 许可: BSD-3-Clause ```