Amazon EC2のCPU最適化オプションでBYOLプロダクトのライセンスコストも最適化可能に

Amazon EC2のCPU最適化オプションによりBYOLプロダクトのライセンス費用を最適化することが可能になりました。過剰なCPUコアを非可動にしたり、Hyper-Threadingを無効にしたりすることができます。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

大栗です。

先程Amazon EC2でCPUの最適化オプションが発表されました。このオプションにより、BYOLプロダクトのライセンス費用を最適化することが可能になりましたのでレポートしてみます。

Introducing Optimize CPUs for Amazon EC2 Instances

CPUの最適化オプションとは?

Amazon EC2ではCPUコア数とメモリやローカルストレージがセットになったインスタンスタイプと呼ばれるスペックで可能インスタンスを起動します。また、CPUはHyper-Threadingが有効になっています。最近のCPUはメニーコアによる高速化が顕著であるため、様々なバリエーションのインスタンスタイプがあってもCPUコア数が多すぎてソフトウェアのライセンス数が過剰になったり、データベースやハイ・パフォーマンス・コンピューティング(HCP)のようなシングルスレッドのパフォーマンスが重要なワークロードではHyper-Threadingが邪魔になる場合がありました。

CPUの最適化オプションでは、インスタンスタイプに対して利用するCPUコア数を指定したりHyper-Threadingを無効にすることが可能になりました。例えばx1e.2xlargeでは仮想CPUコア数(物理コア数4、スレッド数2)が8ですが、CPU最適化オプションを利用すると1,2,3,4,6,8のvCPUで起動することが可能になります。具体的には起動する物理コア数とHyper-Threadingを指定するので、仮想コア数を4にする場合は、物理コア数2でスレッド数2、物理コア数4でスレッド数1というパターンが可能になります。

対象となるインスタンス

CPU最適化オプションが可能なインスタンスは、以下のものとなります。設定可能な物理CPUコア数やスレッド数の詳細はドキュメントを参照下さい

  • 高速コンピューティング
    • p2
    • p3
    • g3
    • f1
  • コンピューティングの最適化
    • c5
    • c4
  • 汎用
    • m5
  • メモリ最適化
    • r4
    • x1
    • x1e
  • ストレージの最適化
    • d2
    • h1
    • i3

注意点

CPUの最適化オプションには注意点があります。

  1. CPU最適化したインスタンスの費用はフルサイズのインスタンスと同額です。
  2. ベアメタルインスタンスはCPU最適化オプションを利用できません。
  3. CPUの設定はインスタンスの起動時のみ可能です。

ハードウェア費用の削減とはならない点に注意しましょう。

やってみる

前提条件

ここでは、r4.2xlargeを例に試してみます。

前提として、以下の内容で実施します。

  • リージョン:東京
  • OS:Amazon Linux AMI 2018.03
  • AMI:amzn-ami-hvm-2018.03.0.20180412-x86_64-gp2(ami-28ddc154)
  • インスタンスタイプ:r4.2xlarge(vCPU:8,メモリ:61GiB)

CPUの設定は以下の3パターンとします。

  • パターン1:CPU最適化無し(vCPUが8)
  • パターン2:物理コアが2個でHyper-Threadingが有効(vCPUが4)
  • パターン3:物理コアが4個でHyper-Threadingが無効(vCPUが4)

起動する

CPU最適化オプションは現在Management Consoleでは設定できないためAWS CLIから実行します。

まずはAWS CLIを最新にします。

pip install -U awscli

パターン1のCPU最適化無しで起動します。

aws ec2 run-instances --image-id ami-28ddc154 --instance-type r4.2xlarge --security-group-ids sg-12345678 --key-name mykey --region ap-northeast-1
{
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
・
・
・
    "Groups": [],
    "OwnerId": "123456789012"
}

パターン2の物理コアが2個でHyper-Threadingが有効で起動します。--cpu-optionsの中でCoreCountに物理コア数2、ThreadsPerCoreにスレッド数2を指定します。

aws ec2 run-instances --image-id ami-28ddc154 --instance-type r4.2xlarge --cpu-options "CoreCount=2,ThreadsPerCore=2" --security-group-ids sg-12345678 --key-name mykey --region ap-northeast-1
{
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
・
・
・
    "Groups": [],
    "OwnerId": "123456789012"
}

パターン3の物理コアが4個でHyper-Threadingが無効で起動します。--cpu-optionsの中でCoreCountに物理コア数4、ThreadsPerCoreにスレッド数1を指定します。

aws ec2 run-instances --image-id ami-28ddc154 --instance-type r4.2xlarge --cpu-options "CoreCount=4,ThreadsPerCore=1" --security-group-ids sg-12345678 --key-name mykey --region ap-northeast-1
{
    "Instances": [
        {
            "Monitoring": {
                "State": "disabled"
            },
・
・
・
    "Groups": [],
    "OwnerId": "123456789012"
}

CPU情報を確認する

パターン1:CPU最適化無し(vCPUが8)

各々のCPU情報を取得してみます。

まずはパターン1です。Socket(s)が1でCore(s) per socketが4のため物理コアが4個で有ることが分かります。そしてThread(s) per coreが2でHyper-Threadingが有効であることが分かります。CPU(s)が8なので全部で8個の仮想CPUが動いていることになります。

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Stepping:              1
CPU MHz:               1553.051
BogoMIPS:              4600.08
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              46080K
NUMA node0 CPU(s):     0-7

パターン2:物理コアが2個でHyper-Threadingが有効(vCPUが4)

パターン2です。Socket(s)が1でCore(s) per socketが2のため物理コアが2個で有ることが分かります。そしてThread(s) per coreが2でHyper-Threadingが有効であることが分かります。CPU(s)が4なので全部で4個の仮想CPUが動いていることになります。

$ LANG=C lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Stepping:              1
CPU MHz:               2211.482
BogoMIPS:              4600.18
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              46080K
NUMA node0 CPU(s):     0-3

パターン3:物理コアが4個でHyper-Threadingが無効(vCPUが4)

パターン2です。Socket(s)が1でCore(s) per socketが4のため物理コアが4個で有ることが分かります。そしてThread(s) per coreが1でHyper-Threadingが無効であることが分かります。CPU(s)が4なので全部で4個の仮想CPUが動いていることになります。

$ LANG=C lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
Stepping:              1
CPU MHz:               1538.646
BogoMIPS:              4600.12
Hypervisor vendor:     Xen
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              46080K
NUMA node0 CPU(s):     0-3

さいごに

コア数に応じてソフトウェアライセンス費用が発生するプロダクトで、大量にメモリや高速なローカルストレージが欲しい場合にはトータルコストを低減できるので有用かと思います。またマルチスレッドでスケールしにくいHCPやDBなどのワークロードではシングルスレッド性能が重要になるためHyper-Threadingを無効することで高速化が図れる場合があるかと思います。

ソフトウェアにより、物理コア数に応じてライセンス費用がかかったり、仮想コア数に応じてライセンス費用がかかったりします。ライセンス形態に応じて費用を最適化するために物理コア数をスレッド数の組み合わせを検討しましょう。

引用