https://zhuanlan.zhihu.com/p/377544841
最近是不是听了很多关于ARM处理器的内容?
ARM处理器是什么?它在未来的云计算领域中又占据着什么地位?
ARM未来的趋势是怎样的?
跟随小编一起来看看吧~
近年来科技媒体上关于 ARM 芯片的新闻可谓是高潮迭起,不断引起人们的关注。
林林总总,即使我们是半导体行业的门外汉也不难得出一个结论 ——
ARM 处理器不仅仅统治了手机、嵌入式应用这些传统的优势领域,或将在桌面系统、高性能计算尤其是云计算领域扮演越来越重要的角色。
想要深耕云计算领域,你千万不能错过2021亚马逊云科技中国峰会!点击链接,即可报名,时刻先人一步!
以往我们熟悉的亚马逊云科技所提供的的计算资源所使用的多为 Intel® Xeon® 处理器,例如 Skylake 、Ivy Bridge、Broadwell 以及 Haswell 等 Intel 的多个系列的CPU。即使在 2018 年新出现使用了AMD EPYC 处理器的新的实例类型(M5a、R5a以及T3a等),其 CPU 的架构体系与 Intel 的 CPU 也还同属 “x86-64”(也被称作 x64、AMD64 以及 Intel 64等)体系架构。抛开 Intel 与 AMD 半世纪的爱恨情仇,我们可以简单的把这些处理器视作一类。
而这一次 M6g 实例上的处理器却与以往大有不同,采用的是一款名为 Amazon Graviton2 处理器,是由亚马逊云科技使用 64 位 ARM Neoverse N1 内核定制而成。说起 ARM 处理器,我们所了解的是其在移动计算市场的所向披靡,却一直在桌面计算、服务器等对性能要求更高的市场中表现不佳。在过去数年中,ARM 不止一次对高性能处理器领域发起挑战,但多以惨淡的结果收场。而转机就出现在 2019 年初 ARM 发表的 Neoverse N1。对于这一次的发布,ARM 的设计目标就是使其成为一个高性能架构,并重新调校了微架构使其能够以更高的频率运行。在这一点上,ARM 与 AMD、Intel 的路线有所不同,后两家面向高性能平台的处理器产品受制于功耗、面积等因素,频率相比消费级产品要低。但是在N1的设计中却恰好相反,处理器的频率相对更高。不仅如此,Neoverse N1还有一些独特设计,例如缓存的设计。N1中的L1数据缓存和指令缓存部分都是64KB、4-Way 设计。其中最重要的改变是整个缓存完全采用了一致性设计,它大幅度简化了虚拟环境的实现并且极大地提高了性能。而且这一设计对 ARM 在超大规模计算中保持竞争力也是必须的,因为这可以很方便地扩展核心数量。而这一点在 Amazon Graviton2 处理器上表现得淋漓尽致。与第一代 Amazon Graviton 处理器相比,Amazon Graviton2 处理器实现了性能和功能飞跃,性能提升 7 倍、计算内核数量增加 4 倍、缓存增加 2 倍、内存速度提升 5 倍。
总体来看,Amazon Graviton2 与 N1平台差异不大,且采用了 TSMC 的 7nm 工艺。当然细微差异还是存在的。例如Amazon Graviton2 的 CPU 内核的时钟频率较 N1 要低一些。我自己运行一个简单的测试程序得到的 Amazon Graviton2 时钟频率约为 2.5GHz,并且 L3 缓存为 32MB 而不是公版的64MB。该系统由 8 通道 DDR-3200 内存控制器支持,并且 SoC 支持 64 个 PCIe4 通道用于 I/O。至于这款芯片的功耗,考虑到 ARM 宣称的 64 核 2.6GHz CPU 的功耗约为 105W,以及 Ampere 最近披露的其 80 核 3GHz N1 服务器芯片的功耗为 210W。ANANDTECH 对 Amazon Graviton2 给出的估算结果是功耗大致位于 80 瓦至之 110 瓦之间。
现代的 CPU 存在着核心数量越来越多的趋势。随着系统中的核心数量的增多,服务器芯片中的内存性能成为了影响性能至关重要的因素。借助 8 个 DDR4-3200 内存控制器,Amazon Graviton2 芯片具有先进的内存功能,理论上可提供高达204GB/s的峰值带宽。在ANANDTECH 的测试中,Amazon Graviton2 的单个 CPU 内核能够以高达 36GB/s的速度传输写入数据。内存加载速度高达 18.3GB/s,内存复制达到了令人印象深刻的 29.57GB/s,这是测试中 AMD 系统的两倍以上,几乎是 Intel 系统的三倍。
与一年前发布的第一代 Amazon Graviton 处理器相比,Amazon Graviton2 处理器不管在性能还是功能上都实现了一次巨大的飞跃。它们都支持 Amazon EC2 M6g、C6g 和 R6g 实例,而且与当前这一代基于 x86 的实例相比,这些实例为各种工作负载(包括应用程序服务器、微服务、高性能计算、电子设计自动化、游戏、开源数据库和内存中的缓存)提供高达 40% 的性价比提升。Amazon Graviton2 处理器也为视频编码工作负载提供增强的性能,为压缩工作负载提供硬件加速,并为基于 CPU 的机器学习推理提供支持。它们可以提供高 7 倍的性能、多 4 倍的计算核心、快 5 倍内存和大 2 倍缓存。
在亚马逊云科技 re:Invent 2019 大会上,Amazon EC2 产品团队分享的几组处理器 Benchmark 的结果就让人兴奋不已。
此外,在 2020 年 3 月份 KeyDB 分享了它们针对 M6g vs M5 实例上的性能对比测试。众所周知,KeyDB 是 Redis 的多线程超集,由于其先进的体系结构,具备了很好的性能表现。
他们的测试结论是这样的 :
M5 实例使用 Intel Xeon Platinum 8175 处理器,与其他大多数可用实例类型相比,它们通常为我们带来非常好的效果。令我们震惊的是,在较小尺寸的使用 Amazon Graviton2处理器的 M6g 实例上,与现有的 KeyDB M5 实例相比,获得了如此巨大的收益。
m6g.large比m5.large快1.65倍,而m6g.xlarge则比m5.xlarge 快1.45 倍。随着内核数量的增加,两种产品之间的差距开始缩小。但是,我们仍在研究 m6g.2xlarge 和 m6g.4xlarge 的性能,因为我们相信可以将性能水平提高到相同的倍数。在此测试中,我们没有针对 M6g 进行任何调整,因此我们对即将到来的结果感到乐观。
而在 2020 年的 5月15日,在测试工具市场久负盛名的 Phoronix 发表了一篇关于使用 Amazon Graviton2 CPU 的新 M6g 实例性能测试的文章。他们使用 M6g 实例作为基准,然后将这些实例与较早的 A1 Graviton 实例进行比较。在 Intel Xeon 方面,选择了 M5 实例,在 AMD EPYC 方面选择的是 M5a 实例。
这里仅仅撷取其中的部分结果以供各位参考:
1.Linux Kernel(V5.4)的编译时间,数字越小越好
2.Memcached mcperf v1.6.0, 数字越大越好
除了实例类型之外(例如M5、C4),其它用于描述实例能力最重要的指标就是其 vCPU 的数量。所谓的 vCPU 是Virtual Central Processing Units 的缩写。vCPU 本质上是指虚拟机上可用的逻辑 CPU 的内核。但 Amazon EC2 的逻辑 CPU 计算方法却并非是基于物理上的 CPU 内核。准确的说,并发线程的数量即为 Amazon EC2 vCPU 的数量。例如,默认情况下,M5.xlarge 实例类型有两个 CPU 内核,每个内核支持两个逻辑线程,这样该类型实例的vCPU 的数量即为4个。Amazon EC2 实例范围通常从 1 个vCPU 到最多 128 个,常见的实例的 vCPU 的数量多为 2、4、8、16、32、48、64和 96 等。
Amazon Graviton2 是不带 SMT 的单路 64 核平台。所谓 SMT(Simultaneous multithreading) 的含义其实就是我们熟知的超线程技术。简单来说,SMT 技术可以在一个实体CPU 中提供两个逻辑线程,通过分享处理器的资源来提高性能。在Intel 的CPU中类似的技术被称作Hyper-Threading,或者简称 HT。目前,Amazon Graviton2 最大可用 vCPU 实例大小为 64。
但是,这也意味着,在谈论例如 64 个 vCPU 实例的时候(在 Amazon EC2 中的规格称为16xlarge),对于 Amazon Graviton2 实例我们将获得 64 个物理核心;而对于 AMD 或 Intel 系统,我们将仅获得 32 个具有 SMT 的物理核心。这确实有一点“不公平”的味道。但是考虑到规格描述的一致性,这一点差别只好被忽略了。
Amazon Graviton2 目前被用于 Amazon EC2 家族中的M6g、C6g 以及 R6g 实例。其中:
与我们熟悉的型 x86-64 架构不同,Amazon Graviton2 支持 ARM V8.2 和其它几个架构扩展。特别要强调的是,Amazon Graviton2 支持用于原子操作的 LSE (Large System Extension) 指令集的扩展,可以提高大系统之间的锁定和同步性能。此外,它还支持 FP16 和用于机器学习的 INT8 等。毫不夸张的说,这一次 Amazon Graviton2 给我们带来的足够的惊喜。但不可否认的是,ARM 处理器的体系结构与以往我们所熟悉的 x86-64 处理器的差异还是非常之大的。简而言之,如果我们不掌握针对 ARM 处理器应用优化的方法,我们所看到的这一切性能上的提升不过是镜花水月。
C/C ++ 代码将极大的受益于设置优化代码的编译器标志并启用 ARM 特定的功能。
GCC/G++编译选项
-march 编译项告诉编译器应该为系统的处理器架构生成什么代码,即向编译器声明应该为某种 CPU 架构生成代码。不同的 CPU 具有不同的功能,支持不同的指令集,执行代码的方式也不同。march 标志将指示编译器为系统的 CPU 生成特定的代码,包括 CPU 的所有功能、特性、指令集、异常等等。
需要注意的一点是,对于 GCC 7.x 和 8.1、8.2 和8.3 等版本 -march=native不能正确地检测 Amazon Graviton2 体系架构。务必请使用 -march=armv8.2-a 而不是-march=native。GCC 9.x 以及10.x 则可以很好的识别 Amazon Graviton2 的体系结构。目前Amazon Linux 2 缺少安装的GCC版本是 7.3.1,而 Ubuntu 20.04 缺少安装的 GCC 版本为 9.3.0,还可以通过 sudo apt install gcc-10 安装 GCC 10.0.1。
-mtune 此选项指定 GCC 为其调整代码性能对应特定目标 ARM 处理器类型,可以通过使用这个选项来实现更好的性能。此外,此选项可以指定 GCC 为 big.LITTLE 系统调整代码的性能。
所谓的 big.LITTLE ,是 ARM 的异质运算多核心处理器技术。具体做法是将比较耗电但运算能力强的处理器核心组成“ big集群 ”,与低耗电、运算能力弱的处理器核心组成的“LITTLE 集群”结合在一起,这些处理器核心共享存储器区段,并能够在不同的 CPU 集群之间在线实时分派、切换负载。
Large-System Extensions (LSE)
Amazon Graviton2 处理器支持 ARMv8.2 指令集。LSE 则提供低成本的原子操作。原因是 LSE 提高了 CPU 对 CPU 的通信、锁和互斥的系统吞吐量。当使用LSE而不是加载/存储独占时,这种改进可以提升一个数量级。POSIX 线程库需要 LSE 原子指令。LSE 对于锁定和线程同步例程很重要。例如Amazon Linux 2 与 Ubuntu 20.04 均发布了一个支持 LSE 指令的 libc 库,编译器需要为使用原子操作的应用程序生成 LSE 指令。例如,像 PostgreSQL 这样的数据库代码包含原子结构;带有 std::原子语句的 C++11代码转换为原子操作。GCC 的 -march=armv8.2-a 标志支持所有由 Amazon Graviton2 支持的指令,包括了LSE。如果需要满足对于LSE的支持,还需要libc 的版本要高于 2.3.0。目前 Amazon Linux 2 的 glibc 的版本为 2.26, Ubuntu 20.04 的libc 的版本为 2.31。
Java 是一种通用编程语言。编译后的Java代码可以在支持Java 的所有平台上运行,而无需重新编译。 Java应用程序通常被编译为可在任何Java虚拟机(JVM)上运行的字节码,而与基础计算机体系结构无关。Java受到了包括ARM在内的广泛的支持,并且在ARM64上是开箱即用的。Amazon Corretto是一种免费的、跨平台的、可立即投入生产的 Open Java Development Kit(OpenJDK)发行版,支持由 Amazon Graviton 驱动的实例。
注意:下载时需要选择aarh64 的安装包。
此外,OpenJDK 也提供了对于 ARM64 平台的支持。在Amazon Graviton 处理器上,可以选择安装 openjdk-8、openjdk-11、openjdk-13以及openjdk-14 等不同的 JDK 版本。
Java JAR 可以包含特定于体系结构的共享库。一些 Java 库检查是否找到了这些共享库,是否使用 JNI 调用了本机库,而不是依赖于该函数的通用 Java 实现。尽管代码可以工作,但是如果没有 JNI,性能可能会受到影响。
检查 JAR 是否包含此类共享库的一种快速方法是简单地将其解压缩,并检查是否有任何结果文件是共享库,以及是否缺少 aarch64(arm64)共享库:
Python 程序解释执行的特点需要我们使用的 Python 解释器可以很好适配于 Amazon Graviton 处理器。对于 Python 解释器优化的关键是确保解释器使用了 PGO 和 LTO 等优化编译的选项。获得 Python 解释器编译选项的方法很简单:
python3 -c “import sysconfig; print(sysconfig.get_config_var(‘CONFIG_ARGS’))”
可以看得出来,在不同的 Linux 分发版本中,Python 解释器的版本以及优化方法存在一些差异。对比起来, Ubuntu 20.04 的Python解释器无论是Pystone 还是Pytest-benchmark 都要表现的更好一些。
对于一些场景,Python 应用需要使用 NumPy 以及 SciPy。通常我们通过 pip3 install numpy scipy 安装其二进制版本。一些场景下,使用 BLIS 对 SciPy 和 NumPy 工作负载进行基准测试可以确定额外的性能改进。
注:BLIS是一个可移植的软件框架,用于实例化高性能BLAS高性能稠密线性代数库。
在 Ubuntu 上用 BLIS 安装 NumPy和SciPy
在 Ubuntu上安装 python3-numpy 与 python3-scipy程序包将安装带有 BLAS 和 LAPACK 库的 NumPy和SciPy。用 BLIS 和OpenBLAS在Ubuntu和Debian上安装 SciPy 和 NumPy:
在 blas 与 lapack 之间进行切换
此外,2019年7月25日,PyPy 宣布了对于 Aarch64 架构的支持。在基于 Amazon Graviton 处理器的 A1 实例上进行的性能测试。从结果来看,PyPy 对于 Python 程序性能的提升是非常显著的。
在一台基于 Amazon Graviton2 的m6g.2xlarge 的实例上运行 Pystone,PyPy 的性能是CPython (Python 3.8.2)的21倍!!性能的提升是非常的惊人了。
Go 是一种静态类型的编译型程序语言。Go支持开箱即用的 ARM 64,可以在所有常见的发行版中使用。Go最新的升级提高了性能,所以请确保使用最新版本的Go编译器和工具链。目前 Go的最新版本是1.14,而Amazon Linux 2 与Ubuntu 20.04 提供的安装包的版本均为 1.13。在Ubuntu 环境下,安装 Go 最新版本的一个简单的途径还可以考虑通过snap 进行安装。在snap 中提供的Go 的版本为1.14.6。
Go 的下一个版本1.16 于今年年初发布。Go编译器将会通过以下列出的几项特性来提高ARM 架构下程序的性能。
关于系统优化的话题总是会有太多的内容值得探讨。随着新的基于 ARM 实例的普及,越来越多的开发者一定会遇到应用优化的问题。期待大家的经验与反馈。
本文作者——费良宏
亚马逊云科技首席开发者布道师。在过去的20多年一直从事软件架构、程序开发以及技术推广等领域的工作。他经常在各类技术会议上发表演讲进行分享,他还是多个技术社区的热心参与者。他擅长 Web 领域应用、移动应用以及机器学习等的开发,也从事过多个大型软件项目的设计、开发与项目管理。目前他专注与云计算以及互联网等技术领域,致力于帮助中国的 开发者构建基于云计算的新一代的互联网应用。
想了解Amazon Graviton2更多玩法!2021亚马逊云科技中国峰会不容错过!快来点击链接报名大会吧!