亚马逊AWS官方博客

探索和体验 Graviton2 高性价比

综述

2020年5月11日AWS Graviton2支持的EC2 M6g实例正式发布,“g”代表“Graviton2”,这是AWS的第二代基于Arm架构的芯片,由Annapurna Labs(亚马逊子公司)利用 64位Arm Neoverse N1微架构设计,根据ARM官网资料可以得知这个ARM第一款数据中心定位的CPU架构。AWS Graviton2的M6g实例和AWS第一代基于Arm Cortex-A72微架构的A1实例相比整数性能最高提升7倍。

在M6g推出后不久M6gd、R6g、R6gd、C6g、C6gd、T4g、C6gn等系列实例连续推出,目前基于Graviton2的实例已经有69款之多,支持的region数量也在不断扩大。AWS诸多托管服务如Amazon RDS,Amazon EMR,Amazon Elasticache,Amazon EKS也陆续GA了基于Graviton2的实例支持。这些托管服务方便客户直接享受到Graviton2的高性价比,从正式发布新闻稿可以看到, Apache Spark的EMR运行时与EC2 M6g实例的组合可将总成本降低多达 76% 并将性能提高 3.6 倍。Graviton2 实例最高可以为 RDS 开源数据库提供 35% 的性能改进和 52% 的性价比提高。Graviton2 成为了Amazon ElastiCache默认选项,可实现高达45% 的性价比提升。

Graviton2官网和公开案例中我们已经可以发现众多行业客户开始采用。在Web应用、游戏、高性能运算、EDA设计、媒体编解码、数据分析、数据库、内存缓存以及微服务等领域Graviton2均实现了大幅的性价比提升。

探索Graviton2高性价比

让我们简单分析下Graviton2的性价比优势。

首先从价格角度,以美西oregon区域为例,同样是4vCPU/16GB内存的通用型实例,M5.xlarge(按需价格0.192 USD/小时)M6g.xlarge(按需价格0.154 USD/小时),后者价格便宜约20%。另外Graviton2同样支持Spot请求、RI预留、Savings Plans等帮助客户降低成本。

其次技术角度先从vCPU角度来看,M5.xlarge的4vCPU和所有主流公有云一样是4个超线程,虽然M5.xlarge是租户独享2个物理core上的4个超线程,有天然的安全和稳定性优势,但是毕竟超线程共享L2缓存等资源带来的性能提升有限,而Graviton2不存在x86平台的超线程,每个vCPU都是独立的物理核心,因此均为AWS主流产品的4物理核心的M6g.xlarge比2物理核心4超线程的M5.xlarge具备天然的性能优势(4物理核心对2物理核心)。

最后技术角度再简单从Graviton2以及Arm Neoverse N1设计角度看,Graviton2基于TSMC(台积电) 7nm 工艺,单颗CPU包括了64 个物理核心(64个vCPU)高于AWS 5代实例单CPU 24-48物理核心,并且所有核心通过 mesh 结构互联,而且因为Graviton2无 NUMA 设计,每个内核访问其它内核与内存的路径一致,CPU 核心访问内存享有一致性延迟,这也就是诸如Redis、mysql、hadoop等应用可以获得令人印象深刻的性能提升的原因之一。

如何开始使用Graviton2

Graviton2的使用也很简单,对于托管服务只需在实例选择阶段选择Graviton2 系列实例即可,另外Amazon RDS、Amazon Elasticache等还可以把当前X86实例直接切换为Graviton2实例。

对于EC2自建服务,需要在操作系统选择界面时候选择ARM 64位版本即可(这里包括您熟悉的Amazon linux2、Redhat、Ubuntu、SUSE linux、Fedora、FreeBSD、Debian等)。你会发现常用软件包和之前使用的安装方式相同(yum,apt-get,pip,npm…),尽管某些应用程序可能需要重新编译,但是基于解释语言(例如Java ,NodeJS ,Python ,Go) 可以未经修改地运行。对于编译性语言如C等和或Python某些库基于C语言开发等极少数情况下,您需要重新编译或调试代码,这部分建议参考github上的aws-graviton-getting-started 网站。

下面分别以Amazon linux2和Ubuntu18.04为例演示EC2自建系统的主要开发工具和依赖环境的构建过程,考虑大量新版本软件针对Arm做了性能优化,尽量用较高版本如php7.4以上。

第一部分: Amazon linux2(由AWS提供长期技术支持并免费提供的linux分支,内核做了深度安全和性能优化,支持免费的内核实时补丁,操作上近似Redhat7)参考步骤如下:

$ sudo yum update -y   #升级内核和重要补丁

$ sudo reboot #内核更新后需要重启系统

$ uname -r #查看内核版本,当前为4.14.200-155.322.amzn2.aarch64

$ sudo yum groupinstall -y “Development Tools”   #安装开发工具包

$ sudo amazon-linux-extras enable golang1.11 corretto8 php7.4 python3.8 ruby2.6  #这个会输出amazon-linux-extras命令告诉我们要安装那些软件包(这里采用Extras 库,也支持EPEL外部源)

$ yum clean metadata

$ sudo yum install -y golang java-1.8.0-amazon-corretto \

php-cli php-pdo php-fpm php-json php-mysqlnd \

python38 ruby ruby-irb rubygem-rake rubygem-json rubygems

下面让我们检查一下刚刚安装的工具版本:

$ go version
go version go1.13.15 linux/arm64
$ java -version
openjdk version “1.8.0_272”
OpenJDK Runtime Environment Corretto-8.272.10.3 (build 1.8.0_272-b10)
OpenJDK 64-Bit Server VM Corretto-8.272.10.3 (build 25.272-b10, mixed mode)

#Amazon Corretto 是开源 Java 开发工具包 (OpenJDK),是OpenJDK的可靠版本并通过TCK认证, Corretto包括安全修复和性能增强,垃圾回收调度,防止内存不足的情况,以及改进的监视,报告和线程管理,并提供长期支持,亚马逊在内部以数千种生产服务运行Corretto。

$ php -v
PHP 7.4.11 (cli) (built: Oct 21 2020 19:12:31) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
$ python3.8 -V
Python 3.8.5
$ ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [aarch64-linux]

第二部分: Ubuntu18.04参考步骤如下:

$ sudo apt update  #apt和apt-get相同(后面会分别展示)

$ sudo reboot  #如果有内核更新,需要重启系统(当前没有)

$ uname -r  #查看内核版本,当前为5.4.0-1029-aws ,update前后并没有变化

$ sudo apt  install -y build-essential    #安装开发工具包gcc、make等

方法1:如果基于ppa源请参考下面步骤,以PHP和python为例:

$ sudo apt -y install software-properties-common #用于添加ppa源

$ sudo add-apt-repository ppa:ondrej/php   # PPA含PHP7.4

$ sudo apt update
$ sudo apt -y install php7.4
$ php -v
PHP 7.4.12 (cli) (built: Oct 31 2020 17:04:09) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.12, Copyright (c), by Zend Technologies

$ sudo add-apt-repository ppa:deadsnakes/ppa  #   PPA含python3.8

$ sudo apt-get update
$ sudo apt-get install python3.8
$ python3.8 -V
Python 3.8.6

方法2:如果基于传统方式安装请参考下面步骤,以Corretto为例:

$ curl https://apt.corretto.aws/coretto.key | sudo apt-key add –
sudo add-apt-repository ‘deb https://apt.corretto.aws stable main’

首先导入 Corretto 公有密钥,将存储库添加到系统列表

$ sudo apt update

$ sudo apt install -y java-1.8.0-amazon-corretto-jdk #如果希望基于java8环境

$ java -version
openjdk version “1.8.0_275”
OpenJDK Runtime Environment Corretto-8.275.01.1 (build 1.8.0_275-b01)
OpenJDK 64-Bit Server VM Corretto-8.275.01.1 (build 25.275-b01, mixed mode) $ sudo apt  install -y java-11-amazon-corretto-jdk #如果希望基于java11环境
$ $java -version

openjdk version “11.0.9.1” 2020-11-04 LTS

OpenJDK Runtime Environment Corretto-11.0.9.12.1 (build 11.0.9.1+12-LTS)

OpenJDK 64-Bit Server VM Corretto-11.0.9.12.1 (build 11.0.9.1+12-LTS, mixed mode)

第三部分: Amazon linux2 下Redis的安装基本过程

$ sudo yum install gcc  tcl -y  #安装gcc编译器和redis test所需tcl组件。

$ wget http://download.redis.io/releases/redis-6.0.9.tar.gz  #官网下载所需版本

$ tar xzf redis-6.0.9.tar.gz  #解压缩

编译阶段,这里有2个选择,选择(1)使用默认的jemalloc

$ cd  redis-6.0.9/deps  #进入这个目录

$ make hiredis jemalloc linenoise lua geohash-int

$ cd ..  #回到redis主目录

$ make

选择(2)使用MALLOC

$ cd  redis-6.0.9

$ make MALLOC=libc

安装完毕可以运行下面测试

$ make test #验证redis安装成功,底部可以提到: “\o/ All tests passed without errors!”

$  ./src/redis-server &  #后台运行redis服务

$ ./src/redis-cli  #运行redis客户端

127.0.0.1:6379> ping  #测试redis工作正常

PONG

另外还可以运行redis自带测试工具 ./src/redis-benchmark 进行性能测试

第四部分: Ubuntu18.04 下Redis的安装基本过程

$ sudo apt update

$ sudo apt install build-essential tcl -y

$ wget http://download.redis.io/releases/redis-6.0.9.tar.gz

$ tar xzf redis-6.0.9.tar.gz

$ cd redis-6.0.9

$make

有兴趣的朋友可以对比测试下AWS 5代实例和Graviton2系列实例,看看在相同vCPU下,您的应用性能提升是否满意。

 

参考资料:

ARM官网:https://www.arm.com/products/silicon-ip-cpu/neoverse/neoverse-n1

Graviton2官网:https://aws.amazon.com/cn/ec2/graviton/

Graviton2 github:https://github.com/aws/aws-graviton-getting-started

Corretto 官网手册:https://docs.aws.amazon.com/corretto/index.html

M6g实例GA blog:https://aws.amazon.com/cn/blogs/aws/new-m6g-ec2-instances-powered-by-arm-based-aws-graviton2/

T4g实例GA blog:https://aws.amazon.com/cn/blogs/aws/new-t4g-instances-burstable-performance-powered-by-aws-graviton2/

Amazon EMR支持Graviton2 正式发布新闻稿:https://aws.amazon.com/cn/about-aws/whats-new/2020/10/amazon-emr-provides-lower-cost-improved-performance/

Amazon RDS支持Graviton2 正式发布新闻稿:https://aws.amazon.com/cn/about-aws/whats-new/2020/10/achieve-up-to-52-percent-better-price-performance-with-amazon-rds-using-new-graviton2-instances/

Amazon EKS支持Graviton2 正式发布新闻稿https://aws.amazon.com/cn/about-aws/whats-new/2020/08/amazon-eks-support-for-arm-based-instances-powered-by-aws-graviton-now-generally-available/

Amazon ElastiCache支持Graviton2 正式发布新闻稿: https://aws.amazon.com/cn/about-aws/whats-new/2020/10/amazon-elasticache-now-supports-m6g-and-r6g-graviton2-based-instances/

本篇作者

梁海峰

AWS资深解决方案架构师,专注于基础架构平台。从事IT售前解决方案工作20年,在Unix和X86平台架构,虚拟化建设,存储解决方案、备份和容灾建设等有丰富经验。目前在AWS服务商业客户,协助客户上云、优化架构和成本。