最近公司项目遇到一个 UDP丢包问题,导致数据库有一些异常。 在经历了几天加几个夜晚的分析定位,总算将问题解决,特写下总结、分析的文章,以供追溯
一. UDP Receive Packet 过程
- 首先网络报文通过物理网线发送到网卡
- 网络驱动程序会把网络中的报文读出来放到 ring buffer 中,这个过程使用 DMA(Direct Memory Access),不需要 CPU 参与
- 内核从 ring buffer 中读取报文进行处理,执行 IP 和 TCP/UDP 层的逻辑,最后把报文放到应用程序的 socket buffer 中
- 应用程序从 socket buffer 中读取报文进行处理
从上图中可以看到udp 收报的大概过程,在这个过程中的任意一个环节都有可能造成丢包,所以定位分析的时候,要逐一进行排查。 在这篇文章中,我们先来讲一下socket buffer
满造成丢包的情况。
二. netstat 中查看是否有socket buffer满造成的丢包?
netstat -s
可以看到网络层面上不同协议的丢包信息- Linux 协议栈中有一些统计计数信息,会通过snmp的方式输出。
- netstat 工具会从
cat /proc/net/snmp
中获取信息
netstat -s | grep -E "pack