この記事の下書きです。誤字、間違いが多いので ↓ を見たほうが良いです。
developers.cyberagent.co.jp
Apple M1 で ARM のすごさを体感したかと思いますが AWS EC2 にも ARM が搭載されたインスタンスがあります。
aws.amazon.com
今回はとあるサービスの dev, stg, sbx(サンドボックス)の全 EC2 インスタンスを m5.large から t4g.medium へ移行させました。
AWS Graviton は何が嬉しいか
ARM が搭載された EC2 インスタンスは、従来の Intel/AMD が載ったインスタンスよりも安くて高性能でコスパが良いです。
現在(2020/11/19)は EC2 のみだけですが、他サービスにも出てきそうです。
ARM が搭載された m6g.large と従来の m5.large を比較した記事は半年前に記事にしています。
rarirure.rip
ARM に対応させることはじめ
上記サービスは Ansible と Terraform で管理されているためまずは Ansible で ARM に対応させるとこから始めます。
x86_64 から、aarch64 の Ansible へ
まずはミドルウェア等に aarch64 に対応しているかが鍵です。
一部ミドルウェアでは x86_64 と aarch64 でバージョン差異があるので注意してください。
今回使用しているミドルウェアで変更が必要だったのは下記ミドルウェアでした。
- nginx
- td-agent
Ansible が綺麗に整備されていて
1営業日もかからずに、Ansible で ARM 対応することができました。
エントロピーについて
EC2 の ARM 版では、random デバイスに対するエントロピーがとても少ない場合によってはエラー、もしくは大幅なパフォーマンス低下を引き起こします。
今回は tomcat(java) を利用して乱数生成する部分が大幅にパフォーマンスが低下しました。
これは乱数生成で /dev/random を利用しますがこれに対するリソースが少ないために発生します。
t4g.medium のエントロピーを確認すると
$ cat /proc/sys/kernel/random/entropy_avail 11
たったの 11 しかありませんでした。
haveged
これを解決するのが haveged です。
wiki.archlinux.jp
インストールも yum で簡単に、インストール後は systemd で起動します。
有効化後のエントロピー数は 1401 となりました。
Ansible の準備ができたら ARM な EC2 を作成して、Ansible 流して動作確認してターゲットグループに追加するだけです。
問題なければ x86_64 な EC2 を引き抜けばノーメンテで切り替えられます。
結果
本番環境はこれからですが、開発環境を全て ARM 版へ切り替えをしました。
今回は m5.large から t4g.medium への切り替えです。
時間単位辺りの料金で言うと
- m5.large: $0.124/h
- t4g.medium: $0.0432/h
と価格差は3倍ぐらいあることに注目してください。
パフォーマンス
赤い縦線が切り替え後です。
ALB レスポンスタイム
Load Average
価格差は m5.large が t4g.medium の3倍にもかかわらず、性能差はないと言っても問題ないかと思います。
開発環境の EC2 は 26台で、今回の ARM 切り替えで単純計算で
0.124 * 720 * 26 = $2321.28/month
0.0432 * 720 * 26 = $808.704/month
となります。性能劣化なしに、年間 180万円以上の削減ができました。
本番環境では m5.(x)large -> m6g.(x)large への切り替えをするため価格差は小さくなりますがこの記事の通り性能差は更に大きいのでやる価値は十二分にあるかと思います。
rarirure.rip