名称: OVS 数据库和流量分析 描述: 分析来自 sosreport 的 Open vSwitch 数据
OVS 数据库和流量分析
这个技能提供对通过 sosreport 收集的 Open vSwitch (OVS) 数据的详细分析。它运行在四种模式:
- 默认模式:完全分析 - conf.db + 所有文本文件(需要 ovsdb-tool,如果没有可用则回退到文本文件)
- 数据库模式 (
--db):仅数据库 - 分析 conf.db(需要 ovsdb-tool) - 文本文件模式 (
--flows-only):仅文本文件 - 不需要 ovsdb-tool - 查询模式 (
--query):运行自定义 OVSDB JSON 查询(需要 ovsdb-tool)
何时使用此技能
在以下情况下使用此技能:
- 故障排除数据包丢弃 - 查找命中丢弃的流
- 分析流性能 - 查看按数据包计数的顶部流
- 从 sosreport 分析 OVS 配置
- 故障排除网桥、端口或接口问题
- 调查 DPDK 与内核空间数据路径
- 检查隧道配置(VXLAN、Geneve、GRE)
- 检查端口统计信息(丢弃、错误、流量)
- 映射 Kubernetes pods 到 OVS 接口
先决条件
默认模式(完全分析):
- 必须安装 ovsdb-tool(来自 openvswitch 包)
- 如果未找到 ovsdb-tool,则回退到
--flows-only - Sosreport 包含
sos_commands/openvswitch/目录和conf.db
数据库模式 (--db):
- 必须安装 ovsdb-tool(来自 openvswitch 包)
- 检查:
which ovsdb-tool - Fedora/RHEL:
sudo dnf install openvswitch - Ubuntu/Debian:
sudo apt install openvswitch-common
- 检查:
- Sosreport 包含
conf.db文件
文本文件模式 (--flows-only):
- 无需特殊工具 - 开箱即用!
- Sosreport 包含
sos_commands/openvswitch/目录
查询模式 (--query):
- 必须安装 ovsdb-tool
- 与
--flows-only不兼容
Sosreport 中的文件位置
sosreport 收集:
sosreport-主机名-日期/
├── etc/openvswitch/conf.db (OVS 数据库 - 用于 --db 模式)
├── var/lib/openvswitch/conf.db (备用位置)
└── sos_commands/openvswitch/ (默认模式使用这些)
├── ovs-vsctl_-t_5_show (拓扑)
├── ovs-vsctl_-t_5_list_bridge (网桥详情)
├── ovs-vsctl_-t_5_list_interface (接口详情)
├── ovs-vsctl_-t_5_list_Open_vSwitch (系统信息)
├── ovs-ofctl_dump-flows_<bridge> (OpenFlow 条目)
├── ovs-ofctl_dump-ports_<bridge> (端口统计)
├── ovs-appctl_coverage.show (内部统计)
├── ovs-appctl_upcall.show (数据路径健康状态)
├── ovs-appctl_tnl.ports.show_-v (隧道端口)
└── ...
分析脚本
分析脚本位于:
<插件根目录>/skills/ovs-db-analysis/scripts/analyze_ovs_db.py
实施步骤
步骤 1:定位分析脚本
SCRIPT_PATH=$(find ~ -name "analyze_ovs_db.py" -path "*/sosreport/skills/ovs-db-analysis/scripts/*" 2>/dev/null | head -1)
if [ -z "$SCRIPT_PATH" ]; then
echo "错误: 未找到 analyze_ovs_db.py 脚本。"
exit 1
fi
步骤 2:运行分析
# 默认: 完全分析 - conf.db + 文本文件(需要 ovsdb-tool)
python3 "$SCRIPT_PATH" /路径/到/sosreport-主机名-日期/
# 从存档分析
python3 "$SCRIPT_PATH" /路径/到/sosreport-主机名-日期.tar.xz
# 仅数据库模式(需要 ovsdb-tool)
python3 "$SCRIPT_PATH" /路径/到/sosreport/ --db
# 仅文本文件模式(不需要 ovsdb-tool)
python3 "$SCRIPT_PATH" /路径/到/sosreport/ --flows-only
步骤 3:自定义查询(可选,需要 --db)
对于特定调查,使用原始 OVSDB 查询:
# 查询所有网桥
python3 "$SCRIPT_PATH" /路径/到/sosreport/ --query '["Open_vSwitch", {"op":"select", "table":"Bridge", "where":[], "columns":["name","datapath_type","fail_mode"]}]'
# 查询 VXLAN 接口
python3 "$SCRIPT_PATH" /路径/到/sosreport/ --query '["Open_vSwitch", {"op":"select", "table":"Interface", "where":[["type","==","vxlan"]], "columns":["name","options"]}]'
# 查询带有错误的接口
python3 "$SCRIPT_PATH" /路径/到/sosreport/ --query '["Open_vSwitch", {"op":"select", "table":"Interface", "where":[], "columns":["name","error"]}]'
分析输出
默认模式分析:
| 分析内容 | 源文件 | 描述 |
|---|---|---|
| 系统信息 | ovs-vsctl_-t_5_list_Open_vSwitch |
OVS/DPDK 版本、系统类型、外部 ID |
| 拓扑结构 | ovs-vsctl_-t_5_show |
网桥概览,按类型分组的端口 |
| 网桥详情 | ovs-vsctl_-t_5_list_bridge |
数据路径类型、故障模式、CT 区域 |
| 接口信息 | ovs-vsctl_-t_5_list_interface |
按类型,pod 接口与映射 |
| OpenFlow | ovs-ofctl_dump-flows_* |
流计数、丢弃、顶部流 |
| 端口统计 | ovs-ofctl_dump-ports_* |
RX/TX 丢弃和错误 |
| 隧道信息 | ovs-appctl_tnl.ports.show_-v |
配置的隧道端口 |
| 数据路径健康 | ovs-appctl_upcall.show |
流表使用情况 vs 限制 |
| OVS 统计 | ovs-appctl_coverage.show |
内部计数器(netlink、OVSDB 等) |
OpenFlow 分析功能
| 功能 | 描述 |
|---|---|
| 流计数 | 每个网桥的总流数(总数、丢弃、有命中) |
| 丢弃检测 | 具有 actions=drop 且有数据包命中的流 |
| 顶部流 | 按 n_packets 排序的最活跃流 |
| 表分布 | 每个 OpenFlow 表的流计数 |
| 端口丢弃 | 每个端口的 RX/TX 丢弃计数器 |
| 端口错误 | 每个端口的 RX/TX 错误计数器 |
| 数据路径健康 | 流表使用情况 vs 限制(来自 upcall.show) |
| OVS 统计 | 内部统计信息(netlink、OpenFlow、OVSDB 事务) |
OVN 内部表(忽略这些表中的丢弃)
分析 OVN 管理的网桥(br-int)中的丢弃流时,忽略表 44 和表 64-87 中的丢弃,因为这些是内部 OVN 机制,不是安全策略或真实的数据包丢弃。
⚠️ 注意: OVN 和 OVS 是复杂系统,表映射可能在版本之间更改。始终根据使用的特定 OVN 版本验证丢弃分析。如有疑问,请检查您的版本的 OVN 源代码。
| 表 | 名称 | 目的 |
|---|---|---|
| 44 | CHK_LB_OUTPUT | 环路防止 - 丢弃会回环的数据包(高流量,正常) |
| 64 | SAVE_INPORT | 稍后保存入站端口 |
| 65 | LOG_TO_PHY | 逻辑到物理映射 |
| 66 | MAC_BINDING | MAC 绑定查找 |
| 67 | MAC_LOOKUP | MAC 地址表查找 |
| 68-69 | CHK_LB_HAIRPIN | 负载均衡器发夹检查 |
| 70 | CT_SNAT_HAIRPIN | 连接跟踪 SNAT 发夹 |
| 71-72 | GET/LOOKUP_FDB | FDB(转发数据库)查找 |
| 73-74 | CHK_IN_PORT_SEC | 入站端口安全 |
| 75 | CHK_OUT_PORT_SEC | 出站端口安全 |
| 76-77 | ECMP_NH | ECMP 下一跳处理 |
| 78 | CHK_LB_AFFINITY | 负载均衡器亲和性 |
| 79 | MAC_CACHE_USE | MAC 缓存未命中(高流量,正常) |
| 80 | CT_ZONE_LOOKUP | 连接跟踪区域查找 |
| 81-83 | CT_ORIG_*_LOAD | 连接跟踪原始元组加载 |
| 84 | FLOOD_REMOTE_CHASSIS | 远程机箱洪泛 |
| 85 | CT_STATE_SAVE | 连接跟踪状态保存 |
| 86 | CT_ORIG_PROTO_LOAD | 连接跟踪协议加载 |
| 87 | GET_REMOTE_FDB | 远程 FDB 查找 |
用于故障排除的相关丢弃表:
- 表 9:入站 ACL - 实际策略丢弃(查找
reg0=0x8000) - 表 0:初始分类丢弃
- 表 < 64:通常有意义的丢弃
常见分析场景
1. 故障排除数据包丢弃
# 快速分析(默认模式,无 ovsdb-tool)
python3 "$SCRIPT_PATH" /路径/到/sosreport/
查找:
- 活跃丢弃流部分显示丢弃数据包的流
- 端口统计显示有丢弃/错误的端口
2. 检查 DPDK 配置
# 默认模式从文本文件显示 DPDK 信息
python3 "$SCRIPT_PATH" /路径/到/sosreport/
# 或使用数据库模式进行自定义查询
python3 "$SCRIPT_PATH" /路径/到/sosreport/ --query '["Open_vSwitch", {"op":"select", "table":"Open_vSwitch", "where":[], "columns":["dpdk_initialized","other_config"]}]'
3. 调查 Pod 连接性
接口分析显示 pod 到 OVS 的映射:
- 接口的
external_ids包含iface-id - 接口名称以
_h结尾(veth 主机端)
4. 数据路径健康检查
upcall 统计显示:
数据路径流表健康状态
当前流: 155 / 200,000 (0.1% 已用)
平均值: 156,最大观察值: 215
✓ 流表健康
如果使用率 > 90%,流被过于积极地驱逐。
输出示例
================================================================================
OVS 分析 - sosreport-主机名-2024-01-15
================================================================================
模式: 文本文件分析(不需要 ovsdb-tool)
================================================================================
OVS 系统信息
================================================================================
字段 值
------------------------- --------------------------------------------------
OVS 版本 "3.3.4-62.el9fdp"
数据库版本 "8.5.0"
系统类型 rhcos
系统版本 "4.16"
DPDK 初始化 false
数据路径类型 [netdev, system]
外部 ID:
hostname: master2.example.com
ovn-encap-ip: 10.32.110.5
ovn-encap-type: geneve
================================================================================
OVS 拓扑结构
================================================================================
系统 UUID: 7e9a3f70-86fa-4578-a849-4fd807a64a10
总网桥: 2
网桥: br-ex
端口: 3
内部: br-ex
补丁: patch-br-ex-to-br-int
系统: nm-bond
网桥: br-int
故障模式: secure
数据路径类型: system
端口: 12
geneve: 9 个端口
内部: ovn-k8s-mp0, br-int
补丁: patch-br-int-to-br-ex
================================================================================
OPENFLOW 分析
================================================================================
网桥: br-int
----------------------------------------------------------------------
总流数: 2,017
有命中的流: 318
丢弃流: 150 (9 个活跃丢弃)
⚠️ 活跃丢弃流 (9):
table=40, priority=0, packets=8,105
table=79, priority=100, packets=1,356
匹配: ip,reg14=0x2,metadata=0x5,dl_src=00:62:0b:ea:b5:e0
--------------------------------------------------------------------------------
数据路径流表健康状态
--------------------------------------------------------------------------------
当前流: 155 / 200,000 (0.1% 已用)
平均值: 156,最大观察值: 215
✓ 流表健康
错误处理
| 错误 | 解决方案 |
|---|---|
未找到 ovsdb-tool |
安装 openvswitch 包或使用默认模式(无 --db) |
未找到 conf.db |
使用默认模式(改为分析文本文件) |
未找到 sos_commands/openvswitch |
确保 sosreport 已收集 OVS 数据 |
参见
- OVN 数据库分析 - 用于 OVN NB/SB 数据库
- sosreport openvswitch 插件 - sosreport 收集的内容