我有一个通过多播发送 UDP 数据包的服务器和一些列出这些多播数据包的客户端。
每个数据包的大小固定为1040 Bytes,服务器发送的整个数据大小为3GByte。
我的环境如下:
1 Gbit 以太网
40 个节点,1 个发送方节点和 39 个接收方节点。
所有节点都具有相同的硬件配置:2 个 AMD CPU,每个 CPU 有 2 个内核 @2,6GHz
在客户端,一个线程读取套接字并将数据放入队列中。另一个线程从队列中弹出数据并执行一些轻量级处理。
在组播传输过程中,我发现节点侧的丢包率为 30%。通过观察 netstat –su 统计数据,我可以说,客户端应用程序丢失的数据包等于 netstat 输出中的 RcvbufErrors 值。
这意味着所有丢失的数据包都会被操作系统丢弃,因为套接字缓冲区已满,但我不明白为什么捕获线程无法及时读取缓冲区。
在传输过程中,4 个核心中的 2 个核心利用率为 75%,其余核心处于休眠状态。
我是唯一使用这些节点的人,我认为这种机器处理 1Gbit 带宽没有问题。我已经做了一些优化,通过为 amd cpu 添加 g++ 编译器标志,这将丢包率降低到 10%,但在我看来仍然太高了。
我当然知道UDP不可靠,我有自己的修正协议。
我没有任何管理权限,因此我无法更改系统参数。
有什么提示可以提高性能吗?
编辑:
我通过使用两个读取套接字的线程解决了这个问题。有时,recv 套接字缓冲区仍会变满。但平均跌幅在1%以下,处理起来不成问题。
在 Linux 上追踪网络丢失可能有点困难,因为有许多组件可能会发生数据包丢失。它们可以出现在硬件级别、网络设备子系统或协议层。
我写了一篇很详细的博客文章解释如何监控和调整每个组件。在这里总结为一个简洁的答案有点困难,因为有很多不同的组件需要监视和调整。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)