zeroserve v0.2.11:Caddy 兼容性与 eBPF 驱动的性能

zeroserve v0.2.11:Caddy 兼容性与 eBPF 驱动的性能

zeroserve v0.2.11 引入了 Caddy 兼容模式,可通过 eBPF 将 Caddyfile JIT 编译为本机机器码,实现比 Caddy 高达 3 倍的吞吐量和 70% 更低的延迟。

zeroserve v0.2.11:Caddy 兼容性与 eBPF 驱动的性能

zeroserve v0.2.11 引入了 Caddy 兼容模式,允许用户提供 Caddyfile,服务器随后将其 JIT 编译为 eBPF,再进一步编译为本机 x86_64 或 ARM64 机器码。该架构结合 io_uring 事件循环,相比传统 Web 服务器显著降低了开销。

性能基准

zeroserve 在 HTTPS 反向代理场景中相较于 Caddy 展示了显著的性能提升,并且与 Nginx 的结果相当。在一台 AMD Ryzen 7 3700X(两线程)上进行的测试中,使用 clang 后端的 zeroserve 达到了每秒 38,948 请求(req/s),而 Caddy 为每秒 12,529 请求。

协议 服务器 吞吐量 p50 延迟 p99 延迟 峰值 RSS
HTTPS zeroserve-clang 38,948 req/s 1.45ms 3.91ms 30.9 MiB
HTTPS zeroserve-tcc 36,653 req/s 1.67ms 4.00ms 34.2 MiB
HTTPS Caddy 12,529 req/s 4.74ms 13.11ms 67.4 MiB
HTTPS Nginx 37,424 req/s 1.57ms 4.24ms 25.7 MiB

从数据中可以得出关键结论:相较于 Caddy,吞吐量约提升 3 倍,p99 延迟降低约 70%。

eBPF 集成与自定义中间件

zeroserve 在用户空间运行图灵完备的 eBPF,使得可以直接从 Caddyfile 执行自定义代码。这允许实现通常需要单独插件或自定义服务器构建的复杂逻辑。

例如,用户可以通过调用 eBPF 中间件插件,为兼容 S3 的存储桶集成 AWS SigV4 认证。在 Caddyfile 中,这通过 zeroserve_call 指令实现:

example.com {
  route /s3/* {
    uri strip_prefix /s3
    rewrite * /my-bucket{uri}
  
    zeroserve_call io.su3.aws-sigv4 sign_request {
      access_key_id "minioadmin"
      secret_access_key "minioadmin"
    }
  
    reverse_proxy http://127.0.0.1:9000
  }
}

社区反馈与技术批评

尽管性能指标令人印象深刻,社区仍提出了关于 zeroserve 方法的实际用途和安全性的若干担忧。

安全性与攻击面

批评者指出,使用 JIT 编译和 io_uring 可能会扩大服务器的攻击面。

"在一个小项目中对 Web 服务器进行 JIT 编译的想法让我感到相当恐怖。这里的攻击面非常庞大。"

此外,一些用户对与 io_uring 相关的近期安全通告表示谨慎:

"暴露使用 io_uring 的服务是坚决不选的。"

功能等价性与实用性

一些开发者认为,对于大多数使用场景而言,性能提升微乎其微,因为 Caddy 已有的性能足以满足大多数应用。另一些人指出缺少关键功能,例如用于自动 SSL/TLS 证书的 ACME(自动证书管理环境),这正是许多用户选择 Caddy 的主要原因。

"“Caddy 兼容”却缺少所有重要的东西,如 ACME 和插件。"

关于 eBPF 的技术问题

关于用户空间中 eBPF 的本质仍在讨论中。一些用户质疑在用户空间而非内核中运行 eBPF 的目的,另一些人则争论鉴证器施加的复杂度限制是否使 eBPF 真正具备图灵完备性。

Sources