vik*_*rgt 5 linux udp multicast packet-loss
我有一个通过多播发送 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 cpus 添加 g++ 编译器标志,这将丢包率降低到 10%,但我认为它仍然太高。
当然我知道UDP不可靠,我有自己的修正协议。
我没有任何管理权限,因此我无法更改系统参数。
任何提示如何提高性能?
编辑:我通过使用 2 个读取套接字的线程解决了这个问题。recv 套接字缓冲区有时仍会变满。但是平均下降不到1%,所以处理起来不是问题。
除了从套接字读取循环中明显删除所有不必要的内容之外:
setsockopt(2),recvmmsg(2)如果您的内核支持,请使用来减少系统调用和内核用户态副本的数量,epoll(7),| 归档时间: |
|
| 查看次数: |
15006 次 |
| 最近记录: |