Azure Linux VMのswap設定


そんなこんなで当ブログを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を追加する

ちゃんちゃん。