DPDK 和 Netfilter 的区别
differences between DPDK and Netfilter
我想绕过 Linux 网络堆栈并将原始数据包转换为我在 userland
中的自定义代码并在那里处理它们。
我知道您可以使用 pf-rings
或 DPDK 和其他工具制作自定义驱动程序。但是我不明白为什么我要制作这些类型的驱动程序,而我可以使用 Netfilter 并将我的模块挂接到 NF_IP_PRE_ROUTING
状态并将数据包发送到 userland
。
如果有人能向我解释它们之间的主要区别,那将对我有很大帮助。
DPDK 和 Netfilter 挂钩之间存在巨大差异。当使用 Netfilter
/ 挂钩 NF_IP_PRE_ROUTING
时,您劫持了数据包流,并且 复制 数据包从内核 space 到用户 space。这个副本会造成很大的开销。
当使用 DPDK
时,您实际上是将网卡的数据包缓冲区映射到用户space 内存区域。这意味着内核不是从 NIC 获得中断,而是通过所有队列传递它直到它到达 NF_IP_PRE_ROUTING
,这反过来会根据请求将打包程序复制到用户空间,DPDK
为您提供了可能性从用户space直接访问映射的数据包缓冲区,绕过内核的所有元处理,有效提高性能(以代码复杂性和安全性为代价)。
有多种技术可以获取原始数据包并将它们传送到用户空间应用程序。一如既往的细节中的魔鬼。
如果我们只需要将数据包传送到用户空间应用程序——使用什么解决方案没有区别。 Libpcap,或 tun/taps,或 Netfilter,或 pf-ring,或其他。一切都会好起来的。
但是如果我们需要每秒处理 1 亿个数据包(在 3GHz 上每个数据包约 30 CPU 个周期)——我认为目前除了 DPDK 我们没有其他选择。 Google for "DPDK performance report" 看看。
DPDK 是一个在许多平台(x86、ARM、POWER 等)上运行良好并支持许多 NIC 的框架。不用写驱动,最流行的网卡都支持
还支持管理 CPU 个核心、大页面、内存缓冲区、加密、IP 碎片等。所有这些都旨在能够转发 100 Mpps。如果我们需要这样的性能...
我想绕过 Linux 网络堆栈并将原始数据包转换为我在 userland
中的自定义代码并在那里处理它们。
我知道您可以使用 pf-rings
或 DPDK 和其他工具制作自定义驱动程序。但是我不明白为什么我要制作这些类型的驱动程序,而我可以使用 Netfilter 并将我的模块挂接到 NF_IP_PRE_ROUTING
状态并将数据包发送到 userland
。
如果有人能向我解释它们之间的主要区别,那将对我有很大帮助。
DPDK 和 Netfilter 挂钩之间存在巨大差异。当使用 Netfilter
/ 挂钩 NF_IP_PRE_ROUTING
时,您劫持了数据包流,并且 复制 数据包从内核 space 到用户 space。这个副本会造成很大的开销。
当使用 DPDK
时,您实际上是将网卡的数据包缓冲区映射到用户space 内存区域。这意味着内核不是从 NIC 获得中断,而是通过所有队列传递它直到它到达 NF_IP_PRE_ROUTING
,这反过来会根据请求将打包程序复制到用户空间,DPDK
为您提供了可能性从用户space直接访问映射的数据包缓冲区,绕过内核的所有元处理,有效提高性能(以代码复杂性和安全性为代价)。
有多种技术可以获取原始数据包并将它们传送到用户空间应用程序。一如既往的细节中的魔鬼。
如果我们只需要将数据包传送到用户空间应用程序——使用什么解决方案没有区别。 Libpcap,或 tun/taps,或 Netfilter,或 pf-ring,或其他。一切都会好起来的。
但是如果我们需要每秒处理 1 亿个数据包(在 3GHz 上每个数据包约 30 CPU 个周期)——我认为目前除了 DPDK 我们没有其他选择。 Google for "DPDK performance report" 看看。
DPDK 是一个在许多平台(x86、ARM、POWER 等)上运行良好并支持许多 NIC 的框架。不用写驱动,最流行的网卡都支持
还支持管理 CPU 个核心、大页面、内存缓冲区、加密、IP 碎片等。所有这些都旨在能够转发 100 Mpps。如果我们需要这样的性能...