ovs acl 数量导致的性能问题

75 阅读3分钟

1. OVS ACL 流表的本质

  • 在 OVS 里,ACL 规则通常是通过 ovs-ofctl add-flow 或 OpenFlow 控制器下发的 流表项 来实现的。
  • 这些流表项存放在 OVS 的 流表(Flow Table) 中,匹配时按优先级、匹配域顺序进行查找。
  • OVS 支持多流表(Meter Table、Group Table 等),但 ACL 主要用到的是普通流表。

关键点
ACL 流表项和普通转发流表项一样,都会参与数据包匹配过程,因此 ACL 数量越多,匹配开销越大。


2. 流表匹配机制与性能关系

OVS 的流表匹配是 Ternary Content Addressable Memory (TCAM)软件 hash 查找(取决于是否 offload 到支持 OpenFlow 的交换机 ASIC):

  • 软件模式(用户态/内核态 datapath)

    • 流表用 hash 表或有序链表存储,匹配过程是 线性扫描hash 查找 + 冲突链遍历
    • ACL 规则越多 → 链表越长 / hash 冲突概率越高 → 单次匹配耗时增加 → 吞吐下降、延迟上升。
  • 硬件 offload(支持 OpenFlow 的交换机)

    • ACL 规则下发到硬件 TCAM,匹配速度非常快(纳秒级),不受规则数线性影响。
    • 但硬件 TCAM 容量有限(常见 4K~64K 条),超出后会 fallback 到软件处理,性能会骤降。

3. ACL 流表数量对性能的影响(软件模式)

根据社区测试和经验数据(主要基于 Linux kernel datapath,OVS 2.8~2.17):

ACL 规则数量对性能的影响
0~500 条影响很小,匹配开销可忽略
500~2000 条延迟开始明显增加,吞吐轻微下降
2000~10000 条延迟显著上升,小报文(64B)吞吐下降明显(可能下降 30%~50%)
10000~50000 条性能下降非常明显,CPU 匹配开销占主导,可能成为瓶颈
>50000 条极有可能导致 OVS 用户态/内核态线程饱和,吞吐量急剧下降

注:

  • 以上是针对 纯 ACL 规则(即每包都要经过这些规则匹配)的情况。
  • 如果 ACL 规则设置了合理的优先级(命中即停止匹配),实际性能下降会比全量扫描好一些。
  • 大报文(1500B)受影响较小,因为 CPU 处理包数少;小报文受影响更大。

4. 硬件 offload 场景

  • 如果交换机 ASIC 支持将 ACL 规则 offload 到 TCAM,那么即使 ACL 数量到 10K 甚至 40K,性能也基本保持线速。
  • 一旦超出硬件 TCAM 容量,超出部分会回退到软件流表处理 → 性能出现断崖式下降。
  • 因此硬件场景下的“临界点”取决于硬件规格,而不是 OVS 本身。

5. 建议与优化

  1. 合并同类 ACL 规则
    • 减少规则数量,例如用更宽的 CIDR 或通配符替代多条零散规则。
  2. 合理设置优先级
    • 高频命中的规则放前面,减少匹配次数。
  3. 硬件 offload
    • 如果 ACL 数量大且性能要求高,优先使用支持 OpenFlow offload 的交换机。
  4. 流表分区
    • 把 ACL 和普通转发流表分到不同流表 ID,减少每个流表的规模。
  5. 性能监控
    • ovs-ofctl dump-flows 统计 ACL 数量,配合 ovs-appctl dpctl/show 查看流命中数和处理位置(kernel/userspace)。

结论

  • 软件模式:ACL 流表数量越多,性能下降越明显;在 2000~10000 条区间性能下降最显著。
  • 硬件模式:在 TCAM 容量内几乎无影响,超出后性能骤降。
  • 建议根据实际环境进行压力测试,找出 ACL 数量与性能的平衡点。

0325bf97ab01c7fadc6ce8b5fbddbb6e.png