如何测量和最小化 UDP 数据包丢失

Sup*_*tik 5 networking udp

通过 VOIP 应用程序呼叫时,我有时会遇到语音中断。由于所有的VOIP应用程序都使用UDP进行数据传输,Linux中有没有什么工具可以测量丢包量和测量网络性能。

UDP 数据包丢失的一般原因是什么?当数据包丢失很多时我需要采取什么措施?

小智 5

UDP 丢失(尤其是在 LAN 中)的主要原因之一是缓冲区溢出。这些可能发生在交换机、发送或接收服务器中。在 Linux 上可以使用的一种验证数据包丢失的机制是运行以下命令:

watch -n 1 -d 'cat /proc/net/udp'
Run Code Online (Sandbox Code Playgroud)

这将显示类似于以下内容的输出,其中最后一列是丢弃的数据包数:

Every 1.0s: cat /proc/net/udp                                                                                                                                 Mon Sep 28 15:01:00 2015

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops
11362: 00000000:3443 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 18224 2 ffff880808040000 0
19543: 00000000:D438 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 3809742 2 ffff8808060c8400 0
30819: 00000000:0044 00000000:0000 07 00000000:00000000 00:00000000 00000000     0        0 12644 2 ffff88100f2b0400 0
Run Code Online (Sandbox Code Playgroud)

然后,您可以尝试多种不同的技巧来尝试解决这些问题(再次以 Linux 为例):

  • 确保使用数据的应用程序有足够的可用CPU,
  • 确保执行 I/O 的线程尽可能靠近网络设备
  • 确保 udp 缓冲区大小都足够大以容纳数据(同样,您可以观察 watch 命令的输出以查看tx_queuerx_queue列是否增长),然后使用 sudo sysctl -w 'net/ipv4/udp_mem=xxx yyy zzzz'、 or sysctl -w 'net/core/rmem_default=????'、 or增加 udp 缓冲区sysctl -w 'net/core/wmem_default=????'(注意,xxx ,yyyy,zzz在这里定义

在无耻的自我推销中,我创建了一个名为Pontus Vision Thread Manager 的产品,它可以不断地自动调整。


Tom*_*Tom 1

UDP丢包的一般原因是什么

拥塞(数据包过多)且缺少 QOS(随机数据包丢弃、VoIP 未优先处理)和/或设备故障(线路质量等)。首先,获取支持 QOS 的设备,其次检查线路(硬件、开关,无论如何)因为不好。

对于互联网连接,您需要在两端都有 QOS 路由器 - 但您不会拥有(除非您的提供商提供 VoIP,那么他可能已经拥有适当的基础设施)。也就是说,由于下行通道通常比上行通道大得多,因此仅优先考虑下行通道的本地路由器通常“足够好”。

然而,线路质量差是一个很难处理的问题。