1. 程式人生 > >使用 docker-sync 調整 Docker for Mac 磁碟效能

使用 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 測試結果:
docker-test-linux
MacOS 測試結果:
docker-test-mac

通過結果可以看出 Docker for Mac 在掛載本地磁碟的情況下,速度比非掛載情況下慢了整整100倍!而在 Linux 平臺下卻沒有任何效能損失。
這個問題在 Docker 的論壇裡被炒得很火,社群的不滿情緒也很高脹,具體的原因可以參考這個連結:

https://forums.docker.com/t/file-access-in-mounted-volumes-extremely-slow-cpu-bound/8076/158
大體的意思就是:osxfs 檔案系統效率太低,mac 和 container 的檔案系統不一樣,同步時需要做大量的格式轉換。

2.Docker for Mac 磁碟效能調整

  本來想通過虛擬機器來解決這個問題,但是覺得太麻煩,於是發現了 docker-sync 方案,通過 unison 或者同類型的同步工具對docker 掛載磁碟進行同步。

docker-sync 的基本原理就是使用 daemon方式建立一個同步磁碟,然後在 docker 啟動容器是掛載這個同步磁碟,下圖是 native_osx 同步流程,可以解釋 docker-sync 的基本原理。
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 才是正確的開啟方式。

參考文件: