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 | $ docker version |
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 | version: '2' |
結果
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
オプションというのが開発中らしい。
待ち遠しい…