GCE上のLinuxにswapを設定

Stackdriverを入れてから、oom-killerで(要はメモリ不足で)リブートが頻発するようになってしまいました。

Syslog上で下記のようなメッセージが毎日でています。

Oct 6 00:12:29 wordpress-1-vm kernel: [233585.430289] systemd invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
Oct 6 00:12:29 wordpress-1-vm kernel: [233585.438280] systemd cpuset=/ mems_allowed=0
Oct 6 00:12:29 wordpress-1-vm kernel: [233585.443040] CPU: 0 PID: 1 Comm: systemd Not tainted 3.16.0-5-amd64 #1 Debian 3.16.51-3+deb8u1
Oct 6 00:12:29 wordpress-1-vm kernel: [233585.451762] Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Oct 6 00:12:29 wordpress-1-vm kernel: [233585.461285] 0000000000000000 ffffffff8151f937 ffff8800243172d0 0000000000000000
Oct 6 00:12:29 wordpress-1-vm kernel: [233585.469363] ffffffff8151d53e 0000000000000000 ffffffff810d9edf 0000000000000000
Oct 6 00:12:29 wordpress-1-vm kernel: [233585.477435] ffffffff8152436e 0000000000000200 ffffffff8106a3c3 ffffffff810c7464
Oct 6 00:12:29 wordpress-1-vm kernel: [233585.485565] Call Trace:
Oct 6 00:12:29 wordpress-1-vm kernel: [233585.488215] [] ? dump_stack+0x5d/0x78
Oct 6 00:12:29 wordpress-1-vm kernel: [233585.493741] [] ? dump_header+0x76/0x1e8

Uptime Checkで頻繁にアクセスがあるのが原因と思い、

前回設定した「Alerting Policy」と「Uptime Check」設定を一旦削除、
「Check every」は「5 minutes(前回は1 minutes)」で再設定したところ、CPU使用量がやや下がりましたが、

Uptime Check 1minの状態

Uptime Check 5minに変更後

メモリは使用量は上に張り付いたままなので、

たしかに実メモリはAlways free上限の0.6GBで少ないけどswapがあるはずだからなあと、
確認したところ、

# free
total used free shared buffers cached
Mem: 608604 559076 49528 35132 4932 75128
-/+ buffers/cache: 479016 129588
Swap: 0 0 0

swapがありませんでした。

AWSとかでもそうらしいのですが、クラウドって基本的に「swapするなら代わりにもっと大きいインスタンスを使え」という考えらしいので、標準ではswapは設定されてないそうです。

でもそうも言ってられないので、swapの設定を入れてみます。
swap用のパーティションはないので、swapfileを作ってそこにswapするようにします。
ddでswapfileの元を作成します。
よく「swapは実メモリの2倍」などと聞きますが、実メモリが0.6GBと少ないので、2GBを指定します。

# dd if=/dev/zero of=/swapfile bs=1M count=2048
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 57.2575 s, 37.5 MB/s

事前の取りわすれてましたが、swapfile作成後もこれくらいディスクに余裕があれば、swapしても問題ないでしょう。

# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 30G 5.9G 23G 21% /
udev 10M 0 10M 0% /dev
tmpfs 119M 13M 107M 11% /run
tmpfs 298M 0 298M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 298M 0 298M 0% /sys/fs/cgroup

swapfileはパーミッションが600以外だと警告が出るらしいので600にします。

# ls -l /swapfile
-rw-r–r– 1 root root 2147483648 Oct 9 06:50 /swapfile
# chmod 600 /swapfile
# ls -l /swapfile
-rw——- 1 root root 2147483648 Oct 9 06:50 /swapfile

mkswapコマンドで、ddで作成したファイルをswapfileとして使えるようにします。

# mkswap /swapfile
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=ebecbe3d-eed0-481c-91a3-68d047af03bb
#

swaponコマンドでswapfileを指定してswapを有効にします。

# swapon /swapfile

swapが有効になりました。

# free
total used free shared buffers cached
Mem: 608604 559676 48928 35132 2412 66292
-/+ buffers/cache: 490972 117632
Swap: 2097148 0 2097148

続いて、再起動した場合も自動でswapfileがマウントされるようにします。

fstabのバックアップをトって、

# cp -ip fstab fstab_20181009
# ls -l fstab*
-rw-r–r– 1 root root 62 Apr 2 2018 fstab
-rw-r–r– 1 root root 62 Apr 2 2018 fstab_20181009

viで開いて下記行を追加します。
「/swapfile swap swap defaults 0 0」

# cat fstab
UUID=c75f01ee-4a1b-45ab-90d0-942e1e36393a / ext4 defaults 1 1
/swapfile swap swap defaults 0 0

rebootして、swapが表示されることをもって、認識されることを確認します。
$ free
total used free shared buffers cached
Mem: 608604 527896 80708 26944 20248 145768
-/+ buffers/cache: 361880 246724
Swap: 2097148 0 2097148

swap設定後はメモリ使用量が上に張り付くことがなくなり、無事解決できました。