1. OVS 架构总览
1.1 整体架构分层
Open vSwitch (OVS) 采用经典的控制面与数据面分离架构,从上到下依次为:管理面、控制面和数据面。用户空间进程负责策略下发与流表管理,内核模块负责高速包处理。
核心原则: 慢路径(slow path)由用户空间处理,快路径(fast path)由内核模块处理。绝大多数数据包应走内核快路径,避免陷入用户空间。
1.2 用户空间与内核空间分工
OVS 将控制逻辑与数据转发分离,分工明确,避免单点瓶颈:
| 维度 | 用户空间 (ovs-vswitchd) | 内核空间 (openvswitch.ko) |
|---|---|---|
| 职责 | 控制面:流表管理、OpenFlow 协议、学习、策略下发 | 数据面:高速包匹配、转发、隧道封装/解封装 |
| 处理速度 | 慢路径(毫秒级),适合控制报文和首包 | 快路径(微秒级),适合数据流持续转发 |
| 流表类型 | OpenFlow 流表(完整匹配) | Megaflow Cache(掩码匹配,缓存优化) |
| 通信机制 | 通过 Netlink 与内核模块通信 | 通过 Netlink 接收用户空间下发的流表 |
| 典型操作 | ARP 请求、DHCP、首包上送、流表更新 | MAC 转发、IP 路由、VXLAN 封装 |
性能关键: 内核 Megaflow Cache 命中率应保持在 99% 以上。若大量数据包上送用户空间,CPU 开销将急剧上升,导致吞吐下降。
1.3 ovs-vswitchd 与内核模块关系
ovs-vswitchd 是 OVS 用户空间的核心守护进程,openvswitch.ko 是内核数据路径模块。二者通过 Netlink 协议进行双向通信,形成“控制-转发”分离架构。
1.4 关键通信机制:Netlink
Netlink 是 Linux 内核与用户空间进程进行双向数据传输的 socket 机制。OVS 使用 Generic Netlink 家族 定义自定义消息类型,实现流表下发、统计收集、端口管理等功能。
Netlink 优势: 全双工、异步、支持多播,比 ioctl 更灵活,比 procfs 更高效。OVS 内核模块注册为 Netlink 家族 "ovs_datapath",用户空间通过 libnl 库与之通信。
1.5 数据包处理路径概览
一个数据包从网卡到达 OVS 再到最终转发的完整路径如下:
- 物理网卡 接收数据包,通过内核网络栈送入 OVS 内核模块。
- 内核模块 提取包特征,在 Megaflow Cache 中查找匹配。
- Cache 命中 → 直接执行转发动作(如输出端口、隧道封装)。
- Cache 未命中 → 数据包上送用户空间 ovs-vswitchd。
- ovs-vswitchd 在 OpenFlow 流表 中精确匹配,计算转发决策。
- 将新流表通过 Netlink 下发至内核,同时转发该数据包。
- 后续同流数据包直接走 内核快路径,不再上送。
常见误区: 并非所有数据包都走用户空间。生产环境中,首包上送后,后续数千个同流包均在内核完成转发。若观察到大量上送,应检查 Megaflow Cache 大小或流表超时设置。
1.6 架构优势总结
| 优势 | 说明 |
|---|---|
| 高性能 | 内核快路径处理大部分流量,避免用户空间上下文切换开销 |
| 灵活性 | 用户空间可运行复杂控制逻辑(如 OpenFlow、学习交换机) |
| 可扩展 | 支持 VXLAN/Geneve/GRE 等多种隧道,支持硬件卸载 |
| 标准化 | 使用 OpenFlow 协议,兼容多种控制器(如 ODL、ONOS) |
| 可观测性 | 通过 ovs-appctl 和内核统计接口实时监控流表状态 |