2024年5月24日发(作者:厚芳华)
前言
DPDK是专为快速收发包所开发的一系列的库文件和驱动代码。可以在Intel的芯片上
运行。可以用来
在极短的时间里面完成收发包(一般低于80个周期)
可以开发快速的抓包算法。
可以运行第三方的快速路径栈
而DPDK最大的优点就是改进小封包吞吐量与作业负荷效能,传统的网路架构都是针对
大封包吞吐量进行最佳化,而Intel® DPDK可以解决小封包所带来效能不佳的问题。
除了应用在企业终端外, Intel DPDK 也可以在软体定义网路 (SDN) 与网路功能虚拟化
(NFV) 中扮演着重要的角色。
本文主要是对官方提供的《intel-dpdk-getting-started-guide Revision-002》进行总结,提
取其中的关键知识点。同时对一些知识点进行了延伸,方便新手对DPDK的一些相关概念
有个基本的认识,对整个DPDK的安装过程有个整体的认识
第一章 一些基本概念
刚开始接触DPDK的时候,会遇到很多基本的概念,通过后面的测试实践发现,很多
时候都是由于基本概念不明导致错误不能被检查出来,所有本文总结了一些相关的概念,同
时对概念下面的一些子概念也进行了一定的延伸。
1.1 Linux环境下的UIO( Userspace I/O )
UIO指的是运行在用户空间的I/O技术,是实现用户空间下驱动程序的支撑机制。
Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即
可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数
功能。使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题。
由于DPDK是应用层平台,所以与此紧密相连的网卡驱动程序(主要是intel自身的千
兆igb与万兆ixgbe驱动程序)都通过uio机制运行在用户态下。 Intel® DPDK 的igb_uio
内核模块依赖于内核的UIO。
需要以模块方式编译
可以通过如下命令进行编译
sudo /sbin/modprobe uio
1.2 大内存页(Hugepages)机制
1.2.1 如何配置大内存页
大内存页指的是为包处理的缓冲区缓冲区分配更大的大内存池,利用大内存页的主要好
处当然是通过利用大内存页提高内存使用效率。
可以得到明显的性能提高,因为需要更少的页,更少的TLB( Translation Lookaside
Buffers),减少了虚拟页地址到物理页地址的转换时间。如果不使用大内存页机制的话,TLB
的命中率会降低,反而会降低性能。
大内存页最好在启动的时候进行分配,这样可以避免物理空间中有太多的碎片,提高发
包的效率。
普通的页大小为4KB, 默认的大内存页的大小为2MB,也可以设置其他的大内存页大
小,可以可以从CPU的标识中看出支持哪种大内存页
如果有 “pse”的标识,说明支持2M的大内存页。 如果有“pdpe1gb”的标识,说明
支持1G的大内存页。 如果64位机建议使用1GB的大页。
比如如果想设置一个4G的大内存页,而且这个大内存页由4个1G大小的页构成,可
以把如下配置传递给内核。
default_hugepagesz=1G hugepagesz=1G hugepages=4
但是如果使用大量的大内存页的话,最好增加当前登录会话打开文件限制,以减少运行
DPDK程序时发生的错误。可以使用ulimit的命令,比如ulimit -Sn 2048。
在两插槽的NUMA系统中, 大内存页会在两个插槽的CPU中进行平均分配。
对于2MB的大内存页的情况,也可以在系统启动以后再进行大内存页的分配。
在NON-NUMA系统, 使用命令echo 1024 > /sys/kernel/mm/hugepages/hugepages-
2048kB/nr_hugepages。
对于NUMA系统, 需要对每个服务器都进行分配,使用命令
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
对于1G的大内存页,不能在系统启动以后进行分配。
1.2.2 如何使用大内存页
如果已经配置好了大内存页机制,就可以让DPDK利用大内存页的机制了。
可以输入如下的命令
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
在运行程序 的时候,最好把分配给大页的所有空间都利用起来。如果DPDK的程序在
运行的时候传递了-m 或者--socket-mem的参数,大内存页的分配在启动的时候会自动加载。
如果传递给程序的内存页数量比程序要求的要少,也就是内存页不够用,程序将会中止。
但是,如果用户要求的内存空间小于预留的内存空间时,同样有可能出现程序崩溃的情况。
原因如下,
假设系统为Socket1 和Socket 0 各预留了1024个大内存页。
如果用户需要128M的内存,也就是64个大内存页,但是这64个大页可能有以下的限
制:
这64个大页可能都被分配给Socket 1,如果用户要求访问Socket 0的内存,程序
中止。为了避免这个问题,尽量使用--socket-mem的选项,而不是-m。
这些页面可能被分配到物理内存的任何地方,尽管Intel® DPDK EAL会尽力分配
临近的内存块,但是还是不可避免的会遇到不临近的情况,在这种情况下可能不能
分配大内存池。
socket-mem这个选项是用来为每个CPU的Socket分配特定的内存大小的。比如--socket-
2024年5月24日发(作者:厚芳华)
前言
DPDK是专为快速收发包所开发的一系列的库文件和驱动代码。可以在Intel的芯片上
运行。可以用来
在极短的时间里面完成收发包(一般低于80个周期)
可以开发快速的抓包算法。
可以运行第三方的快速路径栈
而DPDK最大的优点就是改进小封包吞吐量与作业负荷效能,传统的网路架构都是针对
大封包吞吐量进行最佳化,而Intel® DPDK可以解决小封包所带来效能不佳的问题。
除了应用在企业终端外, Intel DPDK 也可以在软体定义网路 (SDN) 与网路功能虚拟化
(NFV) 中扮演着重要的角色。
本文主要是对官方提供的《intel-dpdk-getting-started-guide Revision-002》进行总结,提
取其中的关键知识点。同时对一些知识点进行了延伸,方便新手对DPDK的一些相关概念
有个基本的认识,对整个DPDK的安装过程有个整体的认识
第一章 一些基本概念
刚开始接触DPDK的时候,会遇到很多基本的概念,通过后面的测试实践发现,很多
时候都是由于基本概念不明导致错误不能被检查出来,所有本文总结了一些相关的概念,同
时对概念下面的一些子概念也进行了一定的延伸。
1.1 Linux环境下的UIO( Userspace I/O )
UIO指的是运行在用户空间的I/O技术,是实现用户空间下驱动程序的支撑机制。
Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用应用程序调用即
可,而UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数
功能。使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题。
由于DPDK是应用层平台,所以与此紧密相连的网卡驱动程序(主要是intel自身的千
兆igb与万兆ixgbe驱动程序)都通过uio机制运行在用户态下。 Intel® DPDK 的igb_uio
内核模块依赖于内核的UIO。
需要以模块方式编译
可以通过如下命令进行编译
sudo /sbin/modprobe uio
1.2 大内存页(Hugepages)机制
1.2.1 如何配置大内存页
大内存页指的是为包处理的缓冲区缓冲区分配更大的大内存池,利用大内存页的主要好
处当然是通过利用大内存页提高内存使用效率。
可以得到明显的性能提高,因为需要更少的页,更少的TLB( Translation Lookaside
Buffers),减少了虚拟页地址到物理页地址的转换时间。如果不使用大内存页机制的话,TLB
的命中率会降低,反而会降低性能。
大内存页最好在启动的时候进行分配,这样可以避免物理空间中有太多的碎片,提高发
包的效率。
普通的页大小为4KB, 默认的大内存页的大小为2MB,也可以设置其他的大内存页大
小,可以可以从CPU的标识中看出支持哪种大内存页
如果有 “pse”的标识,说明支持2M的大内存页。 如果有“pdpe1gb”的标识,说明
支持1G的大内存页。 如果64位机建议使用1GB的大页。
比如如果想设置一个4G的大内存页,而且这个大内存页由4个1G大小的页构成,可
以把如下配置传递给内核。
default_hugepagesz=1G hugepagesz=1G hugepages=4
但是如果使用大量的大内存页的话,最好增加当前登录会话打开文件限制,以减少运行
DPDK程序时发生的错误。可以使用ulimit的命令,比如ulimit -Sn 2048。
在两插槽的NUMA系统中, 大内存页会在两个插槽的CPU中进行平均分配。
对于2MB的大内存页的情况,也可以在系统启动以后再进行大内存页的分配。
在NON-NUMA系统, 使用命令echo 1024 > /sys/kernel/mm/hugepages/hugepages-
2048kB/nr_hugepages。
对于NUMA系统, 需要对每个服务器都进行分配,使用命令
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
对于1G的大内存页,不能在系统启动以后进行分配。
1.2.2 如何使用大内存页
如果已经配置好了大内存页机制,就可以让DPDK利用大内存页的机制了。
可以输入如下的命令
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
在运行程序 的时候,最好把分配给大页的所有空间都利用起来。如果DPDK的程序在
运行的时候传递了-m 或者--socket-mem的参数,大内存页的分配在启动的时候会自动加载。
如果传递给程序的内存页数量比程序要求的要少,也就是内存页不够用,程序将会中止。
但是,如果用户要求的内存空间小于预留的内存空间时,同样有可能出现程序崩溃的情况。
原因如下,
假设系统为Socket1 和Socket 0 各预留了1024个大内存页。
如果用户需要128M的内存,也就是64个大内存页,但是这64个大页可能有以下的限
制:
这64个大页可能都被分配给Socket 1,如果用户要求访问Socket 0的内存,程序
中止。为了避免这个问题,尽量使用--socket-mem的选项,而不是-m。
这些页面可能被分配到物理内存的任何地方,尽管Intel® DPDK EAL会尽力分配
临近的内存块,但是还是不可避免的会遇到不临近的情况,在这种情况下可能不能
分配大内存池。
socket-mem这个选项是用来为每个CPU的Socket分配特定的内存大小的。比如--socket-