【包】openstack通信及dpdk

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Li_Jiaqian/article/details/83352253

       测试以下几种数据包在不同端口的捕获情况:

  1. 同一租户,同一计算节点,同一私有网络
  2. 同一租户,同一计算节点,不同私有网络
  3. 同一租户,不同计算节点,同一私有网络
  4. 不同租户,同一计算节点

安装部署dpdk-18.08,分析其cpu、内存占用率。

一.不同租户、不同宿主机数据包捕获

  1. 网络结构:

 

VM1

VM2

VM3

VM4

VM5

租户

demo1

demo1

demo1

demo2

demo1

宿主机

compute1

compute1

compute1

compute1

compute2

Vlan tag

2

2

3

4

2

IP

10.0.1.3

10.0.1.8

10.0.2.10

10.0.1.10

10.0.1.4

 

1.同一租户demo1,同一计算节点compute1,同一私有网络10.0.1.0/24:

VM1 ping VM2:

数据包可以在br-int网桥的patch-tun端口上被捕获到,由于vlan tag相同,是属于同一网络的虚拟机,数据包不会进入br-tun网桥,patch-int端口上无法捕获。

2.同一租户demo1,同一计算节点compute1,不同私有网络10.0.1.0/24以及10.0.2.0/24:

VM1 ping VM3:

由于两部虚拟机是同一租户的不同的私有网络,vlan tag不同,因此将会到达br-tun网桥,br-tun根据自身规则因此两者通信的数据包需要经过网络节点上demo1的路由器(qg-9bf4648c24),再进行转发。

 

3.同一租户demo1,不同计算节点compute1/compute2,同一私有网络10.0.1.0/24:

VM1 ping VM5:

由于两部虚拟机的vlan tag相同,但属于处在不同的宿主机上,因此数据包进入计算节点br-tun网桥的patch-int端口,由br-tun判决,从与另一计算节点相连的端口(vxlan5717/vxlan5716)发出,而不进入网络节点。

4.不同租户demo1/demo2,同一计算节点compute1:

VM1 ping VM4:

Openstack对不同的租户进行隔离,不同租户的虚拟机相互无法通信。如VM1(10.0.1.3)ping VM4(10.0.1.4),ARP请求发送至网络节点上的各个路由器。

 

5.物理机器上抓包方法效率对比:

上周在虚拟机上抓包,丢包较为严重,在物理机上测试,几乎不丢包,tcpdump综合效果最优。

二.dpdk

  1. 中断与轮询:传统方法中每收到一个报文就触发一次中断,开销巨大,因此可以使用NAPI机制解决:首先采用中断唤醒数据接收程序,然后使用轮询一次性处理多个数据,直到网卡接受队列为空才继续打开中断。但是该机制只适合处理大量小数据,若数据包过大,则会退化成中断模式。
  2. c10k问题:应用的用户群体几何倍增长,单机无法承受太多进程,如何突破单机性能.问题本质:创建的进程/线程太多,数据拷贝频繁,进程/线程上下文切换消耗大,导致os奔溃。解决方案:1)为每个连接分配一个独立的进程/线程2)同一个进程/线程同时处理多个连接。
  3. 报文通过内核协议栈转发,如果能让应用程序直接接管网络数据包处理、内存管理以及cpu调度,性能将会得到质的提升。可以提高多核和大内存的扩展性,减少cpu多核之间的任务切换,增大内存命中率。提高网络报文转发率:1)控制层留给linux,其他数据层全都交由应用程序处理,2)减少系统调度、系统调用、系统中断以及上下文切换,3)将数据包直接传送给用户空间定制的协议栈,而不经过内核协议栈,4)使用多核编程替代多线程,将os绑定在指定核上运行,
  4. mbuf(memory buffer):使用mbuf进行报文传输,接收报文并送至上层应用的过程中,报文传输是“零拷贝”,不必拷贝报文内容, 主需要传送mbuf的地址。根据需求不同,可以简化mbuf的设计,如可变长缓存、可以从缓存中移除数据等,于是有人将其简化为一种链表形式的mbuf库,采用零拷贝技术在协议栈各层传递。
  5. (1)DPDK采用纯轮询模式,同时也支持类似NAPI的机制,可以配置何时关闭中断(采用纯轮询),何时轮询结束(打开中断模式)。(2)DPDK工作在用户态,数据通过DPDK的传输可以实现零拷贝,接收到的包全都在用户空间,使用mbuf内存池管理,DPDK空间与用户空间的内存交换不用拷贝,只需要转移控制权。(3)DPDK采用多核编程,每个内核一个线程,内核之间的访问无需上锁,将操作系统绑定在特定的核上,将其余的内核交给应用程序专用,从而最大限度地减少了线程调度的资源消耗。(4)DPDK尽量避免多个核访问同一个内存地址,使用大内存提高命中率。
  6. DPDK的安装:

操作系统:centos7,内存:4G,网卡:NAT模式*3

动态加载驱动igb_uio->设置大内存页->卸载系统网卡驱动->将系统网卡绑定DPDK驱动->运行。

运行其自带的testpmd,可以监测被绑定DPDK驱动的网卡流经数据包数量:

但是,cpu占比严重:

7.DPDK抓包——pdump:

(1)初始化环境

(2)创建网络数据包的缓存池队列及存储结构

(3)初始化抓包端口

(4)读取收到的数据包

(5)保存pcap文件

./dpdk-pdump -- --pdump ‘port=2,queue=*,rx-dev=/tmp/rx.pcap’

 

猜你喜欢

转载自blog.csdn.net/Li_Jiaqian/article/details/83352253