サーバCPUもArmの時代になりました

[Supershipグループ Advent Calendar 2020 - Qiita](https://qiita.com/advent-calendar/2020/supership)の12/8の記事です。

この記事は、2020年10月22日に行われたオンラインイベント [Compute x AWS Graviton2 「Armプロセッサによるコスト最適化」](https://pages.awscloud.com/JAPAN-event-OE-Compute-Graviton2-20201022-reg-event-LP.html)の[登壇内容](https://www2.slideshare.net/Supership_jp/graviton2/Supership_jp/graviton2)を元に加筆・抜粋したものです。

## ざっくりまとめ

* AWS EC2で64bit Arm CPUのインスタンスを使用できるようになりました
* 検証した結果、安くて概ね速くて非常にコスパに優れています
* 一部不向きなタスクもあります
* 積極的に使っていきます

## AWS Gravitonプロセッサ

AWSが作ったArmアーキテクチャのCPUです。

サーバのCPUといえばIntelかAMDが作るx86_64 CPUという状態が10年以上続いてきました。AWSもずっとIntel Xeonを採用し続けてきましたが、2015年にAnnapurna Labsを買収してから独自にCPUの開発を進め、2018年11月に[ArmベースのGravitonプロセッサを使用したA1インスタンスを発表](https://aws.amazon.com/jp/blogs/aws/new-ec2-instances-a1-powered-by-arm-based-aws-graviton-processors/)、2019年12月には[性能を向上させたGraviton2プロセッサ](https://aws.amazon.com/jp/blogs/aws/coming-soon-graviton2-powered-general-purpose-compute-optimized-memory-optimized-ec2-instances/)を発表しました。現在では一般用途のm6g、コンピュート最適化のc6g、メモリ最適化のr6g、バースト可能インスタンスのt4gと、よく使う一通りのインスタンスタイプでGraviton2プロセッサを利用できるようになっています。

## 価格

Gravtionプロセッサの利点は、なんといってもCPUあたりの価格が安いことです。詳細な価格は公式の価格表に譲るとして、メモリ量 = vCPU数 * 2 GB のインスンタンスの2020-12-07時点のオンデマンド価格をAsia Pacific(Tokyo)で比較してみましょう。

| インスタンスタイプ | CPU | メモリ(GB) | vCPU数 | 価格($/h) |
| --- | --- | --- | --- | --- |
| c5.large | Intel Xeon (Skylake) | 4 | 2 | 0.107 |
| a1.large | Graviton | 4 | 2 | 0.0642 |
| c6g.large | Graviton2 | 4 | 2 | 0.0856 |

vCPUあたりの価格はGraviton, Graviton2のほうが安価です。しかも、c5の2vCPUは物理1core 2threadなのに対しa1とc6gは物理2coreとなっており、物理CPU単価では半額以下です。

## 性能

[a1インスタンスは性能が低いという記事](https://www.phoronix.com/scan.php?page=article&item=ec2-graviton-performance)を見たため検証しなかったのですが、Graviton2はAWSが自信ありそうな推し方をしていたので、業務を想定して様々な処理の性能を計測してみました。色々計測した結論としては、

* 全CPUコアを使い切って処理する場面ではGraviton2インスタンスのほうがスループットが高い
* シングルスレッド性能は既存のIntel CPUインスタンスのほうが高い

です。詳細はこちらの[スライド](https://www2.slideshare.net/Supership_jp/graviton2/Supership_jp/graviton2)をご覧ください。ここでは特徴的な結果だけ抜粋して掲載します。

Go1.14.4で実装されたバッチをc6g、c5、c5aの12xlarge(48vCPU)インスタンスで実行し、並行処理のスレッド(goroutine)数を1から48まで変化させてデータ処理量(higher is better)を計測した結果がこちらです。全てのCPUを使い切る設定の時、最も安価なc6gが最も高いスループットを示しました。スレッド数を増やしていくと、c5とc5aはスレッド数がvCPU数の半分=物理core数に達するあたりから処理量が伸びづらくなりますが、vCPU=物理coreのc6gはスレッド数がvCPU数に達するまで処理量が伸び続けます。
![multithreading.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208309/dcb0c3be-e402-00e5-1335-993fd9c6a4cb.png)
上記のような12xlargeという大きなインスタンスだけでなく、largeのような比較的小さなインスタンスでも同様の結果となります。m6g、m5、c5aのlarge(2vCPU)インスタンスにJSONを返却するWebサーバとWebアプリケーションを構築し、捌ける限界リクエスト数(higher is better)を計測したところ、物理2coreを生かしてm6gが最も良い結果を示しました。
![web.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208309/87f4dfcc-de14-5172-c1d4-66427bd7222d.png)
一方、シングルスレッドでいくつかの処理の実行時間(lower is better)を計測した時は、Intel CPUのインスタンスが良好な値を示しました。m系インスタンスどうしで比較すると差が小さいのですが、c系インスタンスで比較するとc5の速さが目立ちます。
![singlethreading.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208309/f822907b-ff99-75f7-1ace-ec042dc4a946.png)
Graviton2の良さが光るのは、「CPU性能が求められず、コスト削減を優先したい」「全CPUコアを使い切った時のスループットが重要」どちらかの場面だと言えるでしょう。シングルスレッド性能が重要な場面には不向きです。

## 使用感

これまでサーバサイドコンピューティングの世界はx86_64を前提として回ってきたため、arm64では実行できないソフトウェアが続出するのでは…と懸念していました。実際に使ってみると、Linuxのディストリビューションが同じであればx86_64でもarm64でも同じ手順で構築でき、同じように使えて拍子抜けすることが多かったです。機械学習を除けば。

Graviton2上でPythonを使い機械学習をやってみた時は、ライブラリのインストールが失敗したりコンパイルに時間がかかったりと、環境構築面で苦労が多い印象でした。また、GPUインスタンスは用意されていません。Graviton2登場当初と比べるとライブラリの対応は進んできており、将来的には問題なく使えるようになることを期待しています。

なお、x86_64で構築済みのサーバのインスタンスタイプをarm64に変更することはできません。既にx86_64で作成済みのサーバをarm64に切り替えるには、サーバをarm64で一から作り直す必要があります。Dockerを使っている場合は、arm64向けにDocker Imageを作り直す必要があります。検証の際はサーバを新規作成して比較したので問題ありませんでしたが、実業務ではこの点がハードルになる場面があるかもしれません。

## おわりに

検証結果を受けて、新しくサーバを構築する際はGraviton2を選ぶことが多くなりました。既存のサーバも積極的にGraviton2に置き換えてコストパフォーマンスを向上させるべく、準備を進めています。

Graviton2の登場はもちろん、macがArmベースのM1チップを採用したりArmを採用した富岳がスパコンランキングで1位になったりと、2020年はArm躍進の年でした。モバイルと組込機器はArm、PCとサーバはx86_64という棲み分けが一気に崩れた感があります。このまま世界のCPUがArmに支配されていくのか、IntelとAMDが奮起して巻き返すのか、競争による製品の改善に期待を持って見守っていきます。