参考文献:
https://blog.csdn.net/cloudvtech/article/details/80221236
https://www.jianshu.com/p/000b158c3605
https://www.cnblogs.com/allcloud/p/7756625.html
如有侵权,请联系删除
相关版本配置信息
CenOS 7.2.1511
2核2线程 (4 lcores)
内存4GB
3 NICS
DPDK17.08
安装依赖
yum makecache
yum install -y gcc gcc-c++ kernel.x86_64 net-tools kernel-headers kernel-devel
yum install -y numactl-devel.x86_64 numactl-libs.x86_64
yum install -y libpcap.x86_64 libpcap-devel.x86_64
yum install -y pciutils
注意,要下载和自己内核版本相同的内核头文件。用uname -r
查看内核版本,用yum info kernel-devel
查看是否和自己的内核版本一致,如果一致,则可以通过yum install kernel-devel
直接安装,否则可以通过下载特定的rpm包来安装。(对kernel-headers也是同样处理,版本最好保持一致)
例如本文
需要下载3.10.0-327.el7.x86_64版本的内核头文件,可以到这里查找对应版本的rpm包并进行下载(关键词:kernel-devel):
- 下载安装内核头文件
wget http://vault.centos.org/7.2.1511/os/x86_64/Packages/kernel-devel-3.10.0-327.el7.x86_64.rpm 下载
rpm -ivh kernel-devel-3.10.0-327.el7.x86_64.rpm 安装
如果系统已经安装了较高版本的内核头文件,则需要通过如下命令实现降级:
rpm -Uvh --oldpackage kernel-devel-3.10.0-327.el7.x86_64.rpm
编译时有可能出现找不到内核头文件,则需要重新建立软链接到内核模块
ln -fs /usr/src/kernels/3.10.0-327.el7.x86_64/ /lib/modules/3.10.0-327.el7.x86_64/build
编译安装DPDK
- 下载
wget http://fast.dpdk.org/rel/dpdk-17.08.1.tar.xz 下载
tar -xvJf dpdk-17.08.1.tar.xz 解压
cd dpdk-stable-17.08.1/
vi dpdkenv.rc 创建一个设置环境变量的脚本(方便每次重新打开终端运行dpdk或者编译时source)
dpdkenv.rc 内容如下:
export RTE_SDK=/root/dpdk-stable-17.08.1 DPDK的安装目录
export RTE_TARGET=x86_64-native-linuxapp-gcc DPDK的目标环境目录
-
修改源码(在虚拟机安装的时候)
编译
source dpdkenv.rc
make config T=x86_64-native-linuxapp-gcc
sed -ri 's,(PMD_PCAP=).*,\1y,' build/.config
make
make install T=x86_64-native-linuxapp-gcc
DPDK使用
注:每次重启之后都要重新走一遍DPDK的这套流程(环境变量设置、设置userspace I/O态、挂载大页、绑定网卡)
- Hugepage配置
一般的常规页大小为4K字节,使用大页时页大小设置为2M或1G字节。修改方式如下:
对于2M的页,可以在系统启动后申请分配,1G的内存页在系统启动后是无法申请
对于单NUMA或非NUMA节点的系统,如下命令所示(假设需要1024个2M页,即2GB内存):
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
在一个NUMA机器上,分别在不同node上分配指定数目的内存页:
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
上述命令为每个节点各预留了1024个2M大页,即4GB内存
要想是挂载即使是重启也永久有效,需要/etc/fstab内添加:
挂载2M大页:nodev /mnt/huge hugetlbfs defaults 0 0
挂载1G大页:nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0 - 设置DPDK使用大页内存
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages (1024个2M页)
mkdir /mnt/huge
chmod 777 /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
查看大页内存情况
cat /proc/meminfo | grep Huge
ls /sys/kernel/mm/hugepages -l
mount | grep huge
注:
HugePages_Total:系统当前总共拥有的HugePages数目。
HugePages_Free:系统当前总共拥有的空闲HugePages数目。
HugePages_Rsvd:系统当前总共保留的HugePages数目,更具体点就是指程序已经向系统申请,但是由于
程序还没有实质的HugePages读写操作,因此系统尚未实际分配给程序的HugePages数目。
HugePages_Surp:指超过系统设定的常驻HugePages数目的数目。
Hugepagesize:每一页HugePages的大小。
- 加载内核模块
lsmod | grep uio 显示已载入系统的模块
modprobe uio_pci_generic
modprobe uio
modprobe vfio-pci
insmod build/kmod/igb_uio.ko
lsmod | grep uio
注:卸载模块
rmmod igb_uio.ko
- 绑定网卡
查看网卡ip addr
查看网卡绑定状态
./usertools/dpdk-devbind.py --status
绑定网卡命令
ifconfig eno33554960 down
ifconfig eno50332184 down
./usertools/dpdk-devbind.py --bind=igb_uio 02:02.0
./usertools/dpdk-devbind.py --bind=igb_uio 02:03.0
查看绑定之后状态
ll /dev/uio*
./usertools/dpdk-devbind.py --status
- 运行hellworld程序
make -C examples RTE_SDK=$(pwd) RTE_TARGET=build O=$(pwd)/build/examples
./build/examples/helloworld/build/helloworld
- 运行testpmd
TestPMD可以使用如下几种不同的转发模式。
- 输入/输出模式(INPUT/OUTPUT MODE)
此模式通常称为IO模式,是最常用的转发模式,也是TestPMD启动时的默认模式。 在IO模式下,CPU内核从一个端口接收数据包(Rx),并将其发送到另一个端口(Tx)。 如果需要的话,一个端口可同时用于接收和发送。 - 收包模式(RX-ONLY MODE)
在此模式下,应用程序会轮询Rx端口的数据包,然后直接释放而不发送。 它以这种方式充当数据包接收器。 - 发包模式(TX-ONLY MODE)
在此模式下,应用程序生成64字节的IP数据包,并从Tx端口发送出去。 它不接收数据包,仅作为数据包源。
后两种模式(收包模式和发包模式)对于单独检查收包或者发包非常有用。
除了这三种模式,TestPMD文档中还介绍了其他一些转发模式。
执行命令sudo ./build/app/testpmd –l 0,1,2 –n 4 -- -i
在此例中, –l选项指定了逻辑核。核0用于管理命令行,核1和2将用于转发数据包。 -n选项用于指定系统的内存通道数。–(破折号)分开了EAL参数和应用程序参数。-i选项运行在交互模式(交互模式下通过命令行改变转发配置)
set fwd rxonly 收包模式
set fwd txonly 发包模式
show port stats all 查看端口统计信息
clear port stats all 清除端口统计信息
show config fwd 查看转发配置
set nbcore 2 启用两个核转发
查看转发配置 show config fwd
开始转发
start
查看端口统计信息
show port stats all
结束转发
stop