【AWS】バースト可能インスタンスについて

#バースト可能インスタンスとは
・AWSのインスタンスt2とt3・t3aに存在するシステム
・あまりCPUを必要としないサーバや、たまにしかCPUを使わないサーバの場合にこのインスタンスタイプにする
・このシステムを使ってるインスタンスは安い

#バースト可能インスタンスの詳しい説明
CPUを使わないときに「<font color="purple">**クレジット**</font>」と呼ばれる通貨みたいなものを貯めておき
いざCPUを使いたいとなったときにその通貨を支払って100%のパフォーマンスを出すことができる

t2、t3・t3a以外のインスタンスは普通に100%のCPUを使うことができるが料金が高い

##仕組み
CPU100%の状態を1分間続けると1クレジット失われる（全インスタンスタイプ共通）
（例えば20%の状態を1分間続けば1/5クレジット、2分間続くと2/5クレジットが失われる）

逆に起動している間、常にクレジットは回復していく
インスタンスによって1時間に回復するクレジットが異なる（t2.nanoの場合1時間に3クレジット回復）

払うCPUがなくなったときは「<font color="purple">**ベースラインパフォーマンス**（図で説明）</font>」までのCPUしか使うことができなくなる。

![クレジット仕組み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156086/04dc72b5-de1d-b523-8ff7-6a153284bc6b.png)


##各インスタンスのクレジット関連のスペック
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/t2-credits-baseline-concepts.html#t-instance-credit-table


#t3インスタンスとt3aインスタンスの違い
t3はintel製のCPUを使用しているのに対して、t3aはAMDのEPYCシリーズを使用している
t3に比べて、t3aのほうが10%安い

IntelとAMDスペック比較についてはあまりよくわかってないので
こちらを見ていただくとわかりやすいと思います。
https://dev.classmethod.jp/cloud/aws/compare-rebuildtime-amd-epyc-t3a/#toc-t3at3-
https://www.pressmantech.com/tech/aws/6781

#t2インスタンスとt3・t3aインスタンスの違い

<table>
<tr><td></td><td>t2</td><td>t3・t3a</td></tr>
<tr><td>モードデフォルト設定</td><td>スタンダードモード</td><td>無制限モード</td></tr>
<tr><td>起動クレジット</td><td>有り</td><td>無し</td></tr>
<tr><td>インスタンス停止時</td><td>クレジットはすべて失われる</td><td>7日間保持される</td></tr>
<tr><td>料金</td><td>-</td><td>t2に比べてインスタンス料金が10%程度安い</td></tr>
<tr><td>仮想コア数</td><td>-</td><td>nano～smallはt2に比べて２倍</td></tr>
<tr><td>CPUクレジット回復量</td><td>-</td><td>t2に比べて多い</td></tr>
</table>
##無制限モードとは
上では 「クレジットがなくなった場合は ベースラインパフォーマンス までのCPUしか使うことができなくなる。」と書いたが、
無制限モードの場合は上限を突破して使用することができるようになる。

ただし、24時間 or 起動していた時間での平均CPUが　**ベースラインパフォーマンス** を超えていた場合は追加料金が発生する
![無制限モードとは.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156086/417e7d1e-dbb0-94e0-d88c-b0d7dd1a88d8.png)


##起動クレジットとは
<font color="red">t2インスタンスかつスタンダードモードの場合</font>、インスタンスを起動したときに、[ vCPUの数 ☓ 30 ] のクレジットを持った状態で開始できる
vCPUの数はインスタンスタイプによって異なる
![起動クレジットとは.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156086/e84bde06-bcbd-4e7c-e5cd-386c0c366891.png)


起動クレジットの獲得は、リージョン内の全インスタンス合計で24時間100回の制限がある。
100回を超えてしまうとそれ以上のインスタンス起動には起動クレジットが付与されない。

##t3インスタンスを使用するための必要条件
t3インスタンスにはAWS Nitroと呼ばれる仕組みを使用しており、
それには必要なドライバ等があるのでインストールしなければならない

###条件１：64ビット版の OS かつ HVM  である
```sh:ビット確認方法
$ uname -m
x86_64　　←　x86_64なら64ビット　
```

仮想化形式確認方法
![必要条件.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156086/1311b955-0fce-3cce-692c-2fd13f531360.jpeg)



###条件２：NVMeドライバがインストールされている
kernelが 3.19以降の場合は入っている

```sh:確認方法
$ uname -r
4.4.19-29.55.amzn1.x86_64
```
```sh:導入方法
# yum update kernel

完了後インスタンス再起動
```

###条件３：Elastic Network Adapter（ENA）ドライバがインストールされている
```:確認方法
$ modinfo ena
filename:       /lib/modules/4.4.19-29.55.amzn1.x86_64/kernel/drivers/amazon/net/ena/ena.ko
version:        1.0.2
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
srcversion:     EB49676051BBF026315D272
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.19-29.55.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)
 (int)

上記のような行が出てきていればOK


ERROR: modinfo: could not find module ena
と出ていればNG
```

```sh:導入方法
条件２がクリアしていればおそらく問題ないはず
```

###条件４：インスタンスに拡張ネットワーキングの enaSupport 属性が設定されている
```sh:確認方法（aws-cli）
$ aws ec2 describe-instances --instance-ids インスタンスid --query "Reservations[].Instances[].EnaSupport"
[
    true　　　←　trueならOK（設定されていない場合は何も出ない）
]
```
```sh:導入方法（aws-cli）
#対象インスタンスを停止した状態で
$ aws ec2 modify-instance-attribute --instance-id インスタンスid --ena-support
```