個人で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モード)というものです。(参考)
AWS側でCPU利用率に制限がかけられた場合、インスタンスの動作が遅くなってしまうため、インスタンスタイプを変更するか、Unlimitedモードへ変更する必要があります。
CPUとメモリの節約
リソースが逼迫した場合は、インスタンスタイプを変更するのが正攻法ですが、個人で使っていると料金を上げたくないからインスタンスタイプを維持したいといった事情が出てきます。その際、OSの設定を変更することで解決できることがあります。
CPUの節約
アプリケーションによっては、プロセスごとのCPU使用率を制限しても動作が遅くなるだけで機能に影響ないものもあります。LinuxでCPU使用率を制限するには、cpulimitをインストールして使用します。
sudo apt-get install cpulimit
sudo cpulimit -p <PID> -l <0から100までの数値>
使い方は、topコマンド等でCPU使用率が高いプロセスを抽出した後、cpulimitコマンドでCPU利用率を制限させます。
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領域を設定することで解消できることがあります。
# 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/