Edited at

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

More than 3 years have passed since last update.


はじめに

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領域のサイズを増やすより、インスタンスのメモリサイズ自体を増やす、あるいは不要にメモリを使いすぎている処理がないか調査し、メモリ使用量を削減するといったチューニングを検討した方が良いかもしれません。


以上になります。