跳到主要内容

性能说明

English | 简体中文

影响因素

vArmor 的用户态组件和内核态组件对性能的影响因素如下表所示

因素说明
集群规模集群规模越大,Manager 管理 Agent 所消耗的 CPU 和 内存越多
VarmorPolicy 数量和操作频率大量创建 VarmorPolicy CR 时,Manager 会消耗更多的 CPU 和内存进行响应
频繁创建/修改/删除 VarmorPolicy CR 时,Manager 和 Agent 会消耗更多的 CPU 和内存进行响应
AppArmor LSM开启 AppArmor LSM 为进程引入的基础开销
Profile 中的规则越多,对目标进程的性能影响越大
BPF LSM开启 BPF LSM 为进程引入的基础开销
Profile 中的规则越多,对目标进程的性能影响越大

资源占用

vArmor 用户态组件默认使用下表所示的值进行资源申请

VersionManager CPUManager MemoryAgent CPUAgent Memory
v0.5.11200m / 100m300Mi / 200Mi200m / 100m100Mi / 40Mi (关闭 BPF enforcer 时)
200Mi /100Mi (开启 BPF enforcer 时)

说明:

  • 默认值来自经验和模拟测试结果 (一个 VarmorPolicy 对 400*32 个Pods 开启防护)
  • 您可以在安装组件时,通过调整 Helm Values 来为大规模集群设置更多的内存配额
  • 若开启了 BPF enforcer,Agent 在启动并加载 BPF program 时需要更多的内存,因此内存资源的申请额度较高

性能测试

针对 BPF Enforcer 的基准测试

我们利用 byte-unixbench 在 VKE with kernel 5.10 集群中对 BPF enforcer (v0.5.0) 进行了初步的性能测试。

测试环境

  • 集群版本 v1.20.15-vke.10
  • 节点数 2
  • 节点主机默认启用 AppArmor & BPF LSM
  • 节点规格 ecs.g2i.xlarge (4vCPU 16GiB)

测试步骤

  • 部署测试用的工作负载(通过 annotations 主动关闭测试容器的默认 AppArmor Profile)
  • 在测试容器内连续执行 10 次基线测试
  • 安装 vArmor
  • 在测试容器内连续执行 10 次基线测试
  • 为工作负载创建 VarmorPolicy(各类型策略各一条),在测试容器内连续执行 10 次基线测试
  • 更新 VarmorPolicy(各类型策略各两条),在测试容器内连续执行 10 次基线测试
  • 更新 VarmorPolicy(各类型策略各四条),在测试容器内连续执行 10 次基线测试
  • 更新 VarmorPolicy(各类型策略各八条),在测试容器内连续执行 10 次基线测试
  • 收集测试数据,对测试数据取均值,并以未安装 vArmor 时的测试结果为基准值,计算不同情况下的性能损失

测试结果

  • 安装 vArmor v0.5.0 后,若不对容器开启沙箱防护(或对容器开启 AlwaysAllow 模式沙箱)。将给容器进程引入最大 1.34% 的性能损失(Execl Throughput 维度)
  • vArmor v0.5.0 在 Execl Throughput 和 Process Creation 中引入的性能损耗最大,当为容器进程设置各类型策略 8 条规则后,其 execl 的最大性能损耗为 2.55%,进程创建的最大性能损耗为 2.32%
  • 不同测试用例的 File Copy 4096 bufsize 8000 maxblocks 得分与基准值相比有所波动,与预期不符。可能的原因是:
    • 当云主机在高负载时,cache 局部性/热度导致文件拷贝被加速等原因导致了波动
    • 云主机存在超售情况,宿主机在测试期间整体负载存在波动,从而导致云主机内的基线测试结果有所波动

模拟真实场景和常见负载的性能测试

本测试模拟真实场景,对不同的 enforcer 进行对比测试。我们使用 Phoronix Test Suite (PTS),针对一些常见负载(Redis、Apache 等)进行了一系列自动化性能测试。

测试环境

  • 集群版本 v1.26.10-vke.18
  • 节点数 3
  • 节点主机默认启用 AppArmor & BPF LSM
  • 节点规格 ecs.g3i.xlarge (4vCPU 16GiB)

测试场景

在本轮测试中,我们对 AppArmor、BPF 这两种 enforcer 进行横向对比测试,每个 enforcer 都选取三种典型场景,包括 AlwaysAllow、RuntimeDefault、EnhanceProtect,每个场景的 policy 如下所示:

  • Init 基准测试

    不应用任何策略

  • AlwaysAllow

    使用 AlwaysAllow Mode 进行测试,不开启任何 rule

  • RuntimeDefault

    使用 RuntimeDefault Mode 进行测试,不开启任何 rule

  • EnhanceProtect

    使用 EnhanceProtect Mode 进行测试,开启如下 rules

    • disable-cap-privilege
    • disallow-umount
    • disallow-access-procfs-root
    • mitigate-disk-device-number-leak
    • mitigate-sa-leak
    • mitigate-overlayfs-leak
    • Mitigate-host-ip-leak
    • Disallow-metadata-service
    • cgroups-lxcfs-escape-mitigation
    • runc-override-mitigation

此外,我们也对 Seccomp enforcer 进行了测试,开启了 4 条 Seccomp 内置规则(该测试仅供参考)。 所有测试用到的 policy 文件均可在 test/perf/policy 目录下找到。

测试步骤

我们编写了一个 bash 脚本用于实现自动化测试,该脚本主要完成如下任务:

  • 在 Kubernetes 集群中创建和删除 Pod。
  • 应用和移除不同的安全策略。
  • 初始化测试配置,安装测试工具,运行 Phoronix 测试套件。
  • 记录测试结果。

特别地,对于 Init、 BPF 和 Seccomp 模式,我们使用了不同的 Pod 配置,例如通过设置 container.apparmor.security.beta.kubernetes.io/phoronix: unconfined 来确保禁用 AppArmor,避免运行时组件默认开启的 AppArmor Profile 影响测试结果。 您可以在 test/perf/policy 目录下找到 Pod 定义和 Phoronix 运行配置。

您可以在 test/perf 目录下找到自动化测试脚本。此外我们针对 sysbench 和 unixbench 也编写了单独的测试脚本,如果您感兴趣也可以自行进行测试。

测试结果

  • EnhanceProtect: BPF 的性能相比 AppArmor 下降了约 1.2%。

  • RuntimeDefault: BPF 的性能相比 AppArmor 下降了约 0.6%。

  • AlwaysAllow: BPF 的性能相比 AppArmor 下降了约 0.1%。

测试结果表明,虽然 BPF 相对于 AppArmor 在不同场景下通常表现出轻微的性能下降,但差异相对较小。这表明 BPF 是 AppArmor 的可行替代方案,在安全应用中具有可接受的性能损耗。

下面是各项的详细测试结果:

Phoronix-Apache

Requests Per Second-Higher is better

Test ScenarioApache Concurrent Requests 4Apache Concurrent Requests 20Apache Concurrent Requests 100Apache Concurrent Requests 200Apache Concurrent Requests 500Apache Concurrent Requests 1000
NoProtect16838.617073.816961.7816619.6514029.1911944.99
AlwaysAllow AppArmor16469.4116505.8416764.1416312.6913750.2411729.78
AlwaysAllow BPF16452.9416489.3316747.3816296.3813736.4911718.05
RuntimeDefault AppArmor16376.5416067.0916461.3916242.6913385.8711599.9
RuntimeDefault BPF16360.1616051.0216444.9316226.4513372.4811588.3
Enhance AppArmor15833.4315802.8416385.1916101.5113276.1611429.32
Enhance BPF15817.615787.0416368.816085.4113262.8811417.89
Seccomp14882.4315035.1215454.2415312.2512870.2811162.86
Phoronix-GIMP

Time Usage-Lower is better

Test ScenarioGIMP Resize TimesGIMP RotateTimesGIMP Auto-Levels TimesGIMP Unsharp-Mask Times
NoProtect16.61611.84216.54319.888
AlwaysAllow AppArmor16.67211.95116.65820.04
AlwaysAllow BPF16.87212.09416.85820.28
RuntimeDefault AppArmor16.73711.97716.73420.221
RuntimeDefault BPF16.76212.04416.88720.289
Enhance AppArmor16.85511.95816.81420.312
Enhance BPF16.87612.10116.94720.411
Seccomp16.91512.86318.08221.096
Phoronix-Redis

Requests Per Second-Higher is better

Test ScenarioGET Connection 50SETConnection 50GETConnection 500SET Connection 500LPOPConnection 500
NoProtect23565171612305194451416140232298349
AlwaysAllow AppArmor23368921610689193603516051862287682
AlwaysAllow BPF23228701601025192441815955552273956
RuntimeDefault AppArmor23160041610480195758615981562281477
RuntimeDefault BPF23021081600817194584015885672267788
Enhance AppArmor23144581597515192952815896302252763
Enhance BPF23005711587930191795115800932239246
Seccomp22804761596606187522915470452316358
Phoronix-Sysbench

Higher is better

Test ScenarioSysbenchRam/MemorySysbenchCPU
NoProtect4189.512831.65
AlwaysAllow AppArmor4030.552821.5
AlwaysAllow BPF4026.5192818.679
RuntimeDefault AppArmor4023.672818.7
RuntimeDefault BPF4019.6462815.881
Enhance AppArmor3939.252808.13
Enhance BPF3935.3112805.322
Seccomp4138.072832.87