Performance 将中断关联和io处理线程关联设置为同一个内核是一种好的做法吗?

Performance 将中断关联和io处理线程关联设置为同一个内核是一种好的做法吗?,performance,networking,linux-kernel,interrupt,Performance,Networking,Linux Kernel,Interrupt,我试图了解irq相关性及其对系统性能的影响 我了解到,NIC irq关联应该设置为不同的核心,而不是处理网络数据的核心,因为处理不会被传入的irq中断 我对此表示怀疑,因为如果我们使用不同的内核来处理来自irq内核的数据,那么在尝试从内核检索网络数据时,我们将获得更多的缓存未命中。因此,我实际上相信,通过将irq关联设置为处理传入数据的线程的同一核心,将提高性能,因为缓存未命中率更低 我正试图找出一些验证代码,但在我给出任何结果之前,我是否遗漏了什么 IRQ亲和力是一把双刃剑。根据我的经验,它可

我试图了解irq相关性及其对系统性能的影响

我了解到,NIC irq关联应该设置为不同的核心,而不是处理网络数据的核心,因为处理不会被传入的irq中断

我对此表示怀疑,因为如果我们使用不同的内核来处理来自irq内核的数据,那么在尝试从内核检索网络数据时,我们将获得更多的缓存未命中。因此,我实际上相信,通过将irq关联设置为处理传入数据的线程的同一核心,将提高性能,因为缓存未命中率更低


我正试图找出一些验证代码,但在我给出任何结果之前,我是否遗漏了什么

IRQ亲和力是一把双刃剑。根据我的经验,它可以提高性能,但只能在具有预定义工作负载的非常特定的配置中使用。就您的问题而言,(仅考虑RX路径),通常当NIC卡中断其中一个内核时,在大多数情况下,中断处理程序不会做太多工作,除了触发机制(下半部分、微线程、内核线程或网络堆栈线程)以在某些其他上下文中处理传入数据包。如果相同的数据包处理核心正在处理中断(ISR处理程序做的不多),那么由于上下文切换,它必然会失去一些缓存好处,并可能增加缓存未命中。影响有多大,取决于其他各种因素


在NIC驱动程序中,核心的关联通常与每个RX队列对齐[在不同的核心之间分离每个RX队列处理],这提供了更多的性能优势

控制中断亲缘关系可以有相当多有用的应用程序。很少有人想到这一点

  • 隔离内核-防止I/O负载扩散到任务关键型CPU内核或RT优先级专用的内核上(这些内核上的计划软件IRQ可能会耗尽)
  • 通过在多CPU系统的相关NUMA上保持中断,提高系统性能(吞吐量和延迟)
  • CPU效率-例如,专用CPU、NIC通道及其对单个应用程序的中断将从该CPU中榨取更多的资源,在流量大的情况下大约会多榨取30%。 这可能需要流量控制,以使传入流量成为通道的目标。 注意:如果没有affinity,应用程序似乎可以提供更高的吞吐量,但会将负载溢出到许多内核上)。这得益于缓存局部性和上下文切换预防
  • 延迟-如上所述设置应用程序将使延迟减半(在现代系统上从8us减少到4us)

默认关联是以RR方式将IRQ分发到所有内核的吗?根据您所描述的,从IRQ亲和性中排除处理核心是获得性能优势的一种很有希望的方法。理论上是的,但实际上可能没有多大关系。此外,还有其他获得更好性能的方法,例如联合中断或轮询