ovs源码阅读--流表查询原理

背景

在ovs交换机中,报文的处理流程能够划分为一下三个步骤:协议解析,表项查找和动做执行,其中最耗时的步骤在于表项查找,每每一个流表中有数目巨大的表项,如何根据数据报文的信息快速的查找到对应的流表项是ovs交换机的一个重要的功能。html

在openflow协议中,支持多级流表的形式,能够类比于将一个复杂的功能进行打散,分解成过个小的功能,实现一个流水线的功能,具体见下图:算法

646470776-5b7d4417222f6_articlex

上图中能够看到,一个数据报文进入后,会通过多个流表,每一个流表负责特定的功能,好比上图中table 1中的流表项只会与数据报文中L2层的信息进行匹配,多个流表的处理使得整个数据报文的查询造成一种流水线的处理方式。segmentfault

ovs流cache设计

首先须要明确的是,ovs中的多级流表存放在用户空间,内核态存放的是流表的缓存,数据报文进入ovs的时候,首先会查询内核态的缓存信息,若是命中则直接执行相应的动做,不然经过netlink的方式发送到用户空间,用户空间查找多级流表,若是用户态命中则将对应的信息丢给内核态进行缓存,不然查询不到,用户态还要继续将报文的信息丢给控制器,由控制器下发对应的规则,有关ovs和控制器之间的关系能够参见个人上一个博客缓存

ovs中关于流表的查询经历了三个过程:ide

microflow cache

microflow cache的思想十分简单,具体见下图:性能

3921078234-5b7d4424ab398_articlex

多级流表的查询过程当中,会将报文与每一个流表的每一个流表项进行匹配,这个过程当中耗费的时间是很大的,microflow cache的想法就是将多级流表查询以后的结果按照必定的表项格式直接缓存到内核态中,而后下次一样的数据报文到达时,直接经过hash的方法在内核态中命中,第二次的时间复杂度为$O(1)$,ui

microflow cache的缺点也很明显:spa

  • 实际存在不少short-lived类型的流量,致使命中率低
  • 因为Mircroflow Cache 基于Hash的精确匹配查表,数据头中微小的改动都会致使没法命中cache(如TTL)

Megaflow Cache

虽然基于microflow cache的流表查询方式,能让数据报文第二次命中的时间复杂度达到$O(1)$,可是其真正的性能瓶颈在于用户空间的查询,如何减小数据报文进入用户态,是一个很重要的问题。设计

为了解决精确匹配的问题,减小数据报文进入用户态,ovs采用了megaflow cache代替了microflow cache的匹配方式,megaflow cache是一种基于TTS(元组空间搜索算法)的实现方式,采用了模糊匹配取代microflow cache的精确匹配,经过增长在内核态中查询的时间(从1次hash查找到k次,仍然是常数时间内,跟TTS算法中表的数量有关),减小数据报文进入用户态的次数,具体会在TTS算法中解释。htm

一种朴素的megaflow cache实现方式就是,将全部多级流表的级联结果存放在内核态中,以下图:

870210584-5b7d4436180d1_articlex

内核态中存放着一张全部流表级联以后的大表,显而易见,这种作法简单粗暴,可是内存的开销也是巨大的。

一种好的作法是,采用’Lazy‘的方式,以下图所示,数据报文首先经过模糊匹配的方式检索内核中的表,若是全部的表都没法命中,则查询用户态,而后将用户态的查询出的全部表项合并成一条表项,再插入到内核态的表中。

2401853394-5b7d444466240_articlex

须要注意的是,上图中megaflow cache是一张表,在实际的ovs实现中,由于采用了TTS,因此megaflow cache是多张表造成的链表。

microflow cache+Megaflow Cache

目前版本的ovs采用的是第三种查询方式,也就是结合microflow cache和Megaflow Cache,其中microflow cache做为一级cache,Megaflow Cache做为二级cache,此时microflow cache中存放的再也不是多级流表返回的结果,而是上一次在Megaflow Cache中命中的索引。

数据报文到达时,首先经过对报文信息hash,查询microflow cache中是否存放着对应的hash值,若是存在则查询对应hash值所指向的索引,这个索引用来定位对应的Megaflow链表中的某一个元素表,而后再在这个元素表中进行查找。

总体的解释起来可能有点拗口,本人也是第一次写博客,对ovs了解的也不够深刻,其中涉及到不少细节也不是很清楚,但愿经过分享的形式同你们交流。

参考资料
[Pfaff B, Pettit J, Koponen T, et al. The Design and Implementation of Open vSwitch[C]//NSDI. 2015, 15: 117-130.](https://www.usenix.org/system...
Open vSwitch流表查找分析
The Design and Implementation of Open vSwitch 做者演讲ppt

做者: yearsj
转载请注明出处: https://segmentfault.com/a/11...
相关文章
相关标签/搜索