首页/系统/Linux 内核与性能调优速查/UDP 收发错误计数定位
网络栈调优98 条

UDP 收发错误计数定位

UDP 丢包不报错, 需要靠内核计数器区分: 缓冲不足、端口未监听还是校验错误, 再对症处理。

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 的增量是否仍在增长

易错点

  • 把 NoPorts 增长当丢包故障:多半是端口写错或服务未启动
  • 只调缓冲不改应用:应用读取慢是根因,缓冲再大也会被填满
  • 混淆网卡丢包与内核丢包:ip -s link 与 softnet_stat 反映不同层次
  • 只看累计值下结论:这类计数器必须两次采样比较差值
  • 忽略校验和卸载:开启卸载时抓包看到校验和异常属于正常现象

数据来源与参考

  • man netstat
  • Linux 源码 net/ipv4/udp.c 计数定义
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌