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

例如,对于使用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//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)的例子,当我们从网络适配器手动收到一批网络数据包时,是吗?

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

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

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

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

我可以详细说明,但我不确定这个方向是你在问什么。

简单回答我的问题 – 是的我可以使用 /proc/irq//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内核
  • 当数据包通常完全包含整个消息时,使用大数据包和小消息