亚马逊AWS官方博客

AWS Graviton4 加速 Apache APISIX 消息处理

Amzon Graviton4 简介

2023 re:Invent 大会宣布了 Amazon Graviton4 处理器,该芯片使用 ARM Neoverse V2 内核定制设计的 ARM 架构构建,集成了 730 亿个晶体管,针对提供高性能和能效进行了优化。

最近,亚马逊云科技宣布 Amazon EC2 R8g 实例正式上线,这些实例由 Graviton4 处理器提供支持。R8g 实例基于 Amazon Nitro 系统构建,通过将 CPU 虚拟化、存储和网络功能卸载到专用硬件和软件上,增强了工作负载的性能和安全性。R8g 实例非常适合内存密集型工作负载,如数据库、内存缓存和实时大数据分析。

与基于 Amazon Graviton3 的实例相比,性能提升高达 30%,能耗降低 60%。通过下图,您可以概览 Graviton4 和 R8g 实例相比上一代的改进和增强,您还可以通过查看 Amazon EC2 R8g 实例 和  Amazon Graviton Technical Guide 了解更多详细信息。

Apache APISIX 简介

Apache APISIX 是一个开源的云原生、高性能的 API 网关。它基于 Nginx 的 Lua 引擎 OpenResty 构建,利用 Nginx 的高性能和可扩展性,实现 API 网关功能。它的技术架构如下图所示:

APISIX 主要有以下几个常用功能和使用场景:

  • API 管理和路由:提供高性能的 API 代理和负载均衡功能,支持动态路由配置和匹配,支持多种认证方式,如 JWT、OAuth 等;
  • 流量管控:提供丰富的插件机制,可以实现限流、熔断、监控等功能。可以根据 IP、用户等维度进行精细化流量控制;
  • 微服务支持:支持服务发现和注册,可以动态感知后端服务状态。提供灰度发布、AB 测试等功能,支持微服务治理;
  • 安全防护:支持 SSL/TLS 加密,提供 CORS、IP 黑白名单等安全防护机制;
  • 监控和分析:提供丰富的指标监控,如 QPS、延迟、错误率等,可与 Prometheus、Grafana 等监控工具集成;
  • 可扩展性:基于 OpenResty 提供了强大的插件系统,可以灵活地扩展功能基于 Lua 脚本的插件系统,可定制各种功能。支持多种语言插件,如 Python、Java 等。

APISIX 是一个功能强大、高性能、可扩展的 API 网关,广泛应用于微服务架构、云原生应用等场景中。它具有灵活性强、部署简单等特点。您可以通过 https://github.com/apache/apisix 了解更多信息。

APISIX on Graviton 性能/性价比总结

本文比较 4 种相同大小、不同规格的 EC2 实例在执行 APISIX Benchmark 时的性能和性价比。

说明:在本文发布时,基于 Graviton4 的 EC2 实例仅 R8g 正式可用,因此在进行 Benchmark 对比时,采用了 R(内存优化型)系列实例进行对比。这一选择并不代表你在实际生产环境中一定要选择 R 系列实例,您可以根据实际需要选择 C(计算优化型),M(通用型)或 R(内存优化型)系列实例。

性能对比

考虑到生产环境中业务量和业务模型具有复杂性,并不由单一固定的业务量组成,因此我们在测试中预置多种场景的组合,采用 RPS(Request Per Second)来衡量 APISIX 的处理能力,并对所有场景的 RPS 值求平均值,用以体现该 EC2 实例在处理 APISIX 消息时的综合能力。总结如下:

  • r8g.2xlarge相比 r7i.2xlarge,性能提升 14.9%
  • r8g.2xlarge 相比 r6i.2xlarge,性能提升 63.4%
  • r7g.2xlarge 相比 r6i.2xlarge,性能提升 17.5%

性价比对比

在 EC2 实例上的某个工作负载的性价比信息,首先可以用在评估单台实例上性能水平;其次,在评估集群节点数量时也可以作为参考,在相同业务量的情况下,更高的性价比代表集群可使用更少的节点满足业务需求。

以上述 4 种实例在 us-west-2 区域的 1 年期无预付 RI 价格的有效小时费率为基础,计算性价比,总结如如下:

  • r8g.2xlarge 相比 r6i.2xlarge ,性价比提升 75%
  • r8g.2xlarge 相比 r7i.2xlarge ,性价比提升 30%
  • r7g.2xlarge 相比 r6i.2xlarge ,性价比提升 35%
  • r7g.2xlarge 相比 r7i.2xlarge ,性价比提升 1.5%

Benchmark 简介

本文仅以 R8g 实例展示测试环境的搭建过程,您可以此作为参考在其他规格的实例完成环境搭建。

Benchmark 组网

  • 节点类型和数量:1 * r8g.2xlarge
  • EBS 磁盘:80GB GP3(默认性能 125MB/s 吞吐,3,000 IOPS)
  • 操作系统:Ubuntu 22.04
  • 主要软件版本:
    • Etcd 3.5.4
    • APISIX 3.9.1
    • Wrk 4.2.0

Benchmark 工具和场景

采用 APISIX 官方 Benchmark 工具集进行本次测试,您可以通过查看以下链接了解详情:https://github.com/apache/apisix/tree/master/benchmark

本次测试采用 8 vCPU 实例,因此在测试场景中 worker 数量选择不大于 8(1,2,4,6 等),测试场景如下:

worker 数量 测试场景
1 1 worker + 1 upstream + no plugin
1 worker + 1 upstream + 2 plugins
fake empty apisix server: 1 worker
2 2 worker + 1 upstream + no plugin
2 worker + 1 upstream + 2 plugins
fake empty apisix server: 2 worker
4 4 worker + 1 upstream + no plugin
4 worker + 1 upstream + 2 plugins
fake empty apisix server: 4 worker
6 6 worker + 1 upstream + no plugin
6 worker + 1 upstream + 2 plugins
fake empty apisix server: 6 worker

其中使用到的 plugin 为 limit-count 和 Prometheus。

部署 APISIX 测试环境

本章节将详细描述如何搭建 APISIX  单节点运行环境,并执行 Benchmark 测试的步骤。

创建 EC2 实例

本次使用单节点测试环境,所有软件和 Benchmark 工具集均部署在该节点。您可以参考教程:Amazon EC2 Linux 实例入门完成这台 EC2 实例的创建。

安装 Benchmark 工具

通过 SSH 登录到 EC2 实例(ubuntu 用户),执行下面命令安装必须的基础软件。

设置 EC2 实例的 CPU 架构变量:

sudo su - root
if [[ $(arch) == "x86_64" ]]; then
    ARCH="amd64"
else
    ARCH="arm64"
fi

安装开发工具集:用于软件的编译构建。

apt install -y build-essential
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_$ARCH -O /usr/bin/yq
chmod +x /usr/bin/yq

安装 OpenResty:

cd ~
apt install -y --no-install-recommends wget gnupg ca-certificates
wget -O - https://openresty.org/package/pubkey.gpg --no-check-certificate | sudo gpg --dearmor -o /usr/share/keyrings/openresty.gpg
if [[ $ARCH == "arm64" ]]; then
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/openresty.gpg] http://openresty.org/package/arm64/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/openresty.list > /dev/null
else
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/openresty.gpg] http://openresty.org/package/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/openresty.list > /dev/null
fi
apt update
apt install -y openresty
openresty -v

安装 wrk 工具:Benchmark 工具将调用 wrk 发起测试流量。

cd /opt
wget https://github.com/wg/wrk/archive/refs/tags/4.2.0.tar.gz
tar zxf 4.2.0.tar.gz && cd wrk-4.2.0
make -j && ln -s /opt/wrk-4.2.0/wrk /usr/bin/wrk
wrk -v

安装 APISIX 软件

安装和启动 etcd 组件:

cd /opt
ETCD_VERSION='3.5.4'
wget https://github.com/etcd-io/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-$ARCH.tar.gz
tar -xvf etcd-v${ETCD_VERSION}-linux-$ARCH.tar.gz && \
  cd etcd-v${ETCD_VERSION}-linux-$ARCH && \
  cp -a etcd etcdctl /usr/bin/
nohup etcd >/tmp/etcd.log 2>&1 &

安装 APISIX 软件:

cd /opt
APISIX_VERSION='3.9.1'
git clone --depth 1 --branch ${APISIX_VERSION} https://github.com/apache/apisix.git apisix-${APISIX_VERSION}
cd apisix-${APISIX_VERSION}
make deps -j && make install

执行 Benchmark 任务

测试任务主要用到 Benchmark 工具集中的 run.sh 测试脚本,该脚本带有一个命令行参数,该参数表示启动的 worker 数量。本文中使用 worker 数量 1,2,4,6 分别进行测试。

sed -i.bak "s/bash -x/bash/g"   ./benchmark/run.sh
sed -i "s/wrk -d 5/wrk -d 60/g" ./benchmark/run.sh
ulimit -n 65535
rm -rf logs/* benchmark/fake-apisix/logs/* && df -h
./benchmark/run.sh 1 && sleep 10
./benchmark/run.sh 2 && sleep 10
rm -rf logs/* benchmark/fake-apisix/logs/*  && df -h
./benchmark/run.sh 4 && sleep 10
./benchmark/run.sh 6 && sleep 10

查看 Benchmark 执行结果

在每次 run.sh 执行过程中,SSH 界面会打印各场景的结果,如下图所示,每个场景将执行 2 次,您可以根据需要取最大值、最小值或平均值。

当所有的测试任务都完成之后,您可以汇总 RPS 信息,用以衡量 APISIX 在该实例的性能水平。同时,您通过在多种 EC2 实例规格上执行相同的 Benchmark 任务,进而横向评估 APISIX 在多种 EC2 实例的性能水平。

本篇作者

袁泉

亚马逊云科技弹性计算解决方案架构师,主要负责亚马逊云科技弹性计算相关产品的技术咨询与方案设计。专注于弹性计算相关的产品和方向。