DPDK的虚拟交换机框架OvS

DPDK简介

DPDK是X86平台报文快速处理的库和驱动的集合,不是 网络协议栈,不提供二层,三层转发功能,不具备防火墙ACL功能,但通过DPDK可以轻松的开发出上述功能。

DPDK的优势在于,可以将用户态的数据,不经过内核直接转发到网卡,实现加速目的。主要架构如图所示:.

DPDK的虚拟交换机框架OvS_第1张图片

传统的socket方式与DPDK对比:

DPDK的虚拟交换机框架OvS_第2张图片

DPDK关键技术点:

  1. 使用大页缓存支持来提高内存访问效率。

  2. 利用UIO支持,提供应用空间下驱动程序的支持,也就是说网卡驱动是运行在用户空间 的,减小了报文在用户空间和应用空间的多次拷贝。

  3. 利用LINUX亲和性支持,把控制面线程及各个数据面线程绑定到不同的CPU核,节省了线程在各个CPU核来回调度。

  4. LOCKLESS, 提供无锁环形缓存管理,加快内存访问效率。

  5. 收发包批处理 ,多个收发包集中到一个cache line,在内存池中实现,无需反复申请和释放。

  6. PMD驱动,用户态轮询驱动,可以减小上下文切换开销,方便实现虚拟机和主机零拷贝。

OVS+DPDK

OpenvSwitch 以其丰富的功能,作为多层虚拟交换机,已经广泛应用于云环境中。Open vSwitch的主要功能是为物理机上的VM提供二层网络接入,和云环境中的其它物理交换机并行工作在Layer 2。

传统host ovs工作在内核态,与guest virtio的数据传输需要多次内核态和用户态的数据切换, 带来性能瓶颈.

Ovs+Dpdk和Ovs本身之间的区别可以由下图简单来表示:

DPDK的虚拟交换机框架OvS_第3张图片

在早期OVS的版本中,为缓解多级流表查表慢的问题,OVS在内核态采用Microflow Cache方法。Microflow Cache是基于Hash的精确匹配查表(O(1)),表项缓存了多级查表的结果,维护的是每条链接粒度的状态。Microflow Cache减少了报文进用户态查多级表的次数。一条流的首报文进入用户态查表后,后续的报文都会命中内核中的Microflow Cache,加快了查表速度。但是对于大量短流的网络环境来说,Microflow Cache命中率很低,导致大部分报文仍然需要到用户态进行多级流表查找,因此转发性能提升有限。

而后,为了解决Mircoflow Cache存在的问题,OVS采用Megaflow Cache代替了Mircoflow Cache。与Mircoflow Cache的精确Hash查表不同,Megaflow Cache支持带通配的查表,所以可减少报文至用户空间查表的次数。庾志辉的博客中当时分析的就是关于megaflow的数据结构和查表流程,相关内容不在此赘述,请看上文中的链接。但是,由于OVS采用元组空间搜索(下文介绍)实现Megaflow Cache的查找,所以平均查表次数为元组表的数量的一半。假设元组空间搜索的元组表链为m,那么平均查表开销为O(m/2)。Mircoflow Cache和Megaflow Cache查表开销对比为O(1)< O(m/2)。因此,Megaflow Cache相比于Mircoflow Cache,尽管减少了报文进用户空间查表的次数,但是增加了报文在内核态查表的次数。

为此,OVS当前版本采用Megaflow Cache+Microflow Cache的流Cache组织形式,仍保留了Microflow Cache作为一级Cache,即报文进入后首先查这一级Cache。只不过这个Microflow Cache含义与原来的Microflow Cache不同。原来的Microflow Cache是一个实际存在的精确Hash表,但是最新版本中的Microflow Cache不是一个表,而是一个索引值,指向的是最近一次查Megaflow Cache表项。那么报文的首次查表就不需要进行线性地链式搜索,可直接对应到其中一张Megaflow的元组表。这三个阶段的查表开销如表所示。

DPDK的虚拟交换机框架OvS_第4张图片

DPDK 高性能(user space) 网卡驱动、大页内存、无锁化结构设计,可以轻易实现万兆网卡线速的性能。ovs-dpdk使vm到vm和nic到vm的整个数据传输都工作在用户态,极大的提升了ovs的性能。

另外,ovs-dpdk 结合了DPDK和vhost-user技术的优势。vhost-user是一个用户态的vhost-backend程序,从虚拟机到host上实现了数据零拷贝(zero copy)。

原生ovs与ovs-dpdk比较

(1)原生ovs数据流处理过程如下:

DPDK的虚拟交换机框架OvS_第5张图片

  1. 数据包到达网卡后,上传给Datapath;

  2. Datapath 会检查缓存中的精确流表是否可以直接转发这个包,如果在缓存中没有找到记录,内核通过netlink发送一个upcall给用户空间的vswitchd;

  3. vswitchd检查数据库以查看数据包的目的端口在哪里。这里要操作openflow流表,需要和ovsdb以及ovs-ofctl交互;

  4. 刷新内核态流表内容;

  5. Reinject给datapath,重发数据包;

  6. 再次查询流表,获取数据包精确转发规则后,按规则转发

(2)ovs-dpdk方式:

DPDK的虚拟交换机框架OvS_第6张图片

用户态进程直接接管网卡收发数据,采用“IO独占核”技术,即每个端口分配一个核专门用于数据收发,轮询式处理方式代替中断式处理,显著提高IO性能。

总结:

DPDK的虚拟交换机框架OvS_第7张图片

使用ovs-dpdk

DPDK的虚拟交换机框架OvS_第8张图片

硬件要求

网卡得支持DPDK,见:http://dpdk.org/doc/nics

CPU得支持DPDK, 测试命令:cat /proc/cpuinfo |grep pdpe1gb

不一定非要支持DPDK硬件的网卡,因为DPDK也支持virtio dpdk driver

DPDK的虚拟交换机框架OvS_第9张图片

打开大页支持

hua@node1:~$ cat  /etc/default/grub |grep GRUB_CMDLINE_LINUXGRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on pci=assign-busses"GRUB_CMDLINE_LINUX="transparent_hugepage=never hugepagesz=2M hugepages=64 default_hugepagesz=2M"
hua@node1:~$ mkdir /mnt/hugehua@node1:~$ mount -t hugetlbfs nodev /mnt/hugehua@node1:~$ echo 8192 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepageshua@node1:~$ cat /proc/meminfo |grep HugePages_HugePages_Total:       8192HugePages_Free:        8192HugePages_Rsvd:        0HugePages_Surp:        0hua@node1:~$ grep Hugepagesize /proc/meminfoHugepagesize:       2048 kB

配置网卡使用uio_pci_generic驱动, 虚机可以使用PF去做DPDK port,也可以直通方式使用VF:

DPDK的虚拟交换机框架OvS_第10张图片

至于PF的驱动,可以使用ixgbe,也可以使用DPDK PF driver;对于VF的驱动,可以使用ixgbefv,也可以使用DPDK VF driver. 如果要使用DPDK PF driver需在grub中加上iommu=pt.

如下方式也可以通信:

DPDK的虚拟交换机框架OvS_第11张图片

测试场景搭建

​​​​​​​

sudo ovs-vsctl ovsbr0 br-intsudo ovs-vsctl set bridge ovsbr0 datapath_type=netdevsudo ovs-vsctl add-port ovsbr0 dpdk0 -- set Interface dpdk0 type=dpdk  #Port name shoud begin with dpdk
# 给虚机创建普通ovs port:sudo ovs-vsctl add-port ovsbr0 intP1 -- set Interface intP1 type=internalsudo ip addr add 192.168.10.129/24 dev intP1sudo ip link set dev intP1 upsudo tcpdump -i intP1
# 或给虚机创建vhost-user port:sudo ovs-vsctl add-port ovsbr0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser
# 虚机使用vhost-user portsudo qemu-system-x86_64 -enable-kvm -m 128 -smp 2 \    -chardev socket,id=char0,path=/var/run/openvswitch/vhost-user1 \    -netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce \    -device virtio-net-pci,netdev=mynet1,mac=52:54:00:02:d9:01 \    -object memory-backend-file,id=mem,size=128M,mem-path=/mnt/huge,share=on \    -numa node,memdev=mem -mem-prealloc \    -net user,hostfwd=tcp::10021-:22 -net nic \    /bak/images/openstack_demo.img
# Inside VM: sudo ifconfig eth0 192.168.9.108/24

使用vhost-user方式示意图如下:

DPDK的虚拟交换机框架OvS_第12张图片

dpdk-virtio-net

DPDK的虚拟交换机框架OvS_第13张图片

原文地址:https://blog.csdn.net/qq_15437629/article/details/77887910

DPDK的虚拟交换机框架OvS

  • 0vS三大组件ovs vwitond, ovd-server, oswichn. ko

  • OvS报文处理机制

  • OvS 4种数据路径

  • VXLAN数据协议

dpdk-网络协议栈-vpp-OvS-DDos-虚拟化 系统性学习课程

  • DDos防护

  • OvS虚拟交换机

  • VPP数据包处理框架

  • nff-go的网络开发框架

  • 网络虚拟化virtio

  • spdk 高效磁盘io读写

  • 用户态协议栈

  • c1000k,c10M

32个项目案例

2w+行的手写代码

4个dpdk的技术方向安全,网络,存储,云源生

80+小时的录播时长

【文章福利】:小编整理了一些个人觉得比较好的学习书籍、视频资料共享在君羊:文件里面,有需要的可以自行添加哦!~点击909332607加入(需要自取)
(资料包括:Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化,tcp/ip,plugin,feature,柔性数组,golang,mysql,linux,Redis,CDN等),免费分享~
Dpdk/网络协议栈/ vpp /OvS/DDos/NFV/虚拟化/高性能专家 学习地址:https://ke.qq.com/course/506620

你可能感兴趣的:(dpdk,spdk,ovs,网络)