我有时通过 VOIP 应用程序拨打电话时会遇到语音中断的情况。由于所有 VOIP 应用程序都使用 UDP 进行数据传输,Linux 中是否有任何工具可以测量数据包丢失量并测量网络性能。
UDP 数据包丢失的一般原因是什么?当出现大量数据包丢失时我需要采取什么措施?
答案1
UDP 丢失的主要原因之一是缓冲区溢出,尤其是在 LAN 中。这些可能发生在交换机中,也可能发生在发送或接收服务器中。在 Linux 上,您可以使用一种机制来验证数据包丢失,即运行以下命令:
watch -n 1 -d 'cat /proc/net/udp'
这将显示类似以下内容的输出,其中最后一列是丢弃的数据包数:
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
然后,您可以尝试多种不同的技巧来解决这些问题(再次使用 Linux 作为示例):
- 确保使用数据的应用有足够的 CPU 可用,
- 确保执行 I/O 的线程尽可能靠近网络设备
- 确保 udp 缓冲区大小足够大,可以容纳数据(同样,您可以观察 watch 命令的输出,看看
tx_queue
或rx_queue
列是否增长),然后使用 sudosysctl -w 'net/ipv4/udp_mem=xxx yyy zzzz'
、 或sysctl -w 'net/core/rmem_default=????'
或增加 udp 缓冲区sysctl -w 'net/core/wmem_default=????'
(注意, xxx、yyyy、zzz 已定义这里
为了推销自己,我创建了一款产品,名为Pontus Vision 线程管理器它会不断自动调整。
答案2
UDP 数据包丢失的一般原因是什么
拥塞(太多数据包)且缺乏 QOS(随机数据包丢失、VoIP 未优先处理)和/或设备故障(线路质量等)。对于前者,请获取支持 QOS 的设备,对于后者,请检查线路(硬件、交换机等)是否有问题。
对于互联网连接,您需要两端都有 QOS 路由器 - 而您不会有(除非您的提供商提供 VoIP,那么他可能已经拥有了基础设施)。也就是说,由于您的下行信道通常比上行信道大得多,因此仅优先考虑下行信道的本地路由器通常“足够好”。
然而,线路质量差是一个很难处理的问题。
答案3
如果您遭遇 UDP 数据包丢失,那么您几乎肯定也会遭遇 TCP 数据包丢失。区别在于 TCP 会重新传输丢失的数据包,而 UDP 则不会。VoIP 应用程序无法重新传输,因为如果它们这样做,信息将不再有用。
我假设您的 VoIP 通话是通过互联网进行的。QoS 可能是必要的,但如果您的互联网连接不正常,它就没有任何用处。使用此丢包测试检查一下。它会告诉你数据包丢失发生的位置,即在 ISP 还是在本地站点。
如果在您的本地站点发现问题,那么是时候检查您的电缆或 DSL 调制解调器是否有良好的信噪比、输出功率和衰减 (DSL)。