CPU・メモリを節約してEC2を安く運用するためのTips

個人でAWSを使っていると、どうしても利用料金が気になります。そこで、EC2の課金形態と、私がよく使うEC2の節約術をまとめました。

# EC2の料金の決まり方

EC2のインスタンスは、以下の要素で料金が決まります。

- インスタンスタイプ（＋T2/T3/T4g Unlimitedモード料金）
- EBS
- データ転送料

上記のうち、CPUやメモリは、インスタンスタイプによって決定されます。

|インスタンスタイプ |vCPU |メモリ |CPUのベースライン使用率 |
|---|---|---|---|
|t3.nano |2 |0.5GB |5% |
|t3.micro |2 |1GB |10% |
|t3.small |2 |2GB |20% |

参照元：https://aws.amazon.com/jp/ec2/pricing/on-demand/

例えばt3.microを選択した場合、メモリが1GBの仮想マシンが提供されます。この仮想マシンを利用していてメモリが不足した場合、1つ上のt3.smallにスペックアップする必要があります。

また、t2、t3、t4gなどのインスタンスでは、CPUのベースライン使用率が定められています。これは、常時ベースライン使用率を超えてインスタンスを使用している場合は、AWS側で強制的にベースラインまで落とされる(スタンダードモード) or 追加料金がかかる(Unlimitedモード)というものです。（[参考][1]）
AWS側でCPU利用率に制限がかけられた場合、インスタンスの動作が遅くなってしまうため、インスタンスタイプを変更するか、Unlimitedモードへ変更する必要があります。

# CPUとメモリの節約

リソースが逼迫した場合は、インスタンスタイプを変更するのが正攻法ですが、個人で使っていると料金を上げたくないからインスタンスタイプを維持したいといった事情が出てきます。その際、OSの設定を変更することで解決できることがあります。

### CPUの節約

アプリケーションによっては、プロセスごとのCPU使用率を制限しても動作が遅くなるだけで機能に影響ないものもあります。LinuxでCPU使用率を制限するには、**cpulimit**をインストールして使用します。

```plaintext:Ubuntuの場合
sudo apt-get install cpulimit
sudo cpulimit -p <PID> -l <0から100までの数値>
```

使い方は、**top**コマンド等でCPU使用率が高いプロセスを抽出した後、**cpulimit**コマンドでCPU利用率を制限させます。

```plaintext:一番使用率が高いプロセスを5%に制限する例
ubuntu@ip-xxx-xxx-xxx-xxx:~$ top

top - 11:52:29 up 10 days, 12:33,  0 users,  load average: 0.43, 0.11, 0.04
Tasks: 179 total,   1 running, 178 sleeping,   0 stopped,   0 zombie
%Cpu(s): 12.5 us, 18.8 sy,  0.0 ni, 68.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :    978.6 total,     67.9 free,    444.5 used,    466.1 buff/cache
MiB Swap:    512.0 total,    310.9 free,    201.1 used.    358.7 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  
  41221 ubuntu    20   0 2112076 105256  31120 S  13.3  10.5   0:06.86 termina+ 
   1324 ubuntu    20   0  552680  49776  21044 S   6.7   5.0  33:00.79 Xorg     
  41153 xrdp      20   0   47512  30028  11132 S   6.7   3.0   0:01.39 xrdp     
  41163 ubuntu    20   0   14092  12384   1368 S   6.7   1.2   0:02.87 wineser+ 
      1 root      20   0  169056   9580   5744 S   0.0   1.0   0:15.58 systemd  
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.01 kthreadd 
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp   
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par+ 
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+ 


ubuntu@ip-xxx-xxx-xxx-xxx:~$ sudo cpulimit -p 41221 -l 5
Process 41221 detected
```

# メモリの節約

メモリ不足でアプリケーションが落ちてしまうような場合は、仮想マシンにswap領域を設定することで解消できることがあります。

```plaintext:1GBのswapを確保する例（Ubuntu）
# 1GBの領域を確保
sudo fallocate -l 1G /swapfile

# アクセス権を自分のみに設定
sudo chmod 600 /swapfile

# スワップ領域の作成
sudo mkswap /swapfile

# スワップ領域の有効化
sudo swapon /swapfile

# 起動時にスワップ領域を有効化するためにfstabに記述
sudo cp /etc/fstab /etc/fstab.bk
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
```

今回はUbuntuで試しましたが、Amazon Linux 2 だと`fallocate`で確保した領域をswapにできないらしいです。（当方は未確認） `dd`使いましょう。
https://dev.classmethod.jp/articles/al2-swapfile-fallocate-ng/


# 参考文献
[バーストパフォーマンスインスタンスの CPU クレジットとベースライン使用率][1]

[1]:https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/burstable-credits-baseline-concepts.html