【问题标题】:How can I use DPDK to write a DNS server?如何使用 DPDK 编写 DNS 服务器?
【发布时间】:2013-10-11 08:41:53
【问题描述】:

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

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

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

【问题讨论】:

  • 您的标题与您的问题直接矛盾。当然,您真正想要的是实现 IP over DPDK?
  • 是的,UDP/IP 层在 DPDK 之上。有什么建议吗?

标签: linux tcp dns dpdk


【解决方案1】:

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

Gabe 建议使用 KNI 的问题是:

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

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

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

【讨论】:

    【解决方案2】:

    查看 KNI 文档和 DPDK 中的 Kernel NIC Interface example

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多