【问题标题】:Pushing code towards kernel or user space, for performance reasons?出于性能原因,将代码推向内核或用户空间?
【发布时间】:2013-03-30 18:07:57
【问题描述】:

最初我认为为了让代码更快,最好尝试减少内核和用户空间之间的转换——通过推动更多代码在内核中运行。然而,我在一些类似 SO 的论坛上读到,实际上相反的情况已经完成——更多的代码被推送到用户空间。为什么是这样?这似乎违反直觉?将更多代码放入用户空间仍然需要内核-用户转换,而将代码放入内核并不需要内核-用户转换?

如果有人问-我正在考虑一个处理数据包数据的应用程序。

编辑

所以更多细节,我正在考虑数据包数据何时到达 - 我想重写网络堆栈并删除不适用于我的数据包处理的代码并且零复制 - 将数据包数据放在某个地方用户程序可以尽快访问它。

【问题讨论】:

    标签: c linux performance operating-system kernel


    【解决方案1】:

    从用户模式到内核模式的转换需要一些时间和资源,因此将代码保持在其中一种模式可能会提高性能。

    如前所述:在您的情况下,您拥有的最佳选择可能是尽可能快地获取数据并立即使其在用户区可用并在用户区进行处理...将所有处理移至内核级别在我看来是不必要的......除非你有充分的理由这样做......没有更多信息在我看来你没有理由相信你会在内核模式下比用户模式更快地做到这一点,你所能做的只是不时地进行模式转换,这不应该是相关的。

    【讨论】:

      【解决方案2】:

      内核是一个时间敏感区域,它是您的 ISR、时间滴答例程和硬件关键部分所在的位置。因此,目标是保持内核代码小而紧凑,进入,完成工作,然后退出。

      在您的情况下,您从网络获取数据包,这是一项依赖于硬件的任务(您需要从较低的网络层获取数据),因此获取数据,清除缓冲区,然后通过 DMA 传输将其发送到用户空间;然后在用户空间进行处理。

      根据我的经验:在内核中执行您的代码所获得的性能获得不会超过执行所损失的整体性能更多内核中的代码。

      【讨论】:

      • 对将内核功能移入用户空间所获得的性能有何评论?
      • @mezamorphic - 给你一个更具体的答案的问题是因为它真的取决于很多设计因素。正在完成多少处理,用户空间和内核空间之间缓冲区转换的大小/持续时间/频率,内核进程的优先级等等等。以及您正在查看的性能指标,服务中断的时间,丢失缓冲区的百分比,转换的 CPU 负载(这又取决于移动的字节数和进程的优先级和 CPU 的策略)。如果您询问一些具体代码和指标,我可以给出更好的答案
      • 迈克,如果你能把我链接到一些更详细地描述所有变量的文献(你刚刚提到的),我会自己进去看看吗?当您提到缓冲区时,我认为我们指的是网络堆栈和 nagles 算法等?
      【解决方案3】:

      如果您希望您的代码进入官方内核版本,那么“将其用户模式部分改组到内核中”通常可能是个坏主意。

      当然,如果你能证明这样做是获得更好性能的最佳(主观,我知道)方式,并且成本是可以接受的(就内核中的额外代码而言 -> 更多的维护负担内核,更大的内核->更多关于内核“太大”等的抱怨),然后一定要遵循这条路线。

      但总的来说,最好通过在用户模式下做更多的工作来解决这个问题,并让内核模式任务更小,如果可以的话。在不确切知道您在内核中做什么以及在用户模式下做什么的情况下,很难确定您应该/不应该做什么。但是,例如,将十几个“项目”打包成一个块,即一个请求内核做某事是比调用内核十几次更好的选择。

      针对您描述您在做什么的编辑: 传递一个用户模式内存区域来接收数据,然后在数据包到达时复制到该区域不是更好吗?假设“所有内存都是平等的”[如果不是,那么无论如何你都会遇到“就地使用”的问题],这应该同样有效,在内核中花费的时间更少。

      【讨论】:

      • 不,这与官方内核版本无关——将是我自己的私有实现。我将编辑我的问题并提供更多详细信息。
      猜你喜欢
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 2012-11-15
      相关资源
      最近更新 更多