概要
先日東京リージョンにもC5/M5インスタンスが対応されました。
コスト的にC4/M4より10~15%ほど安くなるため、可能であれば逐次移行した方が良いです。
ただC5/M5からは
- Elastic Network Adapter (ENA) 対応
- NVMe対応のOSが必要
- デバイス名の変更
といった大きな変更が入っており、単純にインスタンスタイプを変更するだけだと動かない・パフォーマンスが十分に発揮できない可能性があります。
環境
- Ubuntu 16.04
- Packer 1.2.2
主な変更点
Elastic Network Adapter (ENA) 対応
ENA の特徴は高スループット・低レイテンシかつホストプロセッサの負荷を最小限に留めるため、ぜひ対応したい機能です。
対応するためには
- Kernelにena moduleがインストールされている
- インスタンス属性でenaが有効になっている
- ena対応のAMIである
の3つが必要で、それらを満たすと通常ネットワークインタフェースが
$ ethtool -i eth0 driver: vif version: firmware-version: bus-info: vif-0 supports-statistics: yes supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no
であるのに対し、以下のようにENAドライバのインタフェースに変わります。
$ ethtool -i eth0 driver: ena version: 0.6.6 firmware-version: bus-info: 0000:00:03.0 supports-statistics: yes supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no
対応しないと以下のようなエラーがでます。
Error launching source instance: InvalidParameterCombination: Enhanced networking with the Elastic Network Adapter (ENA) is required for the 'm5.large' instance type. Ensure that you are using an AMI that is enabled for ENA.
Kernelにena moduleがインストールされている
以下のコマンドで確認できます。
$ modinfo ena filename: /lib/modules/4.4.11-23.53.amzn1.x86_64/kernel/drivers/amazon/net/ena/ena.ko version: 0.6.6 license: GPL description: Elastic Network Adapter (ENA) author: Amazon.com, Inc. or its affiliates srcversion: 3141E47566402C79D6B8284 alias: pci:v00001D0Fd0000EC21sv*sd*bc*sc*i* alias: pci:v00001D0Fd0000EC20sv*sd*bc*sc*i* alias: pci:v00001D0Fd00001EC2sv*sd*bc*sc*i* alias: pci:v00001D0Fd00000EC2sv*sd*bc*sc*i* depends: intree: Y vermagic: 4.4.11-23.53.amzn1.x86_64 SMP mod_unload modversions parm: debug:Debug level (0=none,...,16=all) (int) parm: push_mode:Descriptor / header push mode (0=automatic,1=disable,3=enable) 0 - Automatically choose according to device capability (default) 1 - Don't push anything to device memory 3 - Push descriptors and header buffer to device memory (int) parm: enable_wd:Enable keepalive watchdog (0=disable,1=enable,default=1) (int) parm: enable_missing_tx_detection:Enable missing Tx completions. (default=1) (int) parm: numa_node_override_array:Numa node override map (array of int) parm: numa_node_override:Enable/Disable numa node override (0=disable)
未対応だと以下になります。
$ modinfo ena
ERROR: modinfo: could not find module ena
インスタンス属性でenaが有効になっている
以下のコマンドで確認できます。
$ aws ec2 describe-instances --instance-ids ${instance_id} --query 'Reservations[].Instances[].EnaSupport' [ true ]
未対応だと空配列が返ります。
古いインスタンスは空配列でしたが、最近作った新しいインスタンスはデフォルトで有効になってました。
※t2
、c4
など
ena対応のAMIである
以下のコマンドで確認できます。
$ aws ec2 describe-images --image-id ${ami_id} --query 'Images[].EnaSupport' [ true ]
未対応だと空配列です。
これはimageの作成時に以下のように指定する必要があります。
$ aws ec2 register-image --ena-support ...
NVMe対応のOSが必要
ドキュメントには以下のOSである必要があると書いてあります。
- Amazon Linux 2014.03 or later
- Ubuntu 14.04 or later
- SUSE Linux Enterprise Server 12 or later
- Red Hat Enterprise Linux 7.4 or later
- CentOS 7 or later
- FreeBSD 11.1-RELEASE
- Windows Server 2008 R2 or later
ref: Compute Optimized Instances - Amazon Elastic Compute Cloud
デバイス名の変更
以前はxvda
、xvdb
といった名前でマッピングされましたが、
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 20G 0 disk └─xvda1 202:1 0 20G 0 part / xvdb 202:16 0 400G 0 disk /data
C5/M5インスタンスはNVMeインタフェースを使うため、デバイス名のスキームが変更されました。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme2n1 259:1 0 1G 0 disk nvme1n1 259:0 0 1G 0 disk nvme0n1 259:2 0 8G 0 disk ├─nvme0n1p1 259:3 0 8G 0 part / └─nvme0n1p128 259:4 0 1M 0 part
なのでもしデバイスのファイルシステムを変える処理を入れてる〜と言ったことをしていると、以前の書き方ではうまくいかないため注意してください。
Packerで作成する
ベースAMIの選択
Kernelがena moduleやNVMeをサポートしている必要があるので、Ubuntu xenialのami-60a4b21c(20180405)
を使います。
探し方は以下を参考にしてください。
ビルド時のオプションを設定
ena_support
というオプションがあるのでそれを使います。
{ "builders": [{ "type": "amazon-ebs", "access_key": "", "secret_key": "", "region": "ap-northeast-1", "source_ami": "ami-60a4b21c", "instance_type": "t2.micro", "ssh_username": "ubuntu", "ami_name": "ena {{timestamp}}", "ena_support": true }], "provisioners": [{ "type": "shell", "inline": [ "sudo apt-get update", "sudo apt-get install -y python-simplejson aptitude" ] }, { "type": "ansible", "host_alias": "api", "ansible_env_vars": ["ANSIBLE_SCP_IF_SSH=y", "ANSIBLE_HOST_KEY_CHECKING=False"], "playbook_file": "./ansible/playbooks/api.yml" }] }
こんな感じですね。
ビルド
$ packer build api.json
動作検証
ビルド後にWebコンソールでポチポチとインスタンスを起動します。
以下のようにちゃんとネットワークインタフェースがenaドライバになっています。
$ ethtool -i ens5 driver: ena version: 1.3.0K firmware-version: expansion-rom-version: bus-info: 0000:00:05.0 supports-statistics: yes supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no
その他疑問点
eth0じゃなくてens5というのは?
最近のLinuxではeth0でなく、predictable network interface namesと言うものが使われるようになりました。
Ubuntu 16.04ではsystemdを使っており、systemdはバージョン197よりこのpredictable network interface namesを使うようになっています。
気になる方は以下のサイトが非常に分かりやすいです。
ほげめも: Debian vs Ubuntu: ネットワークインタフェースの名前
ENAじゃなくてixgbevfとかいう拡張ネットワークもある
C3、C4の頃からあった拡張ネットワーキングのタイプです。
- Intel 82599 Virtual Function (VF) インターフェイス
- 最大 10 Gbps のネットワーク速度
- C3、C4、D2、I2、R3、M4 (m4.16xlarge を除く) インスタンス
- Elastic Network Adapter (ENA)
- 最大 25 Gbps のネットワーク速度
- C5、F1、G3、H1、I3、M5、P2、P3、R4、X1 および m4.16xlarge インスタンス
ref: Linux の拡張ネットワーキング - Amazon Elastic Compute Cloud
ref: VPC 内の Linux インスタンスにおける Intel 82599 VF インターフェイスを使用した拡張ネットワーキングの有効化 - Amazon Elastic Compute Cloud
比較を見て分かるように、ENAの方が高性能なので今後はそちらを利用しましょう。
ap-northeast-1cではC5は使えない
オートスケーリンググループで利用したところ以下のエラーが起きて1c
だと起動できませんでした。
Launching a new EC2 instance. Status Reason: Your requested instance type (c5.xlarge) is not supported in your requested Availability Zone (ap-northeast-1c). Please retry your request by not specifying an Availability Zone or choosing ap-northeast-1d, ap-northeast-1a. Launching EC2 instance failed.
なので1a
か1d
にする必要があります。
まとめ
C5/M5対応のAMIの作成では大きな変更点が多々あるので注意してください。
次回はC4から移行した際のパフォーマンス比較をしようと思います。
ソース
- Upgrading to AWS EC2 C5/M5 instances to reduce cost and the caveats - FittedCloud
- Enabling Enhanced Networking with the Elastic Network Adapter (ENA) on Linux Instances in a VPC - Amazon Elastic Compute Cloud
- Amazon instance-store - Builders - Packer by HashiCorp
- Linux の拡張ネットワーキング - Amazon Elastic Compute Cloud
- EC2拡張ネットワーキングの性能と設定手順 | 外道父の匠