no image

GCPのVMインスタンスにSWAP領域を設定する。

1. はじめに

はしへいです。GCPでVMインスタンス(f1-micro)を新たに作成、Linux(CentOS)イメージで起動。MySQLのインストールを始めたところ、SWAP領域を設定していないが為にMySQLが起動できない事象に遭遇しました。原因はVMインスタンスに割り当てられているメモリ量では既に動いているデーモンプロセスに加えMySQLを起動するには不十分なメモリ量しか搭載されていませんでした。

MySQLをyumからインストールし起動したところ、起動できずに以下のシステムログが記録されました。

 $ tail /var/log/messages
Oct 14 19:08:55 vm-003 kernel: Out of memory: Kill process 8341 (mysqld) score 275 or sacrifice child
Oct 14 19:08:55 vm-003 kernel: Killed process 8341 (mysqld) total-vm:1304540kB, anon-rss:9628kB, file-rss:0kB, shmem-rss:0kB
Oct 14 19:08:55 vm-003 mysqld: /usr/bin/mysqld_safe: line 183:  8341 Killed                  nohup /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock < /dev/null > /dev/null 2>&1
Oct 14 19:08:58 vm-003 systemd: Removed slice User Slice of root.
Oct 14 19:08:58 vm-003 systemd: Stopping User Slice of root.

MySQLを起動するのに必要なメモリが足りず、SWAP領域も設定されていなかった為、起動に失敗していました。

2. SWAP領域の追加

2-1. SWAP領域用ファイルの作成

そこで以下の手順でSWAP領域を設定します。SWAP領域のサイズはメインメモリのサイズ*1〜2倍のサイズが推奨されています。今回はメインメモリサイズが500MB程度ですので、1GBにしました。

1GB(1M * 1024)のswapファイルを/swapfileとして作成します。

$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024

swapファイルのパーティションを所有者であるrootからのアクセスに限定します。

$ sudo chmod 600 /swapfile

2-2. SWAPファイルの設定

/swapfileをSWAP領域に設定します。

$ sudo mkswap /swapfile

/swapfile をSWAP領域として有効化します。

$ sudo swapon /swapfile

SWAP領域が設定された事を確認します。SWAPの行のtotal列に0以外が設定されていればSwap領域が問題なく設定できています。

$ free
              total        used        free      shared  buff/cache   available
Mem:         601832      470724       48064        1804       83044       34136
Swap:       1048572      0      1048572

このままでは、サーバを再起動する度にSWAP領域の有効化を手動でする必要がありますので、自動でマウントする設定を実施します。
具体的には”/etc/fstab”に以下の設定を追加します。

 /swapfile  swap   swap    defaults   0 0

改めてMySQLを起動します。”Active”がactive(running)になっており、問題なく起動できた事が確認できました。

$ sudo systemctl start mysqld.service
$ sudo systemctl status mysqld.service
● mysqld.service - SYSV: MySQL database server.
   Loaded: loaded (/etc/rc.d/init.d/mysqld; bad; vendor preset: disabled)
   Active: active (running) since Sun 2018-10-28 14:29:30 UTC; 11s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1431 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=0/SUCCESS)

最後にSwap領域が利用されているか確認したところ、予想通りSwap領域が利用されている事が確認できました。

$ free
              total        used        free      shared  buff/cache   available
Mem:         601832      470724       48064        1804       83044       34136
Swap:       1048572      518912      529660

過去にMySQLをインストールしたことはあったのですが、その際はOSイメージから手動でインストールしていた為、インストーラの中でSWAP領域を設定していました。 初期準備のミスではありましたが、SWAP領域の動作を確認できる良い機会になりました。