Linux UDP 协议在高性能 RPC 中虽非主流,但通过低开销、无状态并发、数据报边界明确、可定制可靠性及系统调优,能显著提升吞吐与延迟。

Linux UDP 协议在高性能 RPC 服务中不是主流选择,但特定设计下能显著提升吞吐与延迟——关键不在“用不用 UDP”,而在于“如何用对 UDP”。
低开销与确定性延迟
UDP 没有连接建立、序列号管理、ACK 确认、重传定时器等 TCP 内核路径开销。一次 sendto() 调用基本对应一个 IP 数据包发出,内核协议栈路径极短。这对 RPC 这类请求-响应模型尤其有利:单次调用耗时更可控,P99 延迟波动小。例如,毫秒级响应的风控或计费服务,TCP 的拥塞窗口调整和乱序重排可能引入不可预测抖动,而 UDP 可规避这类内核调度不确定性。
支持无状态高并发模型
- 无需维护 per-connection 状态(如 TCP 的 tcb 结构),单机可轻松支撑百万级并发请求(仅受限于 socket 数量与内存)
- 天然适配无状态 worker 池:多个进程/线程可 bind 同一端口(SO_REUSEPORT),由内核按 flow 哈希分发 UDP 包,避免单点接收瓶颈
- 配合 epoll + 多线程 recvfrom,接收路径可做到纯异步、零阻塞,避免传统 accept()/read() 的上下文切换开销
灵活控制数据边界与内存生命周期
UDP 面向数据报,每个 recvfrom() 返回完整业务消息(前提是应用层约定好包大小或带长度头)。这省去了 TCP 流式解析的粘包/拆包逻辑,也避免了为拼接缓冲区做额外内存管理。结合缓存池(mempool)复用接收 buffer,可做到:收到即处理、处理完归还、全程无 malloc/free —— 对高频小包 RPC(如键值查询)尤为关键。
可定制可靠性与扩展能力
- 应用层按需实现轻量级可靠性:例如只对关键请求加 sequence + ACK,非关键日志类请求直接“发完即弃”
- 内置支持多播/广播,适合服务发现、配置推送等辅助通道,不挤占主 RPC 通道
- 便于集成 QUIC-like 机制:如在用户态实现快速重传、前向纠错(FEC)、连接迁移,比修改 TCP 栈更敏捷
配套系统调优不可少
UDP 的高效是双刃剑:丢包率直接受系统配置影响。实际部署需同步优化:
- 调大网卡 ring buffer(ethtool -G)和内核 UDP 接收缓冲区(net.core.rmem_max)
- 启用 SO_REUSEPORT 分摊负载,禁用校验和(SO_NO_CHECK)若链路可信
- 接收线程只做最小化拷贝(如使用 recvmmsg + iovec 零拷贝接收),业务逻辑交由协程池异步处理
- 避免在 recvfrom 后立即 memcpy:用指针传递原始 buffer,减少 CPU 和 cache 压力



















