使用SO_REUSEPORT时,从同一客户端获取UDP数据包到同一服务器进程?

原创 287865  2019-07-10 00:00 

我正在编写一个多进程udp服务器,它使用so_reuseport让多个工作进程在同一个端口上侦听。

有一种方法告诉内核我想要一致的数据包传输基于数据包的源地址进行处理?

(服务器需要保持一个小的状态,每个源地址。更容易让状态本地的进程,而不是状态必须在进程之间共享。)

最佳答案:


你应该看看并配置 rps:接收数据包转向

确定rps的目标cpu的第一步是计算数据包的流哈希?地址或端口(2元组或4元组哈希,具体取决于专业人员)母生育酚)。这用作相关数据包流的一致哈希。散列由硬件提供或将在堆栈中计算。

...

每个接收硬件队列都有一个相关的cpus列表,rps可以将数据包排入队列进行处理。对于每个接收到的数据包,从流量哈希模数列表的大小计算列表中的索引。索引的cpu是处理数据包的目标,数据包排队到该cpu的尾部?积压队列。

...

rps在不引入重新排序的情况下在cpus上扩展内核接收处理。如果流量在数据包速率上有所不同,那么将来自同一流的所有数据包发送到同一个CPU的权衡是cpu负载不平衡。

a另一个选项是 intel ethernet flow director

intel ethernet fd支持将接收到的数据包定向到不同队列的高级过滤器,并且可以严格控制平台中的流量。它匹配流处理应用程序运行的流和CPU核心以实现流亲和性,并支持多个参数以实现灵活的流分类和负载平衡。当在应用程序目标路由(atr)模式下运行时,intel ethernet fd本质上是linux *系统上可用的接收流转向的硬件卸载版本,并且当在此模式下运行时,接收数据包转向和接收流转向被禁用。

本文地址:https://www.hedasudi.com/2823.shtml
版权声明:本文为原创文章,版权归 287865 所有,欢迎分享本文,转载请保留出处!