UDP 错误计数定位
UDP 没有重传与连接状态,丢包不会给应用报错,只能靠内核计数器判断原因。常用入口是 netstat -su 或 /proc/net/snmp 的 Udp 段:RcvbufErrors 增长表示接收缓冲不足或应用读得太慢,NoPorts 增长表示有报文发往未监听的端口,InErrors 与 InCsumErrors 表示报文本身异常(校验失败、格式问题)。区分这几类原因之后才能对症处理:调缓冲、核对端口,还是排查链路。
基本信息
| 查看方式 | netstat -su 或 /proc/net/snmp 的 Udp 段 |
|---|---|
| RcvbufErrors | 接收缓冲不足或应用读取慢 |
| NoPorts | 报文发往了未监听的端口 |
| InCsumErrors | 校验失败的报文 |
| SndbufErrors | 发送缓冲不足 |
典型使用场景
- DNS、日志采集等服务出现「丢数据」但应用不报错
- 判断是否为接收缓冲不足导致丢包
- 确认是否有应用往错误端口发送报文
- 区分链路损坏与本地缓冲问题
- 与网卡级丢包统计交叉验证,缩小范围
读取计数器
读取计数器
netstat -su
awk '/^Udp:/{print; getline; print}' /proc/net/snmp # 计数行与表头成对输出
cat /proc/net/snmp | grep -A1 Udp
ss -uanp | head -20 # UDP 套接字的收发队列
sysctl net.core.rmem_max net.core.rmem_default
ip -s link show dev ens5 | head -20 # 网卡级丢包统计作为对照
grep -E 'Udp' /proc/net/snmp # 再次采样,比较差值计数器与处理方向
| 计数器 | 含义 | 处理方向 |
|---|---|---|
| RcvbufErrors | 接收缓冲不足或应用读取慢 | 调大缓冲并优化应用读取节奏 |
| SndbufErrors | 发送缓冲不足 | 提高发送缓冲或降低发送速率 |
| NoPorts | 报文发往未监听端口 | 核对目标端口与应用监听状态 |
| InErrors 与 InCsumErrors | 校验失败或格式异常 | 检查链路与网卡校验和卸载设置 |
| InDatagrams 与 OutDatagrams | 正常收发总量 | 与业务量对照,判断丢包比例 |
NoPorts 增长常被误当成丢包故障,实际多是访问了错误端口,或目标服务根本没在监听。
只调大缓冲而不提升应用读取速度,RcvbufErrors 仍会继续增长,缓冲只是争取一点时间。
验证是否真的丢包
- 在应用侧统计实际收到的报文数量,与发送端计数对照
- 用 ip -s link 查看网卡层是否存在丢弃与错误
- 两次采样 /proc/net/snmp,观察 InErrors 与 RcvbufErrors 的增量是否仍在增长