Linux中监控UDP丢包需关注/proc/net/snmp中的InErrors、NoPorts、RcvbufErrors等字段,结合netstat -s查看UDP统计,识别端口未监听、缓冲区溢出等丢包原因。
要监控每秒接收的 udp 错误包,关键不是看“错误包”本身(udp 协议无重传、确认机制,不定义“错误包”),而是监控 因系统资源不足或协议栈异常导致的 udp 接收失败事件,windows 通过性能计数器提供两个直接相关的指标:
核心计数器:UDPv4\Datagrams No Ports/sec
该计数器表示每秒到达本机、但**目标端口上没有监听进程**的 IPv4 UDP 数据报数量。这是最常见的“被丢弃的 UDP 包”,属于典型的接收失败场景。
- 打开性能监视器:
perfmon→ 左侧导航至「监视工具」→ 「性能监视器」 - 点击左上角「+」添加计数器
- 在「性能对象」下拉菜单中选择 UDPv4
- 在下方列表中勾选 Datagrams No Ports/sec
- 点击「添加」→「确定」即可实时查看曲线
补充计数器:IPv4\Datagrams Received Discarded/sec
该计数器反映每秒被 IPv4 协议栈主动丢弃的入站数据报总数(含 UDP 和 TCP)。丢弃原因包括缓冲区满、校验和错误、分片重组失败等,是更广义的接收异常指标。
- 同样在 perfmon 中添加计数器
- 选择性能对象:IPv4
- 勾选:Datagrams Received Discarded/sec
- 建议与
Datagrams No Ports/sec同图对比:若后者占主导,说明是应用未监听端口;若前者显著更高且后者平稳,则需排查网络层问题(如网卡驱动、防火墙拦截、内存压力)
关联排查:结合 UDPv4\Datagrams Received/sec 看比例
单看错误计数器绝对值意义有限。建议同步添加 UDPv4\Datagrams Received/sec,计算丢弃率:
- 公式:(
Datagrams No Ports/sec÷Datagrams Received/sec) × 100% - 正常业务中该比率应趋近于 0%;持续高于 0.5%–1% 就值得调查
- 例如:某 DNS 服务器每秒收 2000 个 UDP 包,
No Ports/sec稳定在 8,则丢弃率为 0.4%,属可接受范围;若突增至 200(10%),则表明大量请求发往了未启用的服务端口
注意点与常见误判
UDP 本身不报告“错误包”——没有 ACK、没有重传、没有连接状态。所谓“错误”实际是操作系统在接收路径上的被动丢弃行为。
-
Datagrams No Ports/sec不代表网络传输出错,只说明本地无服务响应 - 该计数器不区分源 IP 或目的端口,如需定位具体端口,需配合
netstat -anp udp查看当前监听状态,或用 Wireshark 抓包过滤udp && !(udp.port == 53 || udp.port == 123)等排除已知服务端口 - 若发现
Datagrams Received Discarded/sec高但No Ports/sec很低,应检查系统内存、NIC 接收队列长度(Network Interface\Output Queue Length)、或启用 RSS/中断聚合是否失衡



















