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

时间:2018-08-01 01:32:08

标签: linux sockets udp

我的Linux应用程序需要接收单个UDP流,其中包含中等大小的数据包(〜1 KB),速率约为每秒60万个数据包。我当前的实现还很幼稚:它只有一个线程,该线程简单地反复调用recv(),将接收到的数据放在队列中,以便另一个线程处理。因此,接收方线程仅负责提取数据包。

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

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

但是,本文还指出了这一细节:

  

使用基于连接的四元组(即对等IP地址和端口以及本地IP地址和端口)的哈希将传入的连接和数据报分发到服务器套接字。例如,这意味着,如果客户端使用相同的套接字将一系列数据报发送到服务器端口,则这些数据报将全部定向到同一接收服务器(只要它继续存在)。这简化了在客户端和服务器之间进行状态对话的任务。

因此,如果我只有一个UDP流,则上述哈希实现将产生所有定向到同一接收器线程的数据包,从而阻碍了我并行化工作的尝试。因此,问题是:是否可以使用SO_REUSEPORT或其他某种机制从多个线程接收单个UDP数据包流?

请注意,我的应用程序可以处理数据包的重新排序;数据报格式化的协议包含顺序信息,以后可以用来对它们进行重新排序。

0 个答案:

没有答案