是否可以将硬件解复用用于高负载网络服务器?

时间:2013-08-23 17:16:44

标签: c++ c multithreading sockets linux-kernel

例如,对于使用TCP / IP的异步IO(使用POSIX轮询/选择或更高级的epoll,kqueue,poll_set,IOCP),网络驱动程序会因不同的中断而启动(硬件解复用器)CPU内核,接收消息并将其转储到内核级别的单个(多路复用器)缓冲区中。然后,我们的线程接受器通过使用epoll / kqueue / poll_set / IOCP从这个单独的缓冲区接收一个消息套接字描述符列表,它们在线程之间反复散布(解复用器)(在线程池中) )在不同的CPU核心上运行。

简称为:硬件中断(硬件解复用器) - >内核空间中的网络驱动程序(多路复用器) - >用户空间中用户的接受者使用epoll / kqueue / poll_set / IOCP(解复用器

是不是更容易,更快,摆脱最后两个链接,只使用“硬件解复用器”?

一个例子。如果网络数据包到达,网卡将中断CPU。在当今的大多数系统中,这些中断分布在核心上。即这项工作是硬件解复用器。收到这样的中断后,我们可以立即处理该网络的消息并等待下一个中断。所有用于解复用的工作都是在硬件级别通过CPU中断完成的。

在Cortex-A5 MPCore中:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0434b/CCHDBEBE.html

在所有Linux中,实时* nix(例如QNX)中是否可行的方法,是否存在使用此方法的公共项目,可能是ngnix?

更新

使用/proc/irq/<N>/smp_affinity简单回答我的问题 - 是的,我可以使用硬件解复用http://www.alexonlinux.com/smp-affinity-and-proper-interrupt-handling-in-linux

但第二次注意 - 这不是一件好事,因为一个数据包的不同部分可以由不同的内核处理,并且可能需要一些时间来缓存同步(L1(CoreX) - > L3-> L1(CoreY) ))缓存一致性:http://www.alexonlinux.com/why-interrupt-affinity-with-multiple-cores-is-not-such-a-good-thing

解:

  • 将不同的以太网适配器(其IRQ)硬绑定到不同的单CPU核心
  • 使用大数据包和小消息,当数据包通常包含完整的消息时

问题:但可能有一些更好的解决方案,一个使用soft-IRQ(没有硬件IRQ)的例子,当我们手动接收来自网络适配器的一批网络数据包时,是吗?

2 个答案:

答案 0 :(得分:2)

你提出了一个相当广泛的问题。

  

...摆脱最后两个链接,只使用“硬件解复用器”?

从您的描述中我了解到您真正想要的是硬件将接收的数据提供给用户的应用程序。不是吗? 这可以通过RDMA来实现。

硬件(网卡)可以在预先分配的缓冲区中提供接收到的数据,而无需CPU参与此过程。

我可以详细说明,但我不确定这个方向是你所要求的。

答案 1 :(得分:2)

使用/proc/irq/<N>/smp_affinity简单回答我的问题 - 是的,我可以使用硬件解复用http://www.alexonlinux.com/smp-affinity-and-proper-interrupt-handling-in-linux

但第二次注意 - 这不是一件好事,因为一个数据包的不同部分可以由不同的内核处理,并且可能需要一些时间来缓存同步(L1(CoreX) - > L3-> L1(CoreY) ))缓存一致性:http://www.alexonlinux.com/why-interrupt-affinity-with-multiple-cores-is-not-such-a-good-thing

解:

  • 将不同的以太网适配器(其IRQ)硬绑定到不同的单CPU核心
  • 使用大数据包和小消息,当数据包通常包含完整的消息时