AWS Amazon Linux スワップファイル作成によりSwap領域のサイズを増やす

はじめに
===

AWSのEC2インスタンス(Amazon Linux)に対して、スワップファイルを作成して、Swap領域のサイズを512MBに増やす手順です。

```
# dd if=/dev/zero of=/swapfile1 bs=1M count=512
# chmod 600 /swapfile1
# mkswap /swapfile1
# swapon /swapfile1
```

対象環境
===

対象環境はAWSのEC2インスタンス(Amazon Linux)になります。

・Amazon Linux (3.14.33-26.47.amzn1.x86_64)

概要
===

・ミドルウェア等の動作検証の為、AWSのEC2インスタンス(Amazon Linux)を作成して動作を試す事があります。

検証用のEC2インスタンスは安価なt2.microで作成する事が多いのですが、インスタンスタイプがt2.microの場合、インスタンスに割り当てられるメモリは約1GBしかなく、デフォルトのSwap領域サイズはとても小さいものになります。

http://aws.amazon.com/jp/ec2/instance-types/

・Swap領域のサイズが少ない場合、メモリ使用量が大きめのミドルウェアを起動しようとすると、Swap領域不足によりプロセスの起動が失敗する事があります。

・本ページでは、一時的な検証用途で利用するEC2インスタンス(Amazon Linux)に対して、スワップファイルを作成して、Swap領域のサイズを増やす手順について記載致します。

t2.microで作成したEC2インスタンス(Amazon Linux)のデフォルトのSwap領域サイズ
===

以下はt2.microでEC2インスタンス(Amazon Linux)を作成した直後の状態です。
/proc/meminfoとfreeコマンドの結果を見ると、t2.microの場合、デフォルトではSwap領域のサイズが0KBになっています。

```
[root@example-amazon-linux ~]# grep Mem /proc/meminfo
MemTotal:        1020188 kB
MemFree:          932568 kB
MemAvailable:     902024 kB
[root@example-amazon-linux ~]#
```

```
[root@example-amazon-linux ~]# grep Swap /proc/meminfo
SwapCached:            0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
[root@example-amazon-linux ~]#
```

```
[root@example-amazon-linux ~]# free
             total       used       free     shared    buffers     cached
Mem:       1020188      87612     932576          0       8216      31600
-/+ buffers/cache:      47796     972392
Swap:            0          0          0
[root@example-amazon-linux ~]#
```

Amazon Linuxにスワップファイルを作成してSwap領域のサイズを増やす手順
===

以下の手順を実行すると、Amazon Linuxにスワップファイルを追加してSwap領域のサイズを増やす事が可能です。

なお、例示用のEC2インスタンスのホスト名は「example-amazon-linux」と表記しております。

**(1)「AWS Management Console」->「EC2」->「Launch Instance」でEC2インスタンス(Amazon Linux)を作成し、ec2-userでsshログインします。**

**(2) rootユーザにスイッチします。**

```
[ec2-user@example-amazon-linux ~]$ sudo su -
[root@example-amazon-linux ~]#

[root@example-amazon-linux ~]# uname -a
Linux example-client 3.14.33-26.47.amzn1.x86_64 #1 SMP Wed Feb 11 22:39:25 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@example-amazon-linux ~]#
```

**(3) スワップファイルを作成します。**

・Swap領域に追加するスワップファイルを作成します。以下の例では、512MBのスワップファイルを作成しています。

```
[root@example-amazon-linux ~]# dd if=/dev/zero of=/swapfile1 bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 5.74393 s, 93.5 MB/s
[root@example-amazon-linux ~]#
```

・スワップファイルが作成された事を確認します。

```
[root@example-amazon-linux ~]# ll /swapfile1
-rw-r--r-- 1 root root 536870912 Mar  3 00:52 /swapfile1
[root@example-amazon-linux ~]#
```

・作成したスワップファイルのパーミッションを644か600に変更します。

パーミッションを変更しないと、後述の「swapon /swapfile1」コマンド実行時に「insecure permissions 0644, 0600 suggested.」という警告メッセージが表示されるので、パーミッションを600に変更します。

```
[root@example-amazon-linux ~]# chmod 600 /swapfile1
[root@example-amazon-linux ~]#
```

・作成したスワップファイルをSwap領域用にフォーマットします。

```
[root@example-amazon-linux ~]# mkswap /swapfile1
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=0cf6e114-a01e-45e5-94f6-7c9adf75f5f2
[root@example-amazon-linux ~]#
```

・Swap領域サイズを増やす前の状態を確認します。以下のように何も表示されない事を確認します。

``` 
[root@example-amazon-linux ~]# swapon -s
[root@example-amazon-linux ~]#
```

**(4) スワップファイルを有効化してSwap領域のサイズを増やします。**

・スワップファイルを有効化してSwap領域のサイズを増やします。

```
[root@example-amazon-linux ~]# swapon /swapfile1
[root@example-amazon-linux ~]#
```

・Swap領域のサイズが増えた事を確認します。

```
[root@example-amazon-linux ~]# swapon -s
Filename                                Type            Size    Used    Priority
/swapfile1                              file    524284  0       -1
[root@example-amazon-linux ~]#
```

```
[root@example-amazon-linux ~]# free
             total       used       free     shared    buffers     cached
Mem:       1020188     626832     393356          0       8272     556020
-/+ buffers/cache:      62540     957648
Swap:       524284          0     524284
[root@example-amazon-linux ~]#
```

```
[root@example-amazon-linux ~]# grep Swap /proc/meminfo
SwapCached:            0 kB
SwapTotal:        524284 kB
SwapFree:         524284 kB
[root@example-amazon-linux ~]#
```

Amazon Linuxに作成したスワップファイルを削除してSwap領域のサイズを元に戻す手順
===

作成したスワップファイルを無効化する事で、Swap領域のサイズを元に戻し、スワップファイルを削除する事も可能です。

**(5) スワップファイルを無効化してSwap領域のサイズを元に戻します。**

・Swap領域のスワップファイル名を確認します。以下の例では/swapfile1がスワップファイル名になります。

```
[root@example-amazon-linux ~]# swapon -s
Filename                                Type            Size    Used    Priority
/swapfile1                              file    524284  0       -1
[root@example-amazon-linux ~]#
```

・スワップファイル(/swapfile1)を無効化します。

```
[root@example-amazon-linux ~]# swapoff /swapfile1
[root@example-amazon-linux ~]#
```

・Swap領域のサイズが0になり、swapon -sコマンドの結果が何も表示されない事を確認します。

```
[root@example-amazon-linux ~]# swapon -s
[root@example-amazon-linux ~]#
[root@example-amazon-linux ~]# free
             total       used       free     shared    buffers     cached
Mem:       1020188     633056     387132          0       8552     559568
-/+ buffers/cache:      64936     955252
Swap:            0          0          0
[root@example-amazon-linux ~]#
[root@example-amazon-linux ~]# grep Swap /proc/meminfo
SwapCached:            0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
[root@example-amazon-linux ~]#
```

・スワップファイルを削除します。

```
[root@example-amazon-linux ~]# ll /swapfile1
-rw------- 1 root root 536870912 Mar  3 00:52 /swapfile1
[root@example-amazon-linux ~]# rm -f /swapfile1
[root@example-amazon-linux ~]#

[root@example-amazon-linux ~]# ll /swapfile1
ls: cannot access /swapfile1: No such file or directory
[root@example-amazon-linux ~]#
```

Amazon Linuxインスタンス起動時、自動的にスワップファイルを有効化する
===

Amazon LinuxのEC2インスタンスのreboot時、自動的にスワップファイルを有効化して、Swap領域のサイズを増やすには以下のように設定します。

**(6) /etc/fstabにスワップファイルをマウントする設定を追加します。**

・まずスワップファイルを作成して、Swap領域のサイズを増やしている状態まで設定します。

```
[root@example-amazon-linux ~]# swapon -s
Filename                                Type            Size    Used    Priority
/swapfile1                              file    524284  0       -1
[root@example-amazon-linux ~]#
```

・/etc/fstabにスワップファイルをマウントする設定を追加します。

```
[root@example-amazon-linux ~]# cp -p /etc/fstab /etc/fstab.ORG
[root@example-amazon-linux ~]#
[root@example-amazon-linux ~]# echo "/swapfile1  swap        swap    defaults        0   0" >> /etc/fstab
[root@example-amazon-linux ~]#
```

```
[root@example-amazon-linux ~]# cat /etc/fstab
#
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0
/swapfile1  swap        swap    defaults        0   0
[root@example-amazon-linux ~]#
```

・Amazon Linuxインスタンスをリブートします。

```
[root@example-amazon-linux ~]# reboot
```

・Amazon Linuxインスタンス起動後、スワップファイルが有効化され、Swap領域サイズが増えている事を確認します。

```
[ec2-user@example-amazon-linux ~]$ sudo su -
Last login: Tue Mar  3 01:22:47 JST 2015 on pts/0
[root@example-amazon-linux ~]# swapon -s
Filename                                Type            Size    Used    Priority
/swapfile1                              file    524284  0       -1
[root@example-amazon-linux ~]#
[root@example-amazon-linux ~]# free
             total       used       free     shared    buffers     cached
Mem:       1020188     118940     901248          0       8164      65472
-/+ buffers/cache:      45304     974884
Swap:       524284          0     524284
[root@example-amazon-linux ~]#
[root@example-amazon-linux ~]# grep Swap /proc/meminfo
SwapCached:            0 kB
SwapTotal:        524284 kB
SwapFree:         524284 kB
[root@example-amazon-linux ~]#
```

Amazon Linuxに2つ以上のスワップファイルを作成する
===

あまり利用する事はないかもしれませんが、一時的にSwap領域のサイズを増やしたい場合などで、Amazon Linuxインスタンスに2つ以上のスワップファイルを追加する手順も記載致します。

**(7) 1つ目のスワップファイル(/swapfile1)を作成します。**

```
[root@example-amazon-linux ~]# dd if=/dev/zero of=/swapfile1 bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 5.83074 s, 92.1 MB/s
[root@example-amazon-linux ~]#
[root@example-amazon-linux ~]# chmod 600 /swapfile1
[root@example-amazon-linux ~]#
[root@example-amazon-linux ~]# mkswap /swapfile1
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=774163e6-4f2b-4a7a-ae44-85d0fceb668b
[root@example-amazon-linux ~]#
[root@example-amazon-linux ~]# swapon /swapfile1
[root@example-amazon-linux ~]#
```

**(8) 2つ目のスワップファイル(/swapfile2)を作成します。**

```
[root@example-amazon-linux ~]# dd if=/dev/zero of=/swapfile2 bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 8.54756 s, 62.8 MB/s
[root@example-amazon-linux ~]#
[root@example-amazon-linux ~]# chmod 600 /swapfile2
[root@example-amazon-linux ~]#
[root@example-amazon-linux ~]# mkswap /swapfile2
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=40b5177e-f5b6-475b-9ea0-f75cb9ed948e
[root@example-amazon-linux ~]#
[root@example-amazon-linux ~]# swapon /swapfile2
[root@example-amazon-linux ~]#
```

**(9) 2つのスワップファイルがSwap領域に追加されている事を確認します。**

512MBのスワップファイル2つ分(/swapfile1 + /swapfile2)が有効化され、Swap領域のサイズが1GBに増えている事を確認します。

```
[root@example-amazon-linux ~]# swapon -s
Filename                                Type            Size    Used    Priority
/swapfile1                              file    524284  0       -1
/swapfile2                              file    524284  0       -2
[root@example-amazon-linux ~]#

[root@example-amazon-linux ~]# free
             total       used       free     shared    buffers     cached
Mem:       1020188     947632      72556          0       8920     869296
-/+ buffers/cache:      69416     950772
Swap:      1048568          0    1048568
[root@example-amazon-linux ~]#

[root@example-amazon-linux ~]# grep Swap /proc/meminfo
SwapCached:            0 kB
SwapTotal:       1048568 kB
SwapFree:        1048568 kB
[root@example-amazon-linux ~]#
```

最後に
===

・今回、スワップファイルによりSwap領域のサイズを増やしたのは、あくまで一時的な検証用のAmazon Linuxインスタンスです。

・インスタンス内のメモリ空き容量が不足し、スワップイン／スワップアウトによりSwap領域へのアクセスが頻発するようになると、ディスクI/Oが増えてインスタンスの動作が遅くなったり、ロードアベレージが高くなったりします。

・本ページの趣旨とは外れた蛇足になってしまい済みませんが、一時的な検証用のインスタンスではなく、もしプロダクション環境のインスタンスでスワップが多発するようになった場合は、スワップファイルを作成してSwap領域のサイズを増やすより、インスタンスのメモリサイズ自体を増やす、あるいは不要にメモリを使いすぎている処理がないか調査し、メモリ使用量を削減するといったチューニングを検討した方が良いかもしれません。

***

以上になります。