3

无法为自己找到这样一个问题的答案:

多核机器上的套接字一般有什么好处/提升。我的意思是可能有某种共享访问从以太网卡驱动程序或 smth 传入内核的数据包队列。

我知道当涉及到 API 调用时,可以有多个线程与一个套接字实例一起工作,但是程序员可以通过读取/写入/关闭/选择等调用来同步和正确播放。所以在那个级别我看到了仅在处理分派的数据包和后处理等方面受益......或者在系统调用期间复制数据包并转移到用户空间之前没有速度提升?

4

2 回答 2

3

多核的好处取决于您的算法如何实现并发。以以太网接收为例,它涉及到 4 个任务。

  1. 收到数据包后,NIC 硬件触发中断,CPU 在中断上下文中处理中断。
  2. 网络堆栈以软件 irq 机制处理 RX 数据包。软件 irq 请求可以在多个 CPU 上同时运行。在网络堆栈 RX 函数中,它将网络缓冲区传递给套接字并唤醒在套接字处挂起的用户线程。
  3. 用户线程唤醒并继续用户应用程序代码接收或处理接收到的网络数据包。

1) 只能在一个 CPU 上运行,2) 可以在多个 CPU 上运行,3) 也可以在多个 CPU 上运行,用于多进程或多线程应用程序。

于 2012-10-23T08:58:01.943 回答
1

继@Greg Inozemtsev 的评论之后。具有多个接收队列的 NIC 可以将传入流量过滤到不同的队列中。每个队列都可以向 CPU 生成一个独特的中断,以通知传入的数据包。可以为每个队列分配一个不同的中断,该中断可以分派到一个唯一的 CPU 内核。

Linux 支持内核中的各种技术,例如:

  • RSS:接收端缩放
  • RPS:接收数据包引导
  • RFS:接收流量转向
  • 加速接收流转向
  • XPS:传输数据包控制

假设所有数据包都在端口 80 上发往您的机器 IP,并且您已经使用socket()listen()在端口 80 上创建了一个套接字。流量从各种源 IP 进入您的 NIC,因此它被散列到多个接收队列中(意味着由于 RSS,硬件中断正在跨多个 CPU 内核传播)。您可以使用本机内核套接字选项 PACKET_FANOUT 将负载分散到应用程序内的多个工作线程中。

如果您查看 3rd 方库NetMapDPDKVPP,作为示例,这些都可以通过将您降至零副本 RX/TX 来进一步扩大规模,但需要注意您需要编写一些网络协议代码您自己取决于您使用的第 3 方库。

这里有很多事情要考虑,在一个 SO 问题中无法涵盖。回答你原来的问题;是的。尽管我试图提供一些额外的信息。

阅读 RSS/RPS/RFS 等:

https://blog.cloudflare.com/how-to-receive-a-million-packets/

进一步阅读与本机 PACKET_FANOUT 和 PACKET_MMAP 相关的内容:

http://kukuruku.co/hub/nix/capturing-packets-in-linux-at-a-speed-of-millions-of-packets-per-second-without-using-third-party-libraries

http://yusufonlinux.blogspot.co.uk/2010/11/data-link-access-and-zero-copy.html?m=1

https://www.kernel.org/doc/Documentation/networking/packet_mmap.txt

进一步阅读 NetMap 作为 3rd 方库的例子

https://blog.cloudflare.com/single-rx-queue-kernel-bypass-with-netmap/

进一步阅读 NUMA 和亲和力:

https://null.53bits.co.uk/index.php?page=numa-and-queue-affinity

https://blog.cloudflare.com/how-to-achieve-low-latency/

于 2017-01-25T19:36:42.020 回答