立刻停止使用AUFS,開啟Overlay!

jopen 9年前發布 | 15K 次閱讀 AUFS


在大多數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>的頭部信息是以下這樣:

立刻停止使用AUFS,開啟Overlay!

顯示超過70%的CPU時間都花在內核上了?那樣非常奇怪,我們深入研究一下。

接下來我想到的是使用<code>perf</code>來分析CPU的負載細節。<code>perf top</code>結果顯示說大量的時間花費在自旋鎖上:

立刻停止使用AUFS,開啟Overlay!

<code>perf top -g</code>給出了更多信息:那些時間是花費在了系統調用上,<code>open()</code> 和<code>stat()</code>是罪魁禍首,我們還能看到一系列的系統方法在自旋鎖的調用鏈上。

立刻停止使用AUFS,開啟Overlay!

為什么<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上構建鏡像緩慢了許多,但是一旦構建完成,開始編譯之后,一切都有飛躍般的加速:

立刻停止使用AUFS,開啟Overlay!

這些編譯任務的過程從蝸牛那樣慢變得像火箭那樣快~完勝!

結論:

  • 如果你用Docker來執行那些會產生大量的<code>open()</code>和<code>stat()</code>這種系統調用
  • 如果你想要你的機器能真正的工作,而不是在自旋鎖里轉不出來
  • 如果你想要用上更跟得上潮流的能被支持得更好的組件
  • 如果你想用上比btrfs或者device mapper這些更省事的文件系統

那么現在就拋棄AUFS,切換到Overlay吧。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!