本内容是对知名性能评测博主 Anton Putra Nginx vs. Envoy performance benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准

Envoy 被设计为服务网格中的高性能代理。

你可以将它部署在虚拟机(VM)中,或作为 sidecar 方式部署在 Pod 中。

在我们进行测试时,请记住这一点。它会拦截所有请求并将其转发到目标代理。

相比之下,Nginx 最初被设计成一个 Web 服务器,但你也可以将它用作反向代理。
它们都支持 HTTP/2、gRPC、负载均衡,以及其他常见的代理功能。

我们将使用 Terraform 和 Ansible 来创建 AWS 的 VPC,设置网络,并部署 EC2 实例。

首先,我们将测试这些代理如何处理普通的 HTTP 请求。
然后,我们将在相同测试中使用 HTTPS,并在代理层终止 TLS。
最后一个测试中,我们将使用 gRPC 功能,同样在代理层终止 TLS。

作为后端服务,我们将使用 Golang 的 fasthttp 库以及官方 gRPC SDK。

为了衡量代理的 CPU 使用率,我们将使用 Prometheus 和 Node Exporter。
为了跟踪请求数量,我们将使用 OpenTelemetry,并将其作为 Prometheus 指标暴露出来。

我们将使用 K6 压力测试工具来计算发送到每个代理的请求延迟。
如果您希望我在这些测试中测量其他内容,请告诉我。

你可以在 我的 GitHub 仓库 中找到源代码。
你也可以使用部署脚本作为你自己部署的基础。


现在我们开始配置 Envoy。
与 Nginx 相比,它的配置非常冗长。
你可以选择性地暴露管理面板,其中包含 Prometheus 指标。

在第一个测试中,我们希望暴露 80 端口。
你可以将访问日志保存到文件中。
在这个测试中,我们希望将所有发送到该域名的请求转发到 my_app 集群。

my_app 集群由多个端点组成。
在这里我们只有一个后端实例,我们希望将所有流量路由到它。

对于第二个 HTTPS 测试,我们将使用相同的集群。
为了在代理层终止 TLS,你需要开启 443 端口,并添加 transport_socket 属性。

在这里,非常重要的一点是要显式启用 HTTP/2。
我们还在两个代理中都使用 TLSv1.3 协议。
并指定证书和私钥。

你可能已经注意到,Envoy 的可定制性非常强,但对初学者并不友好。

对于 gRPC,我们开启另一个 8443 端口,但这次将其转发到 grpc_app 集群。

要安装最新的 Envoy 版本,你可以从 GitHub 的发布页面拉取二进制文件。
目前最新版本是 1.25.0。

Ansible 有一个 handler 的概念。
你可以定义一个 handler,比如用来重启服务。
当某个文件的内容发生变化时,它会通知这个 handler 并触发重启操作。


接下来是 Nginx。
它的配置要小得多。
我们打开 80 端口,并将请求转发到后端服务。

对于 HTTPS,你需要指定 ssl 指令,并显式启用 http2 协议。
然后提供证书和私钥,并将 TLS 协议版本设置为 1.3。
这是为了在两个代理中使用相同的协议以便测试。

最后,为了转发 gRPC 请求,如果你的上游服务器没有使用 TLS,只需将 proxy_pass 替换为 grpc_pass


现在让我们运行第一个测试。
你可能注意到,Envoy 只能处理大约 800 到 900 个请求每秒。
在下方的图表中,CPU 峰值达到 100%。

在峰值时,Nginx 能够处理接近 4000 个请求每秒,而 Envoy 只能处理 900 个请求每秒。
我使用的是两个代理的默认设置,我知道你可以对它们分别进行优化。


现在让我们运行第二个 HTTPS 测试。
这里的情况类似:
Envoy 只能处理大约 900 个请求每秒,而 Nginx 则可以处理大约 1500 个请求每秒。

在这次测试中,Envoy 多次失败,systemd 管理器在第 3 次尝试后将其禁用了。
让我重新运行相同的测试,但这次只使用 500 个用户。

你可以看到,当我们不将系统推向极限时,Nginx 和 Envoy 的延迟非常接近。


现在是最后的 gRPC 测试。
在这个测试中,Envoy 实际上可以处理更多的 gRPC 请求,并且 CPU 使用率低于 Nginx。
但我不会在每秒超过 200 个请求的情况下运行它们。
它们看起来并不稳定。

我将再次运行此测试,但仅使用 150 个虚拟用户,以展示请求的实际延迟。
在这个 gRPC 测试中,Envoy 的延迟比 Nginx 好 1 毫秒。


即使 Envoy 拥有边缘代理的能力,我仍然更倾向于使用 Nginx。
Nginx 对初学者来说更友好得多。
但另一方面,Envoy 在 gRPC 转发方面表现出色,并且由于它可以通过编程方式进行配置,因此是像 Istio 这样的服务网格的理想代理。

我还有一个包含各类基准测试的播放列表,你可能会感兴趣。

感谢你的观看,我们下期视频再见。


好文收藏
38 声望7 粉丝

好文收集