跳到主要内容
版本:3.10.x

性能基准

本页介绍 API7 网关已发布的基准测试结果及其测试方法,帮助你理解测试数据并在自己的环境中复现。所有测试资产(ADC 配置、wrk2 脚本和部署清单)均可在 api7-gateway-performance-benchmark 仓库中获取。

方法论

该基准测试使用一组固定的变量,以便跨测试运行和环境的结果具有可比性:

  • 单个网关节点:一个 API7 网关数据面实例,其中 worker_processes 配置为与主机的 vCPU 数量匹配。要构建干净的单核基准,请从 worker_processes: 1 开始,并在确认单核数字后进行扩展。
  • 排除上游对性能上限的影响:仅启用 mocking 插件来测量 API7 网关的原始请求处理上限。mocking 插件直接返回预设响应,不会将请求转发到上游。因此,该结果不能与实际代理场景的吞吐量直接比较。
  • 使用真实上游测试代理场景:除 mocking 场景外,其他测试均使用运行 nginx/1.25.4 的真实 NGINX 上游,并配置 access_log off 和 200 字节静态响应,避免上游自身成为瓶颈。
  • 样本大小:每个测试用例运行 5 次,每次运行 2 分钟,报告的结果是 5 次运行的平均值。
  • 测试场景:5 个插件组合 × 2 种路由/消费者规模 = 10 个测试用例:
    1. mocking(基线上限)
    2. 无插件
    3. limit-count
    4. key-auth
    5. key-authlimit-count

每个插件场景分别使用两种规模运行,以衡量资源数量对路由匹配和插件执行的影响:一种包含 1 个路由和 1 个消费者,另一种包含 100 个路由和 100 个消费者。

已发布结果:AWS EKS

这些结果来自 AWS EKS 环境:使用运行 Amazon Linux 2(AL2_x86_64)的 c5.4xlarge EC2 实例(16 个 vCPU、32 GB RAM)和 Kubernetes 1.29。API7 网关、NGINX 上游和 wrk2 分别运行在同一 VPC 的独立节点上,以避免资源争用。

备注

转发到上游列用于区分仅使用 mocking 插件的理论上限测试(API7 网关直接返回预设响应,请求不会离开网关)和实际代理场景。仅使用 mocking 的结果表示网关请求处理链路的理论上限,不能与受后端和网络影响的实际吞吐量直接比较。估算生产环境容量时,请使用“转发到上游”为 TrueForward to Upstream: True)的数据。

测试场景路由/消费者转发到上游QPSP99(毫秒)P95(毫秒)
mocking1 个路由,0 个消费者False310,392.071.161.08
无插件1 个路由,0 个消费者True167,019.372.302.16
无插件100 个路由,0 个消费者True162,753.172.312.16
limit-count1 个路由,0 个消费者True145,370.102.432.24
limit-count100 个路由,0 个消费者True143,108.402.452.25
key-auth1 个路由,1 个消费者True147,869.492.412.22
key-auth100 个路由,100 个消费者True145,070.932.432.25
key-auth + limit-count1 个路由,1 个消费者True136,725.472.432.26
key-auth + limit-count100 个路由,100 个消费者True133,782.952.482.30

运行你自己的基准测试

要重现这些数字或测量你自己的工作负载,请遵循与已发布结果相同的方法并应用下面的优化指南。

开始之前

  • 选择适当数量的网关节点。 每次测试只使用一个 API7 网关节点,并将 worker_processes 配置为与主机 vCPU 数量一致。不要并行运行多个 worker_processes 较小的 API7 网关实例,否则测试结果难以准确解释。
  • 首先构建单核基线。 设置 worker_processes: 1 并针对同一主机上的本地 NGINX 上游运行“无插件”场景。在横向扩展之前,你的结果应该与上面的单主机基准表大致相同。
  • 排除上游对性能上限的影响。 仅启用 mocking 插件,以单独测量 API7 网关自身的处理开销。
  • 观察上游。 在每次实际测试期间,监视 NGINX 上游的 CPU、内存和事件循环利用率。如果上游饱和,则数字反映上游的限制,而不是 API7 网关的限制。
  • 运行多个样本并应用统计数据。 每个测试用例应至少运行 5 次。报告平均值和标准差,以便将噪声与信号分开。

有关创建集群、标记节点、安装 Helm、部署 NGINX 上游和部署 wrk2 的完整 AWS EKS 操作流程,请参见在 AWS EKS 上运行基准

优化建议

提高打开文件的最大数量

查看系统当前最大打开文件描述符数:

cat /proc/sys/fs/file-nr

最后一个数字是系统级上限。如果该值过小,请在 /etc/sysctl.conf 中提高:

/etc/sysctl.conf
fs.file-max = 1020000
net.ipv4.ip_conntrack_max = 1020000
net.ipv4.netfilter.ip_conntrack_max = 1020000

重新加载:

sudo sysctl -p /etc/sysctl.conf

提高每个进程的 ulimit

每个传入连接都会消耗一个文件描述符。将 ulimit -n 提高到七位数的值,以便网关可以接受基准测试生成的连接量。

临时(仅限当前 shell):

ulimit -n 1024000

永久生效(编辑 /etc/security/limits.conf):

/etc/security/limits.conf
* hard nofile 1024000
* soft nofile 1024000

禁用访问日志

访问日志会为每个请求执行磁盘写入,在高负载测试中可能因 I/O 限制 QPS。进行基准测试时,请禁用访问日志:

config.yaml
nginx_config:
error_log_level: error
worker_processes: auto
http:
enable_access_log: false

将错误日志级别设置为 error 还会减少运行期间的日志 I/O。

避免资源争用

wrk2、API7 网关和上游服务部署在同一本地网络中的不同计算机上。在 Kubernetes 中运行时,使用 nodeSelector(或污点和容忍)将三个 Pod 分别调度到不同节点,否则 CPU 和网络资源争用会影响结果。

避免突发云实例

请勿使用突发型云实例系列(例如 AWS t3/t4g)进行基准测试。此类实例采用基于 CPU 积分的模型,可能导致结果无法复现。请改用 c5.4xlarge 等固定性能实例系列。

此外,云服务商的 vCPU 与物理核心并不总是按 1:1 对应。许多实例使用超线程,因此实际物理核心数可能只有 vCPU 数量的一半。为准确估算容量,请参阅云服务商的实例文档;AWS 用户可参阅 AWS 实例 CPU 选项

观察网关中的内部错误

每次运行基准测试前,请持续查看 API7 网关错误日志,确认其中没有错误。内部错误循环(例如上游 DNS 故障触发重试)会在没有明显现象的情况下降低测得的吞吐量。将网关日志级别设置为 error,并在测量前解决日志中报告的所有问题。

使用 c1000k 验证连接容量

如果目标是支持数十万以上的并发连接,请确认主机内核和文件描述符限制能够承载相应连接数。c1000k 是一个可模拟一百万个并发连接的小型测试工具:

# 在服务端节点上
./server 7000

# 在客户端节点上
./client <server-ip> 7000

后续步骤