aws memo

AWS関連の備忘録 (※本ブログの内容は個人的見解であり、所属組織及び企業の意見を代弁するものではありません。1年以上古いエントリは疑ってかかってください)

EC2の Top500 変遷まとめ

まとめてみた。

Flopsの向上はもちろんだが、年々、Efficiencyが上がっていることが読み取れる。特に、C3になってEnhanced NetworkとしてSR-IOVが使えるようになり、向上している。

  cc1.4xlarge cc2.8xlarge c3.8xlarge
cores 7,040  17.024  26,496
Linpak(Rmax) 41.8TFlops  240.1TFlops  484.2TFlops
Theoretical Peak(Rpeak) 82.5TFlops  354.1TFlops  593.9TFlops
Efficiency 50.6%  67.8%  81.5%
Date 11/2010 11/2011 11/2013
Rank 233 42 64

 

以下、Topp500の情報ソース

CC1.4xlarge 

Amazon EC2 Cluster Compute Instances - Amazon EC2 Cluster, Xeon X5570 2.95 Ghz, 10G Ethernet | TOP500 Supercomputer Sites

CC2.8xlarge 

Amazon EC2 Cluster Compute Instances - Amazon EC2 Cluster, Xeon 8C 2.60GHz, 10G Ethernet | TOP500 Supercomputer Sites

C3.8xlarge 

Amazon EC2 C3 Instance cluster - Amazon EC2 Cluster, Intel Xeon E5-2670v2 10C 2.500GHz, 10G Ethernet | TOP500 Supercomputer Sites

[HPC] C3.8xlarge のRHEL6.4 HVMで SR-IOVを有効にする

CC2 (Sandy Bridge) の後継 C3 (Ivy Bridge)が追加された。

詳しくはこちらを参考のこと。

Amazon Web Services ブログ: 【AWS発表】 新世代の数値計算向けEC2インスタンス

 

HPCの観点から見ると、CC2.8xlarge の後継に当たるのは C3.8xlarge となる。

スベック比較は以下の通り

 

  c3.8xlarge cc2.8xlarge cc1.4xlarge
vCPU数  32  32  16
総ECU 108 88  33.5
RAM(GiB) 60  60.5  23
インスタンス
ストレージ
 2 x 320(SSD)  4 x 840  2 x 840
CPU Xeon E5-2680v2
(Ivy Bridge)
 Xeon E5-2670
(Sandy Bridge)
Xeon X5570
(Nehalem) 
NIC High 10GbE  10GbE

その中でも特に注目すべき点は、ネットワークI/Oの改善( Enhanced Networking)で、C3はSR-IOVをサポートしている。

※SR-IOVについてはこちら。(PCI-SIG SR-IOV Primer: An Introduction to SR-IOV Technology )

SR-IOVを使うには、3つの条件が必要

  1. VPC内でHVM AMIをC3.8xlargeで起動する 
  2. ・OS側で ixvgevf ドライバを有効にする
  3. インスタンスの属性 sriovNetSupport を有効にする(もしくは sriovNetSupportが有効になったHVM AMIで起動する)

1については割愛。2については、Amazon Linux 2013.9 では有効になっているので、気にしなくて良い。

以下、RHEL 6.4 HVM AMIで、SR-IOVを有効にする手順。

1. VPCで起動
$ ec2-run-instances ami-18a23f28 -t c3.8xlarge -s subnet-xxxxx \
  -k id_rsa -g sg-xxxxxx --region us-west-2 --private-ip-address 172.16.11.204
2. OSでixvgevfドライバを入れる

ixvgevfドライバのビルドに必要な前処理

# sudo yum -y update
# sudo yum -y install gcc make kernel-devel kernel-headers
$sudo reboot
3.ドライバダウンロード、ビルド、インストール
$ wget "http://downloads.sourceforge.net/project/e1000/ixgbevf stable/2.11.3/ixgbevf-2.11.3.tar.gz"
$ tar zxvf ixgbevf-2.11.3.tar.gz
$ cd ixgbevf-2.11.3/src
$ sudo make install
$ sudo su -
# echo "options ixgbevf InterruptThrottleRate=1,1,1,1,1,1,1,1" > /etc/modprobe.d/ixgbevf.conf
# reboot
4.インスタンス停止,属性sriov変更,起動
$ ec2-stop-instances i-xxxxxx --region us-west-2
$ ec2-modify-instance-attribute --region us-west-2 --sriov simple i-xxxxxx
$ ec2-start-instances i-xxxxxx --region us-west-2
5.確認
$ /sbin/ethtool -i eth0 | grep driver
driver: ixgbevf

注意

ixgbevf をセットアップする前に、 sriovNetSupportを有効にして起動してしまうと、NICが有効にならずにOSが起動してしまい、リモートからアクセスできなくなる。必ず、 上記3の手順をした後に 4をすること

参考

Enabling Enhanced Networking on Linux Instances in a VPC - Amazon Elastic Compute Cloud

AWS CLI で Route53のレコードを操作する

AWS CLI でRoute53を操作してみる。

ホストの追加や、切り替えをシステムから自動化したい場合などで使える。

参考

  change-resource-record-sets — AWS CLI 1.2.0 documentation

 POST ChangeResourceRecordSets - Amazon Route 53

ゾーン一覧の取得

$ aws route53 list-hosted-zones
{
    "HostedZones": [
        {
            "ResourceRecordSetCount": 11, 
            "CallerReference": "C1D3F932-D850-1792-AE9E-YYYYYYYYYYYY", 
            "Config": {
                "Comment": "example.com"
            }, 
            "Id": "/hostedzone/ABCDXYZ", 
            "Name": "example.com."
        }, 
        {
            "ResourceRecordSetCount": 6, 
            "CallerReference": "31E1727B-8557-540E-82FE-XXXXXXXXXXXX", 
            "Config": {
                "Comment": "example.net"
            }, 
            "Id": "/hostedzone/ZYXDCBA", 
            "Name": "example.net."
        }
    ], 
    "IsTruncated": false, 
    "MaxItems": "100"
}

こんな感じ

次に、ゾーンのレコードセット一覧を取得してみる 

$ aws route53 list-resource-record-sets --hosted-zone-id ABCDXYZ
{
    "IsTruncated": false, 
    "ResourceRecordSets": [
        {
            "ResourceRecords": [
                {
                    "Value": "ns-xxxx.awsdns-62.co.uk."
                }, 
 ......
            ], 
            "Type": "NS", 
            "Name": "example.com.", 
            "TTL": 172800
        }, 
        {
            "ResourceRecords": [
                {
                    "Value": "ns-XXXX.awsdns-62.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400"
                }
            ], 
            "Type": "SOA", 
            "Name": "example.com.", 
            "TTL": 900
        }, 
        {
            "ResourceRecords": [
                {
                    "Value": "192.0.2.33"
                }, 
                {
                    "Value": "198.51.100.23"
                }, 
                {
                    "Value": "203.0.113.3"
                }
            ], 
            "Type": "A", 
            "Name": "fuga.example.com.", 
            "TTL": 300
        }, 
 .......
    ],
    "MaxItems": "100"
}

次に、新しいレコードセットを追加する

まず、jsonファイルを用意する。この例はexample.com ゾーンに、fuga.example.net を、CNAMEとしてmefu.example.com に登録する。つまり

 mefu 60 IN CNAME fuga.example.net.

のイメージ。

$ cat /home/ec2-user/create-cname.json
{
  "Comment": "create CNAME record",
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "mefu.example.com.",
        "Type": "CNAME",
        "TTL": 60,
        "ResourceRecords": [
          {
            "Value": "fuga.example.net."
          }
        ]
      }
    }
  ]
}
$ aws route53 change-resource-record-sets --hosted-zone-id ABCDXYZ --change-batch file:////home/ec2-user/create-cname.json

最後に、レコードセットを更新してみる。先ほどのCNAME mefu.example.com の内容を fuga.example.net. から、 dabo.example.net. に変更する。つまり

 mefu 60 IN CNAME fuga.example.net.

 mefu 60 IN CNAME dabo.example.net.

にするイメージ。Actionとしては、DELETEとCREATEをバッチで投げることになる。

$ cat /home/ec2-user/update-cname.json
{
  "Comment": "create CNAME record",
  "Changes": [
    {
      "Action": "DELETE",
      "ResourceRecordSet": {
        "Name": "mefu.example.com.",
        "Type": "CNAME",
        "TTL": 60,
        "ResourceRecords": [
          {
            "Value": "fuga.example.net."
          }
        ]
      }
    },
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "mefu.example.com.",
        "Type": "CNAME",
        "TTL": 60,
        "ResourceRecords": [
          {
            "Value": "dabo.example.net."
          }
        ]
      }
    }
  ]
}
$ aws route53 change-resource-record-sets --hosted-zone-id ABCDXYZ --change-batch file:////home/ec2-user/update-cname.json

AWS CLIで上限を確認する

AWSには、各種の上限(ソフトリミット)があり、上限緩和申請で上限を上げることができる。

 ※ 詳しくはこちら AWS: サービスの各種上限( softlimit) と上限緩和申請 - aws memo

 

上限緩和を申請した結果、自分のアカウントの上限が今いくつになっているか?を確認するには、サポート(ビジネス・エンタープライズ)に入ると使える Trusted Advisor で確認できる。

 

 

こちら、AWS CLIでも一部確認可能になった。実行例は以下

$ aws ec2 describe-account-attributes --region ap-northeast-1 --output text

vpc-max-security-groups-per-interface
5
max-instances
20
supported-platforms
EC2
VPC
default-vpc
none
max-elastic-ips
5
vpc-max-elastic-ips
5

個別の値を取得するには

$ aws ec2 describe-account-attributes --attribute-names max-instances --region ap-northeast-1 --output text

max-instances
20

今後増えていくと思われる。

AWS CLIでEC2を起動 (エフェメラルディスク付き)

AWS CLIで、 run-instances を実行する

リファレンスはこちら:

 run-instances — AWS CLI 1.1.2 documentation

 Using Amazon EC2 Instances - AWS Command Line Interface

 RunInstances - Amazon Elastic Compute Cloud

ポイントは、--block-device-mappings オプションの JSON記述。

$ aws ec2 run-instances \
  --region us-west-2 \
  --image-id ami-0358ce33 \
  --key-name id_rsa \
  --security-group-ids  sg-c20dfdad \
  --subnet-id  subnet-36b5ec5d \
  --private-ip-address 10.100.1.10 \
  --instance-type m1.large \
  --ebs-optimized \
  --block-device-mappings '[ {"DeviceName":"/dev/sdb","VirtualName":"ephemeral0"}, {"DeviceName":"/dev/sdc","VirtualName":"ephemeral1"}]'

JSONの部分を整形するとこんな感じ。

[ 
  {
    "DeviceName":"/dev/sdb",
    "VirtualName":"ephemeral0"
  }, 
  {
    "DeviceName":"/dev/sdc",
    "VirtualName":"ephemeral1"
  }
]

このJSONをファイルに書きだして、このように実行することも可能

$ aws ec2 run-instances \
  --region us-west-2 \
  --image-id ami-0358ce33 \
  --key-name id_rsa \
  --security-group-ids  sg-c20dfdad \
  --subnet-id  subnet-36b5ec5d \
  --private-ip-address 10.100.1.10 \
  --instance-type m1.large \
  --ebs-optimized \
  --block-device-mappings file:////home/ec2-user/mapping.json

もしくは

$ aws ec2 run-instances \
  --region us-west-2 \
  --image-id ami-0358ce33 \
  --key-name id_rsa \
  --security-group-ids  sg-c20dfdad \
  --subnet-id  subnet-36b5ec5d \
  --private-ip-address 10.100.1.10 \
  --instance-type m1.large \
  --ebs-optimized \
  --block-device-mappings http://mybucket.s3.amazonaws.com/mapping.json

参考 Specifying Parameter Values for the AWS Command Line Interface 

ちなみに、従来の ec2-run-instances だとこんな感じ

ec2-run-instances \
  ami-0358ce33 \
  -k id_rsa \
  -g sg-c20dfdad \
  --region us-west-2 \
  -s subnet-36b5ec5d \
  --private-ip-address 10.100.1.12 \
  --ebs-optimized  \
  -b "/dev/sdb=ephemeral0" \
  -b "/dev/sdc=ephemeral1" \
  -t m1.large \ 

ec2周りは、まだ api-toolsの方が少し便利かも。というか、botoの方が便利かも。

AWS CLIで VPCのDNS設定を操作する

VPC Defaultのタイミングで対応した、VPCDNSホスト名、およびDNSの名前解決機能を、AWS CLIでOn/Offする。

Amazon Web Services ブログ: 【AWS発表】Amazon EC2 アップデート - 全ての皆様にVPC (Virtual Private Cloud)を!

 DNSホスト名 - default VPC内に起動されたインスタンスは全て、プライベートとパブリックなホスト名を持ちます。DNSホスト名は既存のVPCでは無効になっていますが、必要に応じて有効にできます。同じVPC内の他のインスタンスのパブリックホスト名を名前解決すると、対象インスタンスのプライベートIPが返されます。VPCの外のインスタンスのパブリックホスト名を名前解決すると、そのインスタンスのパブリックIPが返されます。

DNSの名前解決 - DNSの名前解決は全てのVPCで有効になっていますが、必要に応じてVPC内に用意されたDNSサービスの使用を無効にすることができます。

 詳細はこちら Using DNS with Your VPC - Amazon Virtual Private Cloud

ということで、操作方法は以下。

DNSホスト名のOn/Offを確認する

$ aws ec2 describe-vpc-attribute --region us-west-2 \
                  --vpc-id vpc-f18dd49a  \
                  --attribute enableDnsHostnames

DNS名前解決のOn/Offを確認する

$ aws ec2 describe-vpc-attribute --region us-west-2 \
                  --vpc-id vpc-f18dd49a  \
                  --attribute enableDnsSupport

DNS名前解決をOnにする

$ aws ec2 modify-vpc-attribute --region us-west-2 \
                  --vpc-id vpc-f18dd49a  \
                  --enable-dns-support  '{"Value":true}' 

DNSホスト名をOnにする

$ aws ec2 modify-vpc-attribute --region us-west-2 \
                  --vpc-id vpc-f18dd49a  \
                  --enable-dns-hostnames '{"Value":true}' 
参考1 コマンドリファレンス

modify-vpc-attribute — AWS CLI 1.1.2 documentation

describe-vpc-attribute — AWS CLI 1.1.2 documentation

参考2 APIリファレンス

ec2-describe-vpc-attribute - Amazon Elastic Compute Cloud

ec2-modify-vpc-attribute - Amazon Elastic Compute Cloud

参考3 従来のコマンド (api-tools)

従来のコマンドラインだと このような操作にななる

$ ec2-describe-vpc-attribute vpc-f18dd49a  \
                   --region us-west-2 \
                   --dns-support
$ ec2-describe-vpc-attribute vpc-f18dd49a  \
                   --region us-west-2 \
                   --dns-hostnames
$ ec2-modify-vpc-attribute -c vpc-f18dd49a \
                   --region us-west-2 \
                   --dns-support true
$ ec2-modify-vpc-attribute -c vpc-f18dd49a \
                   --region us-west-2 \
                   --dns-hostname true

リファレンス

ec2-modify-vpc-attribute - Amazon Elastic Compute Cloud

ec2-describe-vpc-attribute - Amazon Elastic Compute Cloud