【AWS】EC2インスタンスでswapサイズを増やす手順

# EC2インスタンスでswapサイズを増やす手順
PostgreSQLを使って処理を回していたらあるときからOOMキラーが発動するようになった。
単純にはインスタンスタイプを上げてメモリを増やせば解決するけど、それだと費用は倍になるし、オーバースペックになる。
ふと思ってswapサイズを見てみたら「0.8GBしかないじゃん！？」となったのでswapサイズを増やすことにした。
なお、今回はパーティションを増やしたくないため拡張で対応しているが、新しくパーティションを切る方法もある。

## 事前準備
下記の図のようにswapサイズをデフォルトの0.8GBから30GB拡張する。
![swap拡張.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403042/17ea39b2-9bb6-93c9-3e03-bef8cc9fa4d7.png)
ルートボリュームを30GB拡張、ファイルシステム拡張、LVM拡張、swap拡張、というように下から順にやれば良い。
初期状態のルートボリューム30GBではこのような状態になっている。

```shell
[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に増える。

```shell
[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コマンドを使用する。

```shell
# 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を拡張する。

```shell
# 拡張前
[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サイズを拡張する。

```shell
# 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したときに値が変わっているのである。

```shell
[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
```

以上。