そんなこんなで当ブログをApp Service + Azure DatabaseからAzure VMに移行したわけで、まあサービス形態的に言うとSaaSからIaaSに移行したことになるんでしょうか。
ウェブサーバーにしろデータベースにしろ、『サービス』として提供されているものを使っていればよかったものが、『インフラ』(←今回の場合「仮想マシン」)の上に自分でApacheなりMySQLなり構築して管理しないといけないわけですよ。そこの部分の責任を自分で負わなくてはいけない。まあその分安いわけですが^^;
VMに構築したはいいんですが、どうも2~3日するとMySQLがこけている。サービス再起動で直るときもあるしサーバー再起動が必要な時もあるし…てな感じでどうも安定しない。昨日もサービス再起動が失敗。
[root@centos-vm ~]# systemctl resrtart mariadb
Job for mariadb.service failed because the control process exited with error code. See "systemctl status mariadb.service" and "journalctl -xe" for details.
あ、rootでログインすんじゃねえとか、そこは置いといてください。
メッセージの言う通りステータスを確認。
[root@centos-vm ~]# systemctl status mariadb -l
~ 中略 ~
180808 10:00:47 [ERROR] Plugin 'InnoDB' init function returned error.
180808 10:00:47 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
180808 10:00:47 [ERROR] mysqld: Out of memory (Needed 128917504 bytes)
180808 10:00:47 [ERROR] mysqld: Out of memory (Needed 96681984 bytes)
180808 10:00:47 [Note] Plugin 'FEEDBACK' is disabled.
180808 10:00:47 [ERROR] Unknown/unsupported storage engine: InnoDB
180808 10:00:47 [ERROR] Aborting
180808 10:00:47 [Note] /usr/libexec/mysqld: Shutdown complete
180808 10:00:47 mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended
なんかメモリーが足りないって言ってるような。
ちなみにこのVM、最小サイズの『Standard B1s』ですが、1VCPU・1GB RAM・32GB HDD・4GB SSD位のスペック。メモリ1GBは少なめとは言え、「128MB確保できねーよ」なんてエラーになるほど?
メモリーの状況を確認してみます。
[root@centos-vm ~]# free -m
total used free shared buff/cache available
Mem: 912 621 107 46 183 83
Swap: 0 0 0
ん? swapゼロ? 原因はこれ臭いですね。
いろいろ漁るとswapの設定方法は出てくるんですがいくつか鬼門がありまして、まずその1
スワップファイルの作成(というか領域確保)を fallocate ですると CentOS7系で swapon がコケます。例えば2GBの領域を作るとすると、
[root@centos-vm ~]# fallocate -l 2G /swapfile
[root@centos-vm ~]# chmod 600 /swapfile
[root@centos-vm ~]# mkswap /swapfile
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=de32da3a-99ba-401b-a218-69f112207e06
ファイル作って、権限設定して、swapにして、問題ないですね…
[root@centos-vm ~]# swapon /swapfile
swapon: /swapfile: swapon failed: Invalid argument
なぜかここでコケる。どうも /swapfile をゼロ埋めして作ってやらないといけないらしいです。
なので、ディレクトリルートにswapfileというswapファイルを作るなら、
[root@centos-vm ~]# dd if=/dev/zero of=/swapfile bs=1M count=2048
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 164.566 s, 13.0 MB/s
こうしないといけない。でそのあと mkswap でファイル形式をswapにして swapon でスワップファイルとして使用するようにしてやります。いやちょっとまって13.0 MB/sってめちゃ遅くないすか。ルートに /swapfile 作っちゃったけどルートってHDDだよね。Azure VMってサイズごとに帯域制限かかってるから『Standard B1s』のHDDってすごく遅いじゃん?
[root@centos-vm ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 30929148 2706936 28222212 9% /
devtmpfs 456388 0 456388 0% /dev
tmpfs 466964 0 466964 0% /dev/shm
tmpfs 466964 47000 419964 11% /run
tmpfs 466964 0 466964 0% /sys/fs/cgroup
/dev/sda1 508580 63024 445556 13% /boot
/dev/sdb1 4061824 16380 3819400 1% /mnt/resource
tmpfs 93396 0 93396 0% /run/user/0
/dev/sdb1 がSSDだよね?つうわけで作ったファイルは削除してやり直し。
[root@centos-vm ~]# dd if=/dev/zero of=/mnt/resource/swapfile bs=1M count=2048
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 86.7314 s, 24.8 MB/s
SSDでこれかよ^^; な苦笑いレベルではありますがいくらか改善。
[root@centos-vm ~]# mkswap /mnt/resource/swapfile
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=93a85bf0-596a-4fec-8017-5a290b8d0f6e
[root@centos-vm ~]# swapon /mnt/resource/wswapfile
swapon: /mnt/resource/swapfile: insecure permissions 0644, 0600 suggested.
おっと、chmod 600 忘れた。
そしたらこれをfstabに書いて…と、ここでふと思い出す。Azure VMのSSDはマシンの停止時やサイズ変更時に再割り当てされるので、中のファイルは永続しないのですね。ファイルが存在するかどうかわからないものをfstabでマウントするわけにはいかない。すると、ファイルがなかったら上の手順でファイル作ってスワップにして、みたいなスクリプト書かないといけないの~?
てかそもそも /dev/sdb1が /mntの下にマウントされてる時点でどうなのよというか、fstabに書いてないし。
[root@centos-vm ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Sep 25 21:22:22 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=e0c46854-9553-4a67-a3aa-211d8a3987b0 / xfs defaults 0 0
UUID=79132c44-3aa5-405f-ae02-498cba01996a /boot xfs defaults 0 0
調べたところ、この辺のことはAzure Linux エージェントというのが勝手ににやってくれてるらしいです。swapの設定もエージェントのconfigに書いておけばやってくれるんだそうで…
/etc/waagent.confを編集します。
[root@centos-vm ~]# vi /etc/waagent.conf
~ 略 ~
# Create and use swapfile on resource disk.
ResourceDisk.EnableSwap=y
# Size of the swapfile.
ResourceDisk.SwapSizeMB=2048
というわけで長々書いた割に結論はわずか2行というね。もうね。😅
こういう大事な話がTechNetブログに載ってたりするので困ったもんである。
Azure上のLinux VMにSWAPを追加する
ちゃんちゃん。