2

我想使用 Intel DPDK 编写一个高性能的 DNS 服务器。如何使用英特尔 DPDK 有效地处理 TCP 数据包?

当然,在 DPDK 上实现网络堆栈是解决方案。但这太复杂了。

由于 DNS 服务器处理的 UDP 查询比 TCP 查询多得多,我打算使用 DPDK 处理 UDP 查询并使用 linux net stack 处理 TCP 查询。
我怎样才能在一台机器上做到这一点?

4

2 回答 2

2

Gabe 的建议是正确的——但是有更好的方法来实现你真正想要的。您需要使用分叉驱动程序。

Gabe 建议的使用 KNI 的问题是:

它是您在用户空间中的软件,它将决定它需要保留什么(UDP)以及需要通过网络堆栈(TCP)路由什么。然后,您将通过 DPDK 软件环将它们传递给内核,这会消耗 CPU 和内存周期。

在您的 mbuf 和内核套接字缓冲区之间会有一个内存副本,这会影响您的 KNI 性能。

另请注意,如果您在用户空间中处理 UDP,则需要在将数据包推出之前构建 L2 标头。这意味着您可能还需要捕获所有 ARP 数据包,以便构建您的 ARP 缓存,因为您将需要它来构建 L2 标头。

于 2015-07-03T08:46:14.627 回答
1

查看 DPDK 中的KNI文档和内核 NIC 接口示例

分配 KNI 设备后,在主 DPDK 轮询循环中,您将从 NIC 拉出数据包。您必须自己解析标头,或者您可能会花哨并设置多个 RX 队列,然后使用 RSS 5 元组过滤器将 UDP 数据包发送到您的处理队列,其余的发送到默认队列。

无论如何,无论选择哪种方法,如果它是一个 UDP 数据包,您可以自己处理它(如您所要求的);否则,您会将数据包排队到 KNI 线程。您还需要 KNI 接口的另一半,从 KNI 线程轮询数据包,并将其发送到接口。

这正是我们在我们的应用程序中这样做的方式,我们仍然需要一个 linux 网络堆栈来处理除特定流量之外的所有操作。

于 2014-06-23T17:15:17.873 回答