Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理一个IP数据包最多可以使用多少个不同的CPU核?_C_Sockets_Tcp_Linux Kernel_Linux Device Driver - Fatal编程技术网

处理一个IP数据包最多可以使用多少个不同的CPU核?

处理一个IP数据包最多可以使用多少个不同的CPU核?,c,sockets,tcp,linux-kernel,linux-device-driver,C,Sockets,Tcp,Linux Kernel,Linux Device Driver,例如,我们有一个8核的CPU。 当一个IP数据包通过Eth0->TCP/IP->App(排除应用程序中的处理)时,最多可以使用多少个不同的CPU核来处理它 例如,可能是3个CPU核: 过程硬件中断 进程校验和计算 进程复制内核空间->用户空间(其指针已发送到套接字) 这对性能非常重要,因为内核之间的每次数据传输都非常昂贵。一般来说,您将在一个内核上处理中断,处理中断所涉及的实际内核工作可能发生在另一个内核上,最后将其交给在第三个内核上运行的应用程序。在某些操作系统上,您可以设置进程关联性和中断处

例如,我们有一个8核的CPU。 当一个IP数据包通过Eth0->TCP/IP->App(排除应用程序中的处理)时,最多可以使用多少个不同的CPU核来处理它

例如,可能是3个CPU核:

  • 过程硬件中断
  • 进程校验和计算
  • 进程复制内核空间->用户空间(其指针已发送到套接字)

  • 这对性能非常重要,因为内核之间的每次数据传输都非常昂贵。

    一般来说,您将在一个内核上处理中断,处理中断所涉及的实际内核工作可能发生在另一个内核上,最后将其交给在第三个内核上运行的应用程序。在某些操作系统上,您可以设置进程关联性和中断处理程序关联性,以避免数据来回跳转。

    这是一个非常有趣的问题。我不确定你为什么要这么做,但从内核设计的角度来看,这很有趣。在我看来,一种更简单、更有效的并行方法是让不同的内核处理不同的数据包。2和3可以从和CPU上卸载。如果你能在每次中断中处理多个数据包,你可以分摊1的成本。大多数硬件已经支持2。3依赖于系统设计,但难以避免。它也由堆栈的不同部分完成。Do完全忽略数据包的处理是在不同的级别上完成的,因此在不同的模块中。至少原始以太网帧通常不会移动到用户空间或从用户空间移出。一般来说,内核应该保持局部性,但这不是以太网帧的问题。@John Hascall是的,我可以使用NAPI进行一步irq合并。但是硬件解复用(当不同的核心在不同的数据包上工作时)需要使用大帧(JIMBO)和小IP数据包,当一个以太网帧包含整个1个IP数据包时,或者每个CPU核心使用1个Eth:这个问题正是关于:这些步骤有多昂贵,在这些步骤中,核心之间的数据传输使用以太网适配器和硬件TCP卸载引擎(卸载一些步骤)。不确定“核心之间的数据传输”是什么意思。除了一些管理数据外,核心之间的传输量不大,除非您指的是NUMA系统体系结构。虽然这个问题非常有趣,但对于太多的变量来说,这个问题太宽泛了。这不是一个讨论论坛。