Docker for macの user-guided cachingを試す

2017-05-10
Docker
Laravel

docker for macでのmountディレクトリ遅い問題を解消するためのcached設定についての記事が出てた。実際にLaravelの開発でも、mountディレクトリでホスト側のファイルを読み込ませるとページ表示がもっさりするので、待望の設定です。

User-guided caching in Docker for Mac - Docker Blog

上記の記事通りにパフォーマンスが改善されるのか、stableバージョンとedgeバージョンの両方でLaravelのwelcomeページ表示をターゲットにして計測してみた。

現状のstableバージョンで確認

docker for macのバージョン。2017/05/10現在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ docker version
Client:
Version: 17.03.1-ce
API version: 1.27
Go version: go1.7.5
Git commit: c6d412e
Built: Tue Mar 28 00:40:02 2017
OS/Arch: darwin/amd64

Server:
Version: 17.03.1-ce
API version: 1.27 (minimum version 1.12)
Go version: go1.7.5
Git commit: c6d412e
Built: Fri Mar 24 00:00:50 2017
OS/Arch: linux/amd64
Experimental: true

mountディレクトリの有り版、無し版でsiegeでパフォーマンスを計測。

1
$ siege -q -c 1 -r 10 localhost

結果

項目 mount有 mount無
Elapsed time 12s 4s
Response time 0.7s 0.05s
Transaction rate 0.9 trans/s 2.2 trans/s
※数値は数回実行した結果の適当な平均値

ホストのディレクトリをmountすると、Response timeで10倍くらい遅くなる。もっさりするワケだ。

Edgeバージョンで計測。

まずは dockerをuninstall。uninstallは設定からやるのでした。

uninstall
※uninstallのボタンを押して処理が終わったら、ApplicationディレクトリからDockerを削除。ゴミ箱からも消す。

https://docs.docker.com/docker-for-mac/

↑のページにedgeのリンクがあるのでダウンロードしてインストール

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ docker version
Client:
Version: 17.05.0-ce
API version: 1.29
Go version: go1.7.5
Git commit: 89658be
Built: Thu May 4 21:43:09 2017
OS/Arch: darwin/amd64

Server:
Version: 17.05.0-ce
API version: 1.29 (minimum version 1.12)
Go version: go1.7.5
Git commit: 89658be
Built: Thu May 4 21:43:09 2017
OS/Arch: linux/amd64
Experimental: true

User selected cacheは17.04以降に入っているので、17.05なら使える

cached設定は、volumesの設定箇所のディレクトリ名の後ろに追加する

1
2
3
4
5
version: '2'
services:
laravel:
volumes:
- ./laravel:/var/www/laravel:cached

結果

mount有、mount無、cachedの3つを計測

項目 mount有 mount無 cached
Elapsed time 12s 4s 7s
Response time 0.7s 0.05s 0.22s
Transaction rate 0.9 trans/s 2.2 trans/s 1.4 trans/s
※数値は数回実行した結果の適当な平均値

mount無しよりは遅いけど、オプション無しの場合よりは3倍程度速い。
ブラウザのリロードの体感だと、ほぼストレスがないレベル。

docker for macを使って開発する場合は、edgeバージョンを使って、cachedフラグをvolumeにつけると幸せになれそう。Readが速くなるので、gulpとかwebpackでwatchタスクをコンテナ内から実行すると、CPU負荷が猛烈に上がる問題もcachedオプションで緩和されそうです。

補足

ちなみに、この方法では writeスピードは早くならない。

1
2
3
4
5
6
7
8
9
10
11
12
$ docker run --rm -it -v `pwd`:`pwd` -w `pwd` alpine /usr/bin/time /bin/dd if=/dev/zero of=test bs=1k count=100000
100000+0 records in
100000+0 records out
real 0m 25.72s
user 0m 0.18s
sys 0m 1.85s
$ docker run --rm -it -v `pwd`:`pwd`:cached -w `pwd` alpine /usr/bin/time /bin/dd if=/dev/zero of=test bs=1k count=100000
100000+0 records in
100000+0 records out
real 0m 26.16s
user 0m 0.12s
sys 0m 1.95s

writeスピード向けの対応としてdelegateオプションというのが開発中らしい。
待ち遠しい…