了解 OVS

一、Open vSwitch 介绍

1、介绍

在过去,数据中心的服务器是直接连在硬件交换机上。后来 VMware 实现了服务器虚拟化技术,使虚拟服务器(VMs)能够连接在虚拟交换机上,借助这个虚拟交换机,可以为服务器上运行的 VMs 或容器提供逻辑的虚拟的以太网接口,这些逻辑接口都连接到虚拟交换机上,有三种比较流行的虚拟交换机:

  • VMware virtual switch
  • Cisco Nexus 1000V
  • Open vSwitch 

Open vSwitch(OVS)是运行在虚拟化平台上的虚拟交换机, 其支持 OpenFlow 协议,也支持gre / vxlan / IPsec 等隧道技术。 在 OVS 之前,基于 Linux 的虚拟化平台比如 KVM 或 Xen 上,缺少一个功能丰富的虚拟交换机,因此 OVS 迅速崛起并开始在 Xen / KVM 中流行起来,并且应用于越来越多的开源项目, 比如 openstack neutron 中的网络解决方案。

在虚拟交换机的 Flow 控制器或管理工具方面,一些商业产品都集成有控制器或管理工具,比如

  • Cisco 1000V 的 Virtual Supervisor Manager(VSM)
  • VMware 的分布式交换机中的 vCenter。

而 OVS 则需要借助第三方控制器或管理工具实现复杂的转发策略。 例如 OVS 支持 OpenFlow 协议,我们就可以使用任何支持 OpenFlow 协议的控制器来对 OVS 进行远程管理。 OpenStack Neutron 中的 ML2 插件也能够实现对 OVS 的管理。 但这并不意味着 OVS 必须要有一个控制器才能工作。在不连接外部控制器情况下,OVS 自身可以依靠 MAC 地址学习实现二层数据包转发功能,就像 Linux Bridge。

在基于 Linux 内核的系统上,应用最广泛的还是系统自带的虚拟交换机 Linux Bridge,它是一个单纯的基于 MAC 地址学习的二层交换机,简单高效,但同时缺乏一些高级特性,比如 OpenFlow、VLAN tag、QOS、ACL、Flow 等,而且在隧道协议支持上,Linux Bridge 只支持 vxlan,OVS 支持 gre / vxlan / IPsec 等,这也决定了 OVS 更适用于实现 SDN 技术。

2、OVS 支持以下 features

  • 支持 NetFlow、IPFIX、sFlow、SPAN / RSPAN 等流量监控协议
  • 精细的 ACL 和 QoS 策略
  • 可以使用 OpenFlow 和 OVSDB 协议进行集中控制
  • Port bonding、LACP、tunneling(vxlan / gre / Ipsec)
  • 适用于 Xen、KVM、VirtualBox 等 hypervisors
  • 支持标准的 802.1Q VLAN 协议
  • 基于 VM interface 的流量管理策略
  • 支持组播功能
  • flow-caching engine(datapath模块) 

二、OVS 架构

1、OVS 整体架构

用户空间主要组件如下:

  • 数据库服务 ovsdb-server
  • 守护进程 ovs-vswitchd
  • kernel 中是 datapath 内核模块

最上面的 Controller 表示 OpenFlow 控制器,控制器与OVS是通过OpenFlow协议进行连接,控制器不一定位于 OVS 主机上。

2、ovs-vswitchd

ovs-vswitchd 守护进程是 OVS 的核心部件,它和 datapath 内核模块一起实现 OVS 基于流的数据交换。 作为核心组件,

使用 openflow 协议与上层 OpenFlow 控制器通信
使用 OVSDB 协议与 ovsdb-server 通信

使用 netlink 和 datapath 内核模块通信

ovs-vswitchd 在启动时会读取 ovsdb-server 中配置信息,然后配置内核中的 datapaths 和所有OVS switches,当 ovsdb 中的配置信息改变时(例如使用 ovs-vsctl 工具),ovs-vswitchd 也会自动更新其配置以保持与数据库同步。

# ps -ef |grep ovs-vs
root     22176 22175  0 Jan17 ?        00:16:56 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-vswitchd 需要加载 datapath 内核模块才能正常运行。它会自动配置 datapath flows,因此我们不必再使用 ovs-dpctl 去手动操作 datapath,但 ovs-dpctl 仍可用于调试场合。

在 OVS 中,ovs-vswitchd 从 OpenFlow 控制器获取流表规则,然后把从 datapath 中收到的数据包在流表中进行匹配,找到匹配的 flows 并把所需应用的 actions 返回给datapath, 同时作为处理的一部分,ovs-vswitchd 会在 datapath 中设置一条 datapath flows 用于后续相同类型的数据包可以直接在内核中执行动作,此 datapath flows 相当于 OpenFlow flows 的缓存。 对于 datapath 来说,其并不知道用户空间 OpenFlow 的存在。datapath 内核模块信息如下

# modinfo openvswitch
filename:       /lib/modules/3.10.0-327.el7.x86_64/kernel/net/openvswitch/openvswitch.ko
license:        GPL
description:    Open vSwitch switching datapath
rhelversion:    7.2
srcversion:     F75F2B83324DCC665887FD5
depends:        libcrc32c
intree:         Y
...

3、ovsdb-server

ovsdb-server 是 OVS 轻量级的数据库服务,用于整个 OVS 的配置信息,包括接口 / 交换内容 / VLAN 等,OVS 主进程 ovs-vswitchd 根据数据库中的配置信息工作,下面是 ovsdb-server 进程详细信息。

ps -ef |grep ovsdb-server
root     22166 22165  0 Jan17 ?        00:02:32 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

/etc/openvswitch/conf.db 是数据库文件存放位置,文件形式存储保证了服务器重启不会影响其配置信息,ovsdb-server 需要文件才能启动,可以使用 ovsdb-tool create 命令创建并初始化此数据库文件 --remote=punix:/var/run/openvswitch/db.sock 实现了一个 Unix sockets 连接,OVS 主进程ovs-vswitchd 或其它命令工具(ovsdb-client)通过此 socket 连接管理 ovsdb。

/var/log/openvswitch/ovsdb-server.log 是日志记录。

4、OpenFlow

OpenFlow 是开源的用于管理交换机流表的协议。OpenFlow 在 OVS 中的地位可以参考上面架构图,它是 Controller 和 ovs-vswitched 间的通信协议。 需要注意的是,OpenFlow 是一个独立的完整的流表协议,不依赖于 OVS,OVS 只是支持 OpenFlow 协议, 有了支持,我们可以使用OpenFlow 控制器来管理 OVS 中的流表,OpenFlow 不仅仅支持虚拟交换机,某些硬件交换机也支持 OpenFlow 协议。

OVS 常用作 SDN 交换机(OpenFlow交换机),其中控制数据转发策略的就是 OpenFlow flow。OpenStack Neutron 中实现了一个 OpenFlow 控制器用于向 OVS 下发 OpenFlow flows 控制虚拟机间的访问或隔离。 本文讨论的默认是作为 SDN 交换机场景下。

OpenFlow flow 的流表项存放于用户空间主进程 ovs-vswitchd 中,OVS 除了连接 OpenFlow 控制器获取这种 flow, 文章后面会提到的命令行工具 ovs-ofctl 工具也可以手动管理 OVS 中的OpenFlow flow,可以查看 man ovs-ofctl 了解。

在 OVS 中,OpenFlow flow 是最重要的一种 flow,然而还有其它几种 flows 存在,文章下面 OVS概念部分会提到。

5、Controller

Controller 指 OpenFlow 控制器。 OpenFlow 控制器可以通过 OpenFlow 协议连接到任何支持OpenFlow 的交换机,比如 OVS。 控制器通过向交换机下发流表规则来控制数据流向。 除了可以通过 OpenFlow 控制器配置 OVS 中 flows,也可以使用 OVS 提供的 ovs-ofctl 命令通过 OpenFlow协议去连接 OVS,从而配置 flows,命令也能够对 OVS 的运行状况进行动态监控。

6、Kernel Datapath

下面讨论场景是 OVS 作为一个 OpenFlow 交换机。

datapath 是一个 Linux 内核模块,它负责执行数据交换。关于 datapath,The Design and Implementation of Open vSwitch 中有描述:

The datapath module in the kernel receives the packets first, from a physical NIC or a VM’s virtual NIC.
Either ovs-vswitchd has instructed the datapath how to handle packets of this type, or it has not.
In the former case, the datapath module simply follows the instructions, called actions, given by ovs-vswitchd, which list physical ports or tunnels on which to transmit the packet.
Actions may also specify packet modifications, packet sampling, or instructions to drop the packet. 
In the other case, where the datapath has not been told what to do with the packet, it delivers it to ovs-vswitchd. In userspace, ovs-vswitchd determines how the packet should be handled, then it passes the packet back to the datapath with the desired handling. 
Usually, ovs-vswitchd also tells the datapath to cache the actions, for handling similar future packets.

为了说明 datapath,来看一张更详细的架构图,图中的大部分组件上面都有提到 

用户空间 ovs-vswitchd 和 内核模块 datapath 决定了数据包的转发。

首先,datapath 内核模块收到进入数据包(物理网卡或虚拟网卡), 然后查找其缓存(datapath flows), 当有一个匹配的 flow 时它执行对应的操作, 否则 datapath 会把该数据包送入用户空间由 ovs-vswitchd 负责在其 OpenFlow flows 中查询(上图中的 First Packet),ovs-vswitchd 查询后把匹配的 actions 返回给 datapath 并设置一条 datapath flows 到 datapath 中, 这样后续进入的同类型的数据包(上图中的 Subsequent Packets)因为缓存匹配会被datapath 直接处理,不用再次进入用户空间。

datapath 专注于数据交换,它不需要知道 OpenFlow 的存在。与 OpenFlow 打交道的是 ovs-vswitchd,ovs-vswitchd 存储所有 Flow 规则供 datapath 查询或缓存。

虽然有 ovs-dpctl 管理工具的存在,但我们没必要去手动管理 datapath,这是用户空间 ovs-vswitchd 的工作。

转载(原博客内容更完善):SDN实验---OVS了解(转载) - 山上有风景 - 博客园

(SAW:Game Over!)

<think>嗯,用户想了解OVS-DPDK的工作原理。我需要先回顾一下之前提供的参考资料,然后整理出一个清晰的解释。首先,OVS-DPDK是Open vSwitch结合DPDK的优化版本,对吧?根据引用[2],DPDK加速的OVS和原始OVS的主要区别在于数据路径的处理。原始OVS需要通过内核模块openvswitch.ko处理数据包,而OVS-DPDK通过DPDK的PMD驱动直接将报文送到用户态的ovs-vswitchd进程,避免了内核态的开销。 接下来,用户态快速路径dpif-netdev取代了原来的内核datapath,这一点在引用[4]中提到过。这意味着数据包处理完全在用户空间进行,利用DPDK的高性能特性。然后,关于流表查询,引用[1]提到使用Classifier进行流表匹配,这应该涉及到高效的哈希算法或查找结构,比如元组空间搜索算法,以快速匹配流表项。 另外,OVS-DPDK的架构可能包括主线程负责管理,而数据面线程负责实际的包处理。这些线程绑定到特定的CPU核心,减少上下文切换,提升性能。还有内存管理方面,DPDK使用大页内存和内存池技术,减少内存分配的开销,确保零拷贝传输,这点可能需要在回答中详细说明。 用户可能还关心OVS-DPDK的优化点,比如流缓存、批处理、多队列等,这些在性能优化中很重要。同时,应用场景如NFV、云计算中的虚拟网络也是需要提到的部分,结合引用[3]中的安装和概述资料。 需要确保回答结构清晰,分点解释,比如架构变化、数据流向、流表处理、性能优化等。同时,生成的相关问题要围绕用户可能进一步想了解的内容,比如性能优化方法、与内核OVS的区别、适用场景等。检查是否有遗漏的关键点,比如零拷贝、CPU亲和性等,确保覆盖所有重要方面。</think>### OVS-DPDK工作原理详解 OVS-DPDK是Open vSwitch(OVS)结合Data Plane Development Kit(DPDK)技术实现的高性能用户态虚拟交换机,其核心目标是通过绕过内核协议栈来提升数据包处理效率。以下是其关键工作原理: --- #### 1. **架构变化** - **用户态数据路径**:OVS-DPDK使用`dpif-netdev`模块替代传统OVS的内核态`datapath`和用户态`dpif-netlink`,使数据包处理完全在用户空间完成,避免了内核态与用户态之间的上下文切换开销[^4]。 - **DPDK PMD驱动**:网络接口通过DPDK的Poll Mode Driver(PMD)直接管理,报文从物理网卡或虚拟网卡(如vhost-user)通过DPDK PMD直接进入用户态,无需内核参与[^2]。 --- #### 2. **数据流向** 1. **收包阶段**: 报文通过物理网卡或虚拟网卡(如vhost-user)进入,由DPDK PMD驱动直接传递给用户态的`ovs-vswitchd`进程。 2. **流表匹配**: 使用`Classifier`模块进行流表查询,通过元组(如五元组)匹配流表项。若命中流表,则按流表动作(如转发、修改字段)处理;若未命中,则上送控制面生成新流表项[^1]。 3. **转发处理**: 处理后的报文通过DPDK PMD发送到目标端口(如另一个虚拟机或物理网卡)。 --- #### 3. **流表处理优化** - **高效匹配算法**:采用哈希表或元组空间搜索算法(TSS)加速流表查询。 - **流缓存机制**:频繁访问的流表项缓存在快速路径中,减少控制面交互。 - **批量处理**:DPDK支持报文批量处理(如一次处理32个包),降低单包处理开销。 --- #### 4. **性能优化技术** - **零拷贝技术**:DPDK通过内存池(`mempool`)和大页内存(HugePages)实现报文内存零拷贝。 - **CPU亲和性**:将PMD线程绑定到专属CPU核心,减少缓存失效和线程切换。 - **多队列优化**:为每个CPU核心分配独立队列,避免资源竞争。 --- #### 5. **应用场景** - **NFV(网络功能虚拟化)**:为虚拟机或容器提供高性能虚拟网络。 - **云计算网络**:在OpenStack等平台中实现低延迟的虚拟交换机。 - **边缘计算**:适用于需要高吞吐量的边缘网关场景[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值