AWS Lightsail にスワップ領域を追加してメモリに割り当てる

AWS Lightsail にスワップ領域を追加してメモリに割り当てる

September 20, 2022

Lightsail の最も安いプランだと月額 3.50 USD でインスタンスが運用できます。小規模なウェブサイトであればこれで全然運用できるのではないでしょうか。

当然ながら格安な分、サーバのスペックも低めなわけで、特にメモリがなんとも心許ないです。

- 512 MB メモリ
- 1 コアプロセッサ
- 20 GB SSD ディスク
- 1 TB 転送(上限を超えたアウトバウンドデータ転送分は超過分として課金)

対応として、スワップ領域を作成してメモリを割り当てる方法が考えられます。今回はそれを試してみましょう。

FYI:そもそもスワップ領域とは?

1. 現在の使用状況を確認する #

メモリやファイルシステムについて、まずは現在の使用状況を確認します。

1-1. メモリ使用状況を確認する #

現在のメモリ使用状況を確認します。free コマンドを使います。

free -h

>>               total        used        free      shared  buff/cache   available
>> Mem:          481Mi       299Mi        17Mi        39Mi       165Mi       130Mi
>> Swap:         634Mi       241Mi       393Mi

上記から、純粋なメモリの容量は 481 MiB で、スワップ領域は 634 MiB ということがわかります。この通り、スワップ領域は初期状態でも割り当てられているようですね。

補足:free の出力の見方は次の記事がわかりやすいです。 #

補足:free コマンドのオプションは次の通りです。 #

free --help

>> Usage:
>>  free [options]
>>
>> Options:
>>  -b, --bytes         show output in bytes
>>      --kilo          show output in kilobytes
>>      --mega          show output in megabytes
>>      --giga          show output in gigabytes
>>      --tera          show output in terabytes
>>      --peta          show output in petabytes
>>  -k, --kibi          show output in kibibytes
>>  -m, --mebi          show output in mebibytes
>>  -g, --gibi          show output in gibibytes
>>      --tebi          show output in tebibytes
>>      --pebi          show output in pebibytes
>>  -h, --human         show human-readable output
>>      --si            use powers of 1000 not 1024
>>  -l, --lohi          show detailed low and high memory statistics
>>  -t, --total         show total for RAM + swap
>>  -s N, --seconds N   repeat printing every N seconds
>>  -c N, --count N     repeat printing N times, then exit
>>  -w, --wide          wide output
>>
>>      --help     display this help and exit
>>  -V, --version  output version information and exit

補足:top コマンドなら使用状況をリアルタイムに確認できます。 #

top

>> top - 03:55:59 up 7 days,  2:31,  1 user,  load average: 0.00, 0.00, 0.00
>> Tasks:  81 total,   1 running,  80 sleeping,   0 stopped,   0 zombie
>> %Cpu(s):  0.3 us,  0.0 sy,  0.0 ni, 99.3 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
>> MiB Mem :    481.9 total,     15.8 free,    300.9 used,    165.3 buff/cache
>> MiB Swap:    634.8 total,    393.4 free,    241.4 used.    129.0 avail Mem
>>
>>   PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
>>     1 root      20   0  170464   5268   3760 S   0.0   1.1   0:05.72 systemd
>>     .........

1-2. ファイルシステムの使用状況を確認する #

現在のファイルシステムの使用状況を確認します。df コマンドを使います。

df -h

>> Filesystem      Size  Used Avail Use% Mounted on
>> .........
>> /dev/xvda1       20G  3.2G   16G  18% /
>> .........

20GB のうち 18% しか使われておらず、残り 16G が利用可能です。スワップ領域を大きくする余裕があることがわかりました。

補足:df コマンドのオプションは次の通りです。 #

df --help

>> Usage: df [OPTION]... [FILE]...
>> Show information about the file system on which each FILE resides,
>> or all file systems by default.
>>
>> Mandatory arguments to long options are mandatory for short options too.
>>   -a, --all             include pseudo, duplicate, inaccessible file systems
>>   -B, --block-size=SIZE  scale sizes by SIZE before printing them; e.g.,
>>                            '-BM' prints sizes in units of 1,048,576 bytes;
>>                            see SIZE format below
>>   -h, --human-readable  print sizes in powers of 1024 (e.g., 1023M)
>>   -H, --si              print sizes in powers of 1000 (e.g., 1.1G)
>>   -i, --inodes          list inode information instead of block usage
>>   -k                    like --block-size=1K
>>   -l, --local           limit listing to local file systems
>>       --no-sync         do not invoke sync before getting usage info (default)
>>       --output[=FIELD_LIST]  use the output format defined by FIELD_LIST,
>>                                or print all fields if FIELD_LIST is omitted.
>>   -P, --portability     use the POSIX output format
>>       --sync            invoke sync before getting usage info
>>       --total           elide all entries insignificant to available space,
>>                           and produce a grand total
>>   -t, --type=TYPE       limit listing to file systems of type TYPE
>>   -T, --print-type      print file system type
>>   -x, --exclude-type=TYPE   limit listing to file systems not of type TYPE
>>   -v                    (ignored)
>>       --help     display this help and exit
>>       --version  output version information and exit

1-3. スワップファイルを確認する #

初期状態からスワップ領域が割り当てられていたようですので、そのスワップファイルを確認しておきます。

swapon コマンドを使います。sudo で実行しましょう。

sudo swapon -s

>> Filename                  Type    Size    Used    Priority
>> /mnt/.bitnami.swap        file    649996  256992  -2

あるいは次のコマンドでも同じです。

cat /proc/swaps

>> Filename                  Type    Size    Used    Priority
>> /mnt/.bitnami.swap        file    649996  256992  -2

2. 新しいスワップファイルを作成する #

スワップ領域を拡張するために、まずは新規割り当て用のスワップファイルを作成します。

2-1. スワップファイルを作成する #

スワップ領域用のファイルを作成します。fallocate コマンドを使います。sudo で実行しましょう。

スワップ領域のサイズは任意です。以下では 4GB としています。

sudo fallocate -l 4G /mnt/.myswap.swap

ファイルが作られたことを確認します。

ls -lha /mnt

>> total 4.7G
>> drwxr-xr-x  2 root root 4.0K Aug 27 04:35 .
>> drwxr-xr-x 19 root root 4.0K Aug 20 01:25 ..
>> -rw-------  1 root root 635M Aug 20 01:26 .bitnami.swap
>> -rw-r--r--  1 root root 4.0G Aug 27 04:35 .myswap.swap

なおこの時点で df コマンドを実行すると、4GB 分が Used の状態となったことが確認できます。

df -h

>> Filesystem      Size  Used Avail Use% Mounted on
>> .........
>> /dev/xvda1       20G  7.2G   12G  39% /
>> .........

補足:fallocate コマンドと dd コマンド #

fallocate ではなく dd コマンドを実行しても同様のことが行えますが、処理速度の面から fallocate を使用した方が良いでしょう。

dd コマンドで実行する例

sudo dd if=/dev/zero of=/mnt/.myswap.swap bs=1M count=4096

2-2. スワップファイルの権限を変更する #

デフォルトのスワップファイル .bitnami.swap に設定されていた権限に合わせておきましょう。

sudo chmod 600 /mnt/.myswap.swap

変更されたことを確認します。

ls -lha /mnt

>> total 4.7G
>> drwxr-xr-x  2 root root 4.0K Aug 27 04:35 .
>> drwxr-xr-x 19 root root 4.0K Aug 20 01:25 ..
>> -rw-------  1 root root 635M Aug 20 01:26 .bitnami.swap
>> -rw-------  1 root root 4.0G Aug 27 04:35 .myswap.swap

2-3. スワップファイルのファイル属性を変更する #

ファイルがスワップファイルとして使えるように、ファイル属性を変更します。

mkswap コマンドを使います。sudo で実行しましょう。

sudo mkswap /mnt/.myswap.swap

3. 新しいスワップ領域を割り当てる #

新しいスワップファイルをスワップ領域として割り当てます。

3-1. スワップ領域を割り当てる #

swapon コマンドを使います。sudo で実行しましょう。

sudo swapon /mnt/.myswap.swap

スワップ領域が割り当てられたことを確認します。

free -h

>>               total        used        free      shared  buff/cache   available
>> Mem:          482Mi       360Mi       9.0Mi        39Mi       113Mi        69Mi
>> Swap:         4.6Gi       6.0Mi       4.6Gi
sudo swapon -s

>> Filename                  Type    Size    Used    Priority
>> /mnt/.bitnami.swap        file    649996  6656    -2
>> /mnt/.myswap.swap         file    4194300 0       -3

3-2. インスタンス再起動時もスワップ領域を自動で割り当てるようする #

いまのままだとインスタンスを再起動した際は、追加分のスワップ領域の割り当てが行われません。そのため再起動時も自動で割り当てられるように設定します。

fstab のファイルを開きます。

sudo vim /etc/fstab

ファイルの下部に以下を追記します。

# ADD
/mnt/.myswap.swap swap swap defaults 0 0

その後、インスタンスを再起動してから free コマンドなどで確認してみてください。スワップ領域が自動で確保されていることが確認できます。

参考 #