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のボタンを押して処理が終わったら、ApplicationディレクトリからDockerを削除。ゴミ箱からも消す。
https://docs.docker.com/docker-for-mac/
↑のページにedgeのリンクがあるのでダウンロードしてインストール
1 | $ docker version |
User selected cacheは17.04以降に入っているので、17.05なら使える
cached設定は、volumesの設定箇所のディレクトリ名の後ろに追加する1
2
3
4
5version: '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 | $ docker run --rm -it -v `pwd`:`pwd` -w `pwd` alpine /usr/bin/time /bin/dd if=/dev/zero of=test bs=1k count=100000 |
writeスピード向けの対応としてdelegate
オプションというのが開発中らしい。
待ち遠しい…