gpt4 book ai didi

linux - 我可以使用 SO_REUSEPORT 将单个 UDP 流分发到多个接收器线程吗?

转载 作者:行者123 更新时间:2023-12-04 13:44:21 25 4
gpt4 key购买 nike

我的 Linux 应用程序需要以大约每秒 600,000 个数据包的速度接收一个包含中等大小数据包 (~1 KB) 的 UDP 流。我当前的实现是幼稚的:它有一个简单地调用 recv() 的线程。重复,将接收到的数据放入队列以供另一个线程处理。因此,接收者线程只负责拉入数据包。

在我完成的一些初始测试中,在线程完全利用其 CPU 内核之前,我每秒只能接收 200,000-300,000 个数据包。这显然不足以满足每秒约 600,000 个数据包的目标。

理想情况下,我会找到一些方法来跨多个线程分配数据包接收负载。在寻找问题的解决方案时,我遇到了 SO_REUSEPORT socket option ,它允许多个 TCP/UDP 线程绑定(bind)到同一个 IP/端口组合。起初,这似乎正是我想要的。

不过,文章也指出了这个细节:

Incoming connections and datagrams are distributed to the server sockets using a hash based on the 4-tuple of the connection—that is, the peer IP address and port plus the local IP address and port. This means, for example, that if a client uses the same socket to send a series of datagrams to the server port, then those datagrams will all be directed to the same receiving server (as long as it continues to exist). This eases the task of conducting stateful conversations between the client and server.



因此,如果我只有一个 UDP 流,上面的散列实现将产生所有被定向到同一个接收器线程的数据包,阻碍我并行化工作的尝试。因此,问题是: 有没有办法使用 SO_REUSEPORT 从多个线程接收单个 UDP 数据包流?或其他一些机制?

请注意,我的应用程序可以处理数据包的重新排序;数据报格式化的协议(protocol)包含排序信息,我可以用它来正确地重新排序它们。

最佳答案

如果您在过去 3 年没有找到解决方案,请查看 SO_ATTACH_REUSEPORT_CBPF .我们遇到了完全相同的问题,我们通过附加简单的 BPF 程序来解决它,该程序随机分发数据报 mod n。

关于linux - 我可以使用 SO_REUSEPORT 将单个 UDP 流分发到多个接收器线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51624174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com