Posted at
WHITEPLUSDay 20

Docker for Macのファイル共有が遅いので計測してみる

More than 1 year has passed since last update.

この記事はWHITEPLUS Advent Calendar 2016 20日目になります。

開発環境整備担当 kai-zoa です。

多くの現場でそうだったように、リネットの開発環境も今年からDocker ToolboxからDocker for Macに移行したのですが、macOSだととにかくマウントしたボリュームのファイルアクセスが遅くて毎日不満です。

このあたり、共有ファイルシステムのマウントじゃなくてファイルを即時同期したり、もういっそLinux使うなどして一部やり過ごしてるようですね。

Qiita - docker-syncでホスト-コンテナ間を爆速で同期する

いまはDockerのosxfsが改良されますようにと願うばかりですが、一応Docker for Macのアップデートの度に改善を見守りたいので、見守り用に簡単にGoでベンチマークするコードを書いてみました。


ソース

簡単に165KBのgopher画像を読み取りだけします。

package main

import (
"os"
"testing"
)

func _read(path string, bufSize int) error {
f, err := os.Open(path)
if err != nil {
return err
}
defer f.Close()

buf := make([]byte, bufSize)
for {
n, err := f.Read(buf)
if n == 0 {
break
}
if err != nil {
return err
}
}
return nil
}

func BenchmarkReadContainerFile_Buf128(b *testing.B) {
for i := 0; i < b.N; i++ {
err := _read("/tmp/gophercolor.png", 128)
if err != nil {
panic(err)
}
}
}

func BenchmarkReadContainerFile_Buf1024(b *testing.B) {
for i := 0; i < b.N; i++ {
err := _read("/tmp/gophercolor.png", 1024)
if err != nil {
panic(err)
}
}
}

func BenchmarkReadVolumeFile_Buf128(b *testing.B) {
for i := 0; i < b.N; i++ {
err := _read("./gophercolor.png", 128)
if err != nil {
panic(err)
}
}
}

func BenchmarkReadVolumeFile_Buf1024(b *testing.B) {
for i := 0; i < b.N; i++ {
err := _read("./gophercolor.png", 1024)
if err != nil {
panic(err)
}
}
}

https://github.com/WHITEPLUS/advent-calendar2016-docker-volume-bench


結果

./bench.sh

testing: warning: no tests to run
BenchmarkReadContainerFile_Buf128-4 2000 567241 ns/op
BenchmarkReadContainerFile_Buf1024-4 20000 76948 ns/op
BenchmarkReadVolumeFile_Buf128-4 500 2959713 ns/op
BenchmarkReadVolumeFile_Buf1024-4 500 2683988 ns/op
PASS
ok bench-fio 6.927s

extremely slow!!

これからも見守っていきますが、そろそろ暫定的になにかしていかないとなぁ


明日

knakamigawaのフロントエンドの話ですっ


ホワイトプラスではエンジニアを募集しています

ホワイトプラスでは、新しい技術にどんどん挑戦したい!という技術で事業に貢献したいエンジニアを募集しております。!