読むのが手間な方への結論
- storage driverがoverlay2の場合、permission変更に時間がかかって死ぬ
前提
こんにちはこんにちは!
Google Compute Engineの無料枠( vCPU 0.2 / 0.6GB / SWAP 2GB / Ubuntu 16.10 )を使って、Mastodonの(ほぼ)お一人鯖を運用しています。
先日、1.4rcが先行リリースされ、1.4rc3あたりが出たときにアップデートをかけようとしました。
アップデート自体はこちらのスクリプトを利用して、特にコマンドに困ることもなく、多少時間がかかりつつも完了したのですが・・・
問題
アップデート完了後、自鯖にアクセスしようとすると出るわ出るわ・・
\def\textlarge#1{%
{\rm\Large #1}
}
$\textlarge{500}$
$\textlarge{502}$
$\textlarge{504}$
sidekiqの画面すら見れず、たまに見れたと思えば再試行が200以上・・・(無料枠では致命傷です。)
でも、再試行が完了すれば安定するかな、と思っていましたが、翌日も翌々日も何度アップデートを行っても不安定なまま。
どうやら内部処理が溜まっているのはわかったんですが、解消法がわからず土日を潰しました。
解決への道
そんな中、助けを求めてGitHubのIssueの読めない英語を追っかけていました。
そして見つけたこのIssue...
Permission update on docker entrypoint takes a long time
(実際のところ、かなり前から読んでいたのですがイマイチ解消法がわからず待っていました)
冒頭にも書いたとおり、原因はどうやらstorage driverというもののようです。
v1.4以降では、docker内のファイル操作について、rootではなく別ユーザーが操作するようになっています。
docker内での操作では全てpermission変更が必要になり、 chown
の処理に時間がかかってしまうのです。
さらに! OSが Ubuntu(14以降) の場合には overlay2 というstorage driver がデフォルトなのですが、こいつが他のものよりも格段に遅いのです。
そのため、いつまでたっても処理が終わらず、不安定になってしまっていました。
解決策
これから1.4.1にアップデートされる方もいるかと思いますが、自鯖がdockerで動いている場合には、まずstorage driver を確認しましょう。
確認方法は下記コマンドです。
$ docker info
すると、下記のように出てくると思います。
$ docker info
Containers: 5
Running: 5
Paused: 0
Stopped: 0
Images: 15
Server Version: 17.03.1-ce
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 46
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
(略)
この Storage Driver
が overlay2
になっている場合には、注意が必要です。(もしかしたら一般的なスペックの場合には問題にならないかもしれません。)
Ubuntu の場合には、下記コマンドを叩いて、aufs
に変更するか、別の storage driver に変更することをおすすめします。
まず、aufs
が利用可能かどうか確認します。
$ cat /proc/filesystems | grep aufs
このとき、 nodev aufs
と出てきたら、下記操作は必要ありません。
もし出てこなかった場合、次のコマンドを叩いて aufs
を有効にします。
$ sudo apt-get update
$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
$ sudo modprobe aufs
$ cat /proc/filesystems | grep aufs
nodev aufs
と出てきたら、/etc/docker/daemon.json
を変更します。
{
"storage-driver": "aufs"
}
そして、dockerを再起動します。
$ service docker restart
確認します。
$ docker info
無事に Storage Driver
が aufs
になっていることを確認できたら、必ず$\textlarge{リブート}$しましょう。
リブート後にMastodonが安定して動作していることが確認できたら、僕は報われます。