使用 docker-sync 調整 Docker for Mac 磁碟效能
Docker for Mac 的釋出確實給在 MacOS 上開發提供了很大的遍歷,但是畢竟不是原生的底層容器實現,Docker for Mac 是執行在 Hypervisor 上的 一個 HyperKit 實現,畢竟還是虛擬化加容器的實現方式,而不是核心級別的實現,所以功能肯定是受限制的,比如網路訪問上不能與容器實現子網路的 全棧訪問 ,功能上的問題可以忍,但效能的問題卻是致命的,例如在編譯大一點的專案時編譯速度比在Linux容器下慢得讓人無法接受。
1.Docker for Mac 磁碟效能測試
分析了一下,原來是磁碟效能導致的,於是做了一組測試:分別在 Linux 和 MacOS 下使用容器對磁碟寫入資料,每個平臺分別使用非掛載(non-mount)和掛載(mount)的方式測試。
非掛載方式的測試命令為:
docker run --rm -it alpine \
time dd if=/dev/zero of=test.dat bs=1024 count=100000
掛載方式的測試命令為:
docker run --rm -it -v `pwd`:`pwd` -w `pwd` alpine \
time dd if=/dev/zero of=test.dat bs=1024 count=100000
Linux 測試結果:
MacOS 測試結果:
通過結果可以看出 Docker for Mac 在掛載本地磁碟的情況下,速度比非掛載情況下慢了整整100倍!而在 Linux 平臺下卻沒有任何效能損失。
這個問題在 Docker 的論壇裡被炒得很火,社群的不滿情緒也很高脹,具體的原因可以參考這個連結:
大體的意思就是:osxfs 檔案系統效率太低,mac 和 container 的檔案系統不一樣,同步時需要做大量的格式轉換。
2.Docker for Mac 磁碟效能調整
本來想通過虛擬機器來解決這個問題,但是覺得太麻煩,於是發現了 docker-sync 方案,通過 unison 或者同類型的同步工具對docker 掛載磁碟進行同步。
docker-sync 的基本原理就是使用 daemon方式建立一個同步磁碟,然後在 docker 啟動容器是掛載這個同步磁碟,下圖是 native_osx 同步流程,可以解釋 docker-sync 的基本原理。
圖片選自 https://github.com/EugenMayer/docker-sync/wiki/8.-Strategies
下面實踐一下 docker-sync 的安裝,並且做一個基準測試,看看效能提升了多少。
安裝比較簡單,可以參考 docker-sync 的 Wiki:
brew install unison
brew install eugenmayer/dockersync/unox
安裝成功後,建立一個 docker-sync 的配置檔案 docker-sync.yml ,內容可以參考 Wiki
version: '2'
syncs:
mac_sync:
sync_strategy: 'unison'
src: './app'
然後啟動 docker-sync 服務
docker-sync start
服務啟動成功後使用下面命令完成一次基準測試:
docker run --rm -it -v mac_sync:/test -w /test alpine \
time dd if=/dev/zero of=test.dat bs=1024 count=100000
可以看出,速度與非掛載模式相差並不是太多了,但是同步的時間並沒有測試,畢竟還是兩種檔案系統的同步,如果從資料安全的角度考慮,使用 Linux 下的 Docker 才是正確的開啟方式。