2016-06-22 79 views
3

我一直在阅读关于Linux的性能优化,以便在接收金融市场数据时获得最快的数据包处理时间。我看到,当网卡接收到一个数据包时,它通过DMA将其存储在内存中,然后产生一个HardIRQ,然后设置一些NAPI设置并引发一个SoftIRQ。然后,SoftIRQ使用NAPI /设备驱动程序通过轮询从RX缓冲区中读取数据,但这只会在有限的时间内运行(net.core.netdev_budget,默认为300个数据包)。这些都是参照真实服务器运行Ubuntu,与Solarflare的网卡我的问题是如下:Linux上的SoftIRQ和快速数据包处理网络

  1. 如果每个HardIRQ提出了一个软中断,以及设备驱动程序在1个围棋(netdev_budget)读取多个数据包,会发生什么到每一个从RX缓冲区中排出的数据包引发的SoftIRQs(每个包接收到的数据包将会增加一个难度,然后是软irq)?这些排队?

  2. 为什么NA​​PI使用轮询来排空RX_buffer?系统刚生成一个SoftIRQ并正在读取RX缓冲区,那么为什么轮询?

  3. 推测,通过softirq排空RX_Buffer只会从1个特定的RX_Buffer发生,而不会发生在多个RX_Buffers之间?如果是这样,那么增加netdev_budget可以延迟处理/排空其他RX_buffers?或者可以通过将不同的RX_buffers分配给不同的内核来缓解这种情况?

  4. 有一些设置可以确保立即提出并处理HardIRQ。但是,SoftIRQ可能会在稍后处理。是否有设置/配置以确保与网络RX相关的SoftIRQ也以最高优先级处理并且没有延迟?

+0

这可能更适合Linux/Ubuntu Stack Exchange站点之一。 –

回答

3

我写了一个全面的博客文章,解释了回答您的问题和其他一切有关调整,优化,分析,并了解整个Linux网络栈here

问题的答案:而软中断正在处理什么也不做由驾驶员提出

  1. sofirqs。这是因为NAPI帮助程序代码首先检查NAPI是否已在运行,然后尝试提升softirq。即使NAPI没有检查,你也可以用see from the softirq source作为位矢来实现softirqs。这意味着softirq只能是1(待定)或0(未待定)。虽然它设置为1,但将其设置为1的其他呼叫将不起作用。

  2. softirq用于启动NAPI轮询循环并控制NAPI轮询,因此它不会占用100%的CPU使用量。 NAPI轮询循环只是一个for循环,softirq代码管理它可以花多少时间以及它有多少预算。

  3. 每个处理数据包的CPU都可以花费全部预算。因此,如果预算设置为300,并且您有2个CPU,则每个CPU可以处理300个数据包,每个CPU总数为600个。仅当您的NIC支持多个RX队列并且您已将IRQ分配给单独的CPU处理。如果您的NIC没有,您可以使用接收数据包控制来帮助解决此问题(RPS)。有关更多信息,请参阅上面的博文。

  4. 不,这里没有设置。请注意,softirqs在提升它们的相同CPU上运行。因此,如果将RX队列1的硬件处理器设置为CPU 16,则softirq将在CPU 16上运行。你可以做的一件事是:将硬件设置为特定的CPU,并将使用该数据的应用程序设置到相同的CPU上。将所有其他应用程序(如cron作业,后台任务等)固定到其他CPU - 这确保只有硬件处理程序softirq和处理数据的应用程序才能运行。

如果您需要极低的延迟的网络数据包读取,你应该尝试使用新的Linux内核的网络功能,称为busy polling。它可以用来帮助最小化和减少网络数据包处理延迟。使用此选项会增加CPU使用率。

+0

谢谢@ joe-damato。您的博客文章非常有帮助。作为一个后续 - 我有一个太阳耀斑尼克与成对的RX和TX队列(8台,8核心机器),每套共享一个IRQ号码。我用smp_affinity来设置哪个内核被哪个内核处理。但是,这也可以确保发送(tx)中断也由同一个内核处理。这将如何与xps协同工作?还有一种方法可以查看/设置哪个tx队列用于特定的应用程序/ TCP连接? – Nidhi

+0

嗨@Nidhi听起来像这可能需要一个完全独立的问题,而不是评论:)是否有任何东西从我的答案缺失,它被接受? –