立刻停止使用AUFS,開啟Overlay!
在大多數Ubuntu系統上,Docker的默認文件系統是AUFS.
別用它,用Overlay吧,下來我告訴你為什么。
首先,補充一下背景,我在POWER服務器上測試基礎的LAMP環境的性能(LAMP代表Linux+Apache+MySQL/MariaDB+PHP)。為了能做更可靠和重復性的測試,我在Docker容器里構建了這個環境。
每次測試會下載Apache , MariaDB和PHP的源碼并且編譯。這個過程應該很快,我使用的POWER 8服務器有160個硬線程以及128GB內存,但是我發現構建的速度和一個BlueMix云上的2核Intel虛擬機一樣。
為什么?我第一件事就是在<code>top</code>下觀察編譯的過程。<code>top</code>的頭部信息是以下這樣:
顯示超過70%的CPU時間都花在內核上了?那樣非常奇怪,我們深入研究一下。
接下來我想到的是使用<code>perf</code>來分析CPU的負載細節。<code>perf top</code>結果顯示說大量的時間花費在自旋鎖上:
<code>perf top -g</code>給出了更多信息:那些時間是花費在了系統調用上,<code>open()</code> 和<code>stat()</code>是罪魁禍首,我們還能看到一系列的系統方法在自旋鎖的調用鏈上。
為什么<code>open</code>和<code>stat</code>調用慢?我知 道那些文件被掛載到AUFS上(如果你不確定,用<code>docker info</code>命令能看到)。那么,作為一個內核黑客,我決定繼續尋根問底了,這個過程并不順利。AUFS已經過時了,它是一組獨立 的補丁包,很多Linux發行版多年來都嘗試去廢棄它,實際上,紅帽企業版并沒有內置安裝它(多虧了紅帽,Docker似乎也有不再支持它的跡象)
想要遠離這個惡夢的一個方法是使用其他的補丁包,我查看了一下Docker支持的其他文件系統,找到這個[PPT](out-of-tree patchset)非常好。我的選項非常簡單:AUFS,btrfs,device-mapper或者Overlay。Overlay是一個不二的選擇, 它不需要我在云端的虛擬機上安裝device mapper,或者像btrfs那樣需要重新格式化。
它在Ubuntu上安裝也很簡單:
- 把你需要的docker容器用export或save命令備份到文件
- 在<code>/etc/default/docker</code>文件里 的<code>DOCKER_OPTS</code>選項中添加<code> --storage-driver=overlay</code>,然后重啟docker(使用<code>service docker restart</code>)
- 是用import或load命令把之前導出的容器重新導入。
- 驗證一下一切是否正常,然后就可以把舊的儲存路徑刪除掉了(<code>/var/lib/docker/aufs</code>)
我轉移了我的容器后,我開始了另一次編譯。
我首先注意到的是在Overlay上構建鏡像緩慢了許多,但是一旦構建完成,開始編譯之后,一切都有飛躍般的加速:
這些編譯任務的過程從蝸牛那樣慢變得像火箭那樣快~完勝!
結論:
- 如果你用Docker來執行那些會產生大量的<code>open()</code>和<code>stat()</code>這種系統調用
- 如果你想要你的機器能真正的工作,而不是在自旋鎖里轉不出來
- 如果你想要用上更跟得上潮流的能被支持得更好的組件
- 如果你想用上比btrfs或者device mapper這些更省事的文件系統
那么現在就拋棄AUFS,切換到Overlay吧。