如何使用DPDK编写DNS服务器?

时间:2013-10-11 08:41:54

标签: linux tcp dns dpdk

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

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

由于DNS服务器处理比TCP查询更多的UDP查询,我打算使用DPDK来处理UDP查询并使用linux net stack来处理TCP查询。
如何在一台机器上执行此操作?

2 个答案:

答案 0 :(得分:1)

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

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

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

这正是我们在我们的应用程序中执行此操作的方式,我们仍然希望为除特定流量之外的所有操作提供Linux网络堆栈。

答案 1 :(得分:1)

Gabe的建议是正确的 - 然而,有一种更好的方法来实现你真正想要的东西。您需要使用分叉驱动程序。

Gabe建议使用KNI的问题是:

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

你的mbuf和内核套接字缓冲区之间会有一个内存拷贝,会影响你的KNI性能。

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