此查询与多核处理器中的数据包处理有关。数据包处理可以在 Linux 或纯数据路径中进行。如果数据包处理应用程序是在 Linux 上,那么它是否必须是基于中断的数据包处理以获得高性能,但如果数据包处理是在纯数据路径(没有 linux)中,那么应该使用轮询来获得更高的性能?如果是,为什么/如何?
2 回答
投票
我们到了吗?我们到了吗?我们到了吗?我们到了吗?我们到了吗?...完成后中断
Ping 我。
因此,中断允许 CPU 执行其他工作,而轮询避免了中断的开销(如果您每秒被中断数万次,这很重要)。各种高性能。
请注意,有一些混合方法,即:在中断后轮询几毫秒,然后再恢复到中断。
如果您使用的是多任务操作系统,那么轮询将带来延迟损失(如果数据包在另一个任务正在执行时到达)。因此,您可以通过在此类系统上使用基于中断的方法来获得更好的吞吐量。这是因为中断机制可以将数据路径的优先级提升到高于其他进程而不阻塞它们(因为在高优先级任务中轮询会阻塞所有低优先级任务)。
如果您在没有操作系统的裸机嵌入式系统上运行,您应该能够使用轮询获得最佳吞吐量,因为 CPU 可以花费所有时间检查新数据包或根据收到的数据包进行处理。这最大限度地减少了延迟并为数据包处理分配了最大的周期。在这种情况下,调用中断处理程序会浪费周期并引入额外的复杂性;因为 CPU 上没有其他任何东西在运行,所以您采用的任何周期都是未用于处理数据路径的周期。
请注意,这并不意味着应用程序的总体性能更好,或者任何特定的实现使用轮询更快。这仅意味着通过轮询实现最大吞吐量。例如,如果您的应用程序需要进行大量处理,您可能会使用带中断的 DMA 获得更好的性能。要知道在任何特定情况下轮询是否更快,很大程度上取决于该情况的应用程序特性。
我不确定这个问题的“多核”方面是什么,但是将 CPU 专用于 I/O 轮询以在嵌入式多核系统中获得最小延迟是有意义的,尽管这也是高度特定于应用程序的。
正如 ninjalj 所说,混合方法可用于优化更复杂场景中的总体性能。以上仅适用于简单情况。