官网:
https://www.dpdk.org/
https://launchpad.net/kolla
PCI 设备
[查看和列出PCI设备。]
lspci
[网卡驱动程序设置特定的参数]
modprobe xxxx
[查看是否正常运行]
ifconfig
内存 设备
64位Linux通常使用48位来表示虚拟地址空间,43位表示物理地址。
#uname -m
,然后按回车。如果输出是x86_64,那么你的系统就是64位的。如果输出是i386或者i686,那么你的系统是32位的。
用户空间和内核空间被划分为两个空间,每个空间最大支持256TB。
可以通过cat /proc/cpuinfo和cat /proc/meminfo来查看处理器和内存的信息。
CPU亲和性
在多核心CPU中,每个CPU都有自己的缓存和寄存器。为了更好地利用这些硬件资源,可以将特定进程绑定到特定的CPU上,这个过程被称为CPU亲和性设置。
可以使用 taskset
命令来实现CPU亲和性设置。
RDMA内核驱动程序
mlx4_ib、mlx5_ib或mana_ib
modprobe uio_pci_generic
modprobe igb_uio
确保IOMMU已禁用或已设置为passthrough模式。
cat /sys/class/iommu_group/iommu_group*/devices/iommu_group*/uevent
如果输出中包含"enabled",则表示IOMMU已启用。
[禁用]
echo "disabled" | sudo tee /sys/bus/platform/drivers/iommu_v2/control
[如果需要将IOMMU设置为passthrough模式,可以使用以下命令:]
echo "passthrough" | sudo tee /sys/bus/platform/drivers/iommu_v2/mode
C malloc 分配内存
#include
// 分配一个足够大的缓冲区来存储数据包
char *buffer = (char *)malloc(desired_packet_size);
if (buffer == NULL) {
// 处理内存分配失败的情况
}
mmap 分配内存
#include
#include
#include
// 打开一个文件描述符或设备文件
int fd = open("/path/to/file", O_RDWR);
if (fd == -1) {
// 处理文件打开失败的情况
}
// 映射文件到内存中
void *buffer = mmap(NULL, desired_packet_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (buffer == MAP_FAILED) {
// 处理内存映射失败的情况
}
DPDK(Data Plane Development Kit):
是一组快速处理数据包的开发平台及接口。有intel主导开发,主要基于Linux系统,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。
DPDK的作用:
在数据平面应用中为快速处理数据包提供一个简单而完善的架构。在理解此工具集之后,开发人员可以以此为基础进行新的原型设计处理大并发网络数据请求。
当前数据包的处理流程是这样:
数据包到达网卡,网卡发送中断通知CPU,CPU将数据包拷贝到内核空间中,应用程序从内核空间中拷贝数据到用户态空间,数据处理。
在这个过程中数据包处理耗时的操作有:
dpdk解决问题办法:
ovs-dpdk
普通ovs
ovs的架构图:
ovs处理流表的过程是:
1.ovs的datapath接收到从ovs连接的某个网络设备发来的数据包,从数据包中提取源/目的IP、源/目的MAC、端口等信息。
2.ovs在内核状态下查看流表结构(通过Hash),观察是否有缓存的信息可用于转发这个数据包。
3.内核不知道如何处置这个数据包会将其发送给用户态的ovs-vswitchd。
4.ovs-vswitchd进程接收到upcall后,将检查数据库以查询数据包的目的端口是哪里,然后告诉内核应该将数据包转发到哪个端口,例如eth0。
5.内核执行用户此前设置的动作。即内核将数据包转发给端口eth0,进而数据被发送出去。
ovs-dpdk
DPDK加速的OVS与原始OVS的区别在于,从OVS连接的某个网络端口接收到的报文不需要openvswitch.ko内核态的处理,报文通过DPDK PMD驱动直接到达用户态ovs-vswitchd里。
DPDK加速的OVS数据流转发的大致流程如下:
1.OVS的ovs-vswitchd接收到从OVS连接的某个网络端口发来的数据包,从数据包中提取源/目的IP、源/目的MAC、端口等信息。
2.OVS在用户态查看精确流表和模糊流表,如果命中,则直接转发。
3.如果还不命中,在SDN控制器接入的情况下,经过OpenFlow协议,通告给控制器,由控制器处理。
4.控制器下发新的流表,该数据包重新发起选路,匹配;报文转发,结束。
总结
主要区别在于流表的处理。普通ovs流表转发在内核态,而ovs-dpdk流表转发在用户态。
编译工具安装
apt-get update
apt install automake libtool build-essential openssl -y
apt install desktop-file-utils groff graphviz -y
apt install checkpolicy python-sphinx python-twisted-core -y
编译安装dpdk
wget http://dpdk.org/browse/dpdk/snapshot/dpdk-16.11.tar.gz
mkdir -p /usr/src/dpdk
解压并进入目录
make config T=x86_64-native-linuxapp-gcc
make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr/src/dpdk
make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr
编译安装ovs
wget http://openvswitch.org/releases/openvswitch-2.7.0.tar.gz
解压并进入目录
./boot.sh
./configure \
--with-dpdk=/usr/src/dpdk \
--prefix=/usr \
--exec-prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var
make
make install
系统设置
vim /boot/grub2/grub.cfg
找到引导的相应内核参数,在后面添加:iommu=pt intel_iommu=on
linux /vmlinuz-4.4.0-142-generic root=/dev/mapper/ubuntu–vg-root ro recovery nomodeset iommu=pt intel_iommu=on
重启生效
设置dpdk驱动
modprobe uio_pci_generic
dpdk-devbind --bind=uio_pci_generic enp1s0f0
dpdk-devbind --bind=uio_pci_generic enp1s0f1
配置大页
查看当前的hugepage
grep HugePages_ /proc/meminfo
修改hugepage的页数为1024
临时设置大页的方法,重启失效:
echo 1024 > /proc/sys/vm/nr_hugepages
配置保存的设置方法,重启生效:
echo 'vm.nr_hugepages=1024' > /etc/sysctl.d/hugepages.conf
挂载hugepages
mount -t hugetlbfs none /dev/hugepages
启动ovs进程
准备ovs相关路径
mkdir -p /etc/openvswitch
mkdir -p /var/run/openvswitch
删除旧的ovs配置数据和创建新的(可选)
如果不需要旧配置时,可以选择该操作
rm /etc/openvswitch/conf.db
ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
启动ovsdb server
ovsdb-server /etc/openvswitch/conf.db \
-vconsole:emer -vsyslog:err -vfile:info \
--remote=punix:/var/run/openvswitch/db.sock \
--private-key=db:Open_vSwitch,SSL,private_key \
--certificate=db:Open_vSwitch,SSL,certificate \
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir \
--log-file=/var/log/openvswitch/ovsdb-server.log \
--pidfile=/var/run/openvswitch/ovsdb-server.pid \
--detach --monitor
第一次启动ovs需要初始化
ovs-vsctl --no-wait init
初始化dpdk
从ovs-v2.7.0开始,开启dpdk功能已不是vswitchd进程启动时指定–dpdk等参数了,而是通过设置ovsdb来开启dpdk功能
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
自定义一些dpdk的参数(可选)
指定的sockets从hugepages预先分配的内存
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-socket-mem="1024,0"
指定在某些core上运行
ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0x02
查看自定义的dpdk参数
ovs-vsctl get Open_vSwitch . other_config:dpdk-socket-mem
ovs-vsctl get Open_vSwitch . other_config:pmd-cpu-mask
ovs-vsctl get Open_vSwitch . other_config:dpdk-init
启动是vswitchd进程
ovs-vswitchd unix:/var/run/openvswitch/db.sock \
-vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir \
--log-file=/var/log/openvswitch/ovs-vswitchd.log \
--pidfile=/var/run/openvswitch/ovs-vswitchd.pid \
--detach --monitor
ovs工具使用
ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
ovs-vsctl show
把dpdk端口加入网桥
先使用dpdk-devbind命令查看当前已绑定的dpdk网卡,并记住相应的PCI地址
dpdk-devbind --status
ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk options:dpdk-devargs=0000:01:00.0
ovs-vsctl add-port br0 dpdk1 -- set Interface dpdk1 type=dpdk options:dpdk-devargs=0000:01:00.1
完成分割线
到这里就安装完成了,并且两台主机之间可以直接转发数据。
测速
在两主机之间使用iperf工具测速,服务端收集到的测速信息如下:
两主机之间是1000Mb的带宽
iperf -s
原文连接: https://www.cnblogs.com/goldsunshine/p/14260941.html