Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在Linux中使用多队列NIC_Multithreading_Networking_Network Programming_Multiprocessing_Packet Capture - Fatal编程技术网

Multithreading 在Linux中使用多队列NIC

Multithreading 在Linux中使用多队列NIC,multithreading,networking,network-programming,multiprocessing,packet-capture,Multithreading,Networking,Network Programming,Multiprocessing,Packet Capture,我读过很多关于接收端缩放(RSS)、接收数据包控制(RPS)和类似技术的书,但我不知道如何在程序中实际使用这些技术,即在不同线程/进程之间划分传入数据包 我确实知道PF_环,但我想Linux内核本身肯定有一些基本的支持。毕竟,Interl在其网站上吹嘘其RSS技术,并声称支持Linux。此外,RPS不在PF_环的范围内。我不愿意使用PF_RING的另一个原因是,他们已经修补了网络驱动程序,而且有些修补的驱动程序似乎已经过时了 我在谷歌上搜索过这个主题,但我发现最好的是启用RSS或RPS支持,而不

我读过很多关于接收端缩放(RSS)、接收数据包控制(RPS)和类似技术的书,但我不知道如何在程序中实际使用这些技术,即在不同线程/进程之间划分传入数据包

我确实知道PF_环,但我想Linux内核本身肯定有一些基本的支持。毕竟,Interl在其网站上吹嘘其RSS技术,并声称支持Linux。此外,RPS不在PF_环的范围内。我不愿意使用PF_RING的另一个原因是,他们已经修补了网络驱动程序,而且有些修补的驱动程序似乎已经过时了


我在谷歌上搜索过这个主题,但我发现最好的是启用RSS或RPS支持,而不是如何通过编程使用它们。

内核3.19引入了SO\u传入CPU套接字选项。有了它,进程就可以知道数据包最初被送到哪个CPU

RPS/RFS的替代方案是使用硬件支持多队列

然后将一组一百万个套接字拆分为工作线程,每个工作线程 使用epoll()在其自己的套接字池上管理事件

理想情况下,我们希望每个RX/TX队列/cpu有一个线程,但我们没有办法 在accept()或connect()之后知道套接字位于哪个队列/cpu上 管理

我们通常每个RX队列使用一个cpu(IRQ smp_) 设置),所以记住最后一个cpu交付的套接字结构 数据包足以解决这个问题

在accept()、connect()甚至文件描述符传递之后 流程、应用程序可以使用:

int cpu;socklen_t len=sizeof(cpu)

getsockopt(fd、SOL_套接字、SO_传入_CPU、&CPU、&len)

并使用此信息将套接字放入正确的思洛存储器中,以便 最佳性能,因为所有网络堆栈都应在 适当的cpu,无需发送IPI(RPS/RFS)


[

您根据什么对数据包进行分区?您试图对数据包进行分区的协议是什么(TCP?UDP?)?TCP是我的主要目标(尽管UDP也在计划中).至于分区,据我所知,RSS和RPS基于5元组对数据包进行分区:协议、源地址、目标地址、源端口和目标端口。然后,除非您正在编写内核驱动程序或修改内核,否则您无需做任何事。确定接收到的TCP数据包与哪个连接纯粹是一个内核我想既然RSS是由内核支持的,而且RPS实际上是一个Linux内核工具,那么代码必须已经存在于内核和/或驱动程序中,并且必须有某种方法来使用它!你的问题仍然没有意义。内核会找出TCP包属于哪些连接。你不需要对你做什么特别的事情除了使用支持它们的内核之外,不要使用这些功能。内核如何划分TCP数据包没有回旋余地。只有一种方法可以做到这一点,那就是内核的方式。因此,您无需以编程方式来做任何事情。