EC2インスタンスでswapサイズを増やす手順
PostgreSQLを使って処理を回していたらあるときからOOMキラーが発動するようになった。
単純にはインスタンスタイプを上げてメモリを増やせば解決するけど、それだと費用は倍になるし、オーバースペックになる。
ふと思ってswapサイズを見てみたら「0.8GBしかないじゃん!?」となったのでswapサイズを増やすことにした。
なお、今回はパーティションを増やしたくないため拡張で対応しているが、新しくパーティションを切る方法もある。
事前準備
下記の図のようにswapサイズをデフォルトの0.8GBから30GB拡張する。
ルートボリュームを30GB拡張、ファイルシステム拡張、LVM拡張、swap拡張、というように下から順にやれば良い。
初期状態のルートボリューム30GBではこのような状態になっている。
[root@apple ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 30G 0 disk
├xvda1 202:1 0 500M 0 part /boot
├xvda2 202:2 0 7.5G 0 part
│├VolGroup-lv_root (dm-0) 253:0 0 26.7G 0 lvm /
│└VolGroup-lv_swap (dm-1) 253:1 0 816M 0 lvm [SWAP]
└xvda3 202:3 0 22G 0 part
└VolGroup-lv_root (dm-0) 253:0 0 26.7G 0 lvm /
AWSコンソールからルートボリュームのサイズを30GBから60GBに増やすと /dev/xvda が60GBに増える。
[root@apple ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 60G 0 disk
├xvda1 202:1 0 500M 0 part /boot
├xvda2 202:2 0 7.5G 0 part
│├VolGroup-lv_root (dm-0) 253:0 0 26.7G 0 lvm /
│└VolGroup-lv_swap (dm-1) 253:1 0 816M 0 lvm [SWAP]
└xvda3 202:3 0 22G 0 part
└VolGroup-lv_root (dm-0) 253:0 0 26.7G 0 lvm /
パーティション、ファイルシステムを拡張する
/dev/xvda が30GB増えたので、パーティション /dev/xvda3 を30GB増やしたい。
パーティション拡張にはgrowpartコマンドを使用する。
# growpartインストール
[root@apple ~]# yum install growpart
# epelにあるが、ファイルがNot Foundとか言われたらパスが変わっているかもしれない
# そういうときはパスを確認してwgetで取ってくれば良い
[root@apple ~]# wget ~~~/cloud-utils-growpart-0.27-10.el6.x86_64.rpm
[root@apple ~]# rpm -ivh cloud-utils-growpart-0.27-10.el6.x86_64.rpm
# ロケールが "en_US.UTF-8" じゃないと失敗するのでロケール変更
[root@apple ~]# export LC_ALL="en_US.UTF-8"
# growpart実行
# パーティション番号はスペースを空ける
[root@apple ~]# growpart /dev/xvda 3
CHANGED: partition=3 start=16777216 old: size=46133324 end=62910540 new: size=109043864,end=125821080
# オンラインでのresize2fsはできないので再起動する
# 起動時に自動的にresize2fsしてくれる
[root@apple ~]# reboot
# パーティション拡張を確認
[root@apple ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 60G 0 disk
├xvda1 202:1 0 500M 0 part /boot
├xvda2 202:2 0 7.5G 0 part
│├VolGroup-lv_root (dm-0) 253:0 0 26.7G 0 lvm /
│└VolGroup-lv_swap (dm-1) 253:1 0 816M 0 lvm [SWAP]
└xvda3 202:3 0 52G 0 part
└VolGroup-lv_root (dm-0) 253:0 0 26.7G 0 lvm /
/dev/xvda3 が22GBから52GBに増えているのでヨシ!
LVMを拡張する
パーティションのサイズが増えたのでまずPV、VGを拡張する。
# 拡張前
[root@apple ~]# pvdisplay /dev/xvda3
--- Physical volume ---
PV Name /dev/xvda3
VG Name VolGroup
PV Size 22.00 GiB / not usable 2.04 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 5631
Free PE 511
Allocated PE 5120
PV UUID XAzVVN-F4vG-XWcq-Ay61-4v2A-Hynk-hcmKja
# PV拡張
[root@apple ~]# pvresize /dev/xvda3
Physical volume "/dev/xvda3" changed
1 physical volume(s) resized / 0 physical volume(s) not resized
# 拡張後
[root@apple ~]# pvdisplay /dev/xvda3
--- Physical volume ---
PV Name /dev/xvda3
VG Name VolGroup
PV Size 52.00 GiB / not usable 3.07 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 13310
Free PE 8190
Allocated PE 5120
PV UUID XAzVVN-F4vG-XWcq-Ay61-4v2A-Hynk-hcmKja
# VG確認
[root@apple ~]# vgdisplay
--- Volume group ---
VG Name VolGroup
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 59.50 GiB
PE Size 4.00 MiB
Total PE 15232
Alloc PE / Size 7042 / 27.51 GiB
Free PE / Size 8190 / 31.99 GiB
VG UUID KKH8X5-ZgIG-drSY-yYeX-znc7-APSq-kCVFJm
PV Size、Free PEともに30GB増えている。
またVGはPVの拡張にともなって自動的にVG Size、Free PEが増えている。
swapサイズを拡張する
最後にswapが乗っているLV、およびswapサイズを拡張する。
# LV確認
[root@apple ~]# lvdisplay
--- Logical volume ---
LV Path /dev/VolGroup/lv_root
LV Name lv_root
VG Name VolGroup
LV UUID xL8jFY-tYoP-Akp8-wiLV-PbUm-5YdW-jc7kTQ
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2014-08-20 14:05:30 +0900
LV Status available
# open 1
LV Size 26.71 GiB
Current LE 6838
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
--- Logical volume ---
LV Path /dev/VolGroup/lv_swap
LV Name lv_swap
VG Name VolGroup
LV UUID 0hYwIt-mA9J-Mfhw-x9fc-jmRd-520Q-OMLhQ0
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2014-08-20 14:05:32 +0900
LV Status available
# open 1
LV Size 816.00 MiB
Current LE 204
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
# swapサイズ確認(現在0.8GB)
[root@apple ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 835580 0 -1
# いったんswapを無効化
[root@apple ~]# swapoff /dev/VolGroup/lv_swap
# LV拡張
[root@apple ~]# lvextend -L+30G /dev/VolGroup/lv_swap
Extending logical volume lv_swap to 30.80 GiB
Logical volume lv_swap successfully resized
# swapの再作成、再有効化
[root@apple ~]# mkswap /dev/VolGroup/lv_swap
mkswap: /dev/VolGroup/lv_swap: warning: dont erase bootbits sectors
on whole disk. Use -f to force.
スワップ空間バージョン1を設定します、サイズ = 32292860 KiB
ラベルはありません, UUID=81ef3a01-380d-4305-bf2f-bdb7bdac39bf
[root@apple ~]# swapon /dev/VolGroup/lv_swap
# swapサイズ再確認(30GB増えている)
[root@apple ~]# swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 32292860 0 -1
swapサイズは無事拡張されたが、このあと /etc/fstab を修正する必要がある。
/etc/fstab には /、/boot、swap がそれぞれUUIDで記載されているが、mkswapしたときに値が変わっているのである。
[root@apple ~]# vi /etc/fstab
UUID=d748f0cb-bf25-402c-9a58-3f6dd4a3b5d7 / ext4 defaults 1 1
UUID=833e1f14-6c25-4430-8776-d4ad024ee760 /boot ext4 defaults 1 2
UUID=9c8c7b9c-a4d6-4217-a498-5816b5e7e00b swap swap defaults 0 0
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
# UUIDをパーティションに直すと下記のようになる
/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
/dev/xvda1 /boot ext4 defaults 1 2
/dev/VolGroup/lv_swap swap swap defaults 0 0
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
以上。