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領域の動作を確認できる良い機会になりました。