?
This document uses PHP Chinese website manual Release
Btrfs是下一代的寫時復(fù)制文件系統(tǒng),支持許多先進(jìn)的存儲技術(shù),使其非常適合Docker。Btrfs包含在主線Linux內(nèi)核中。
Docker的btrfs
存儲驅(qū)動程序利用了許多用于映像和容器管理的Btrfs功能。其中包括塊級操作,精簡配置,寫入時復(fù)制快照以及易于管理。您可以輕松地將多個物理塊設(shè)備組合到一個Btrfs文件系統(tǒng)中。
本文將Docker的Btrfs存儲驅(qū)動程序稱為btrfs
Btrfs文件系統(tǒng),并將其作為Btrfs。
注意:
btrfs
存儲驅(qū)動程序僅在Ubuntu或Debian上的Docker CE和SLES上的Docker EE/CS引擎上受支持。
如果您滿足以下先決條件,則支持btrfs
:
Docker CE:對于Docker CE,btrfs
僅在Ubuntu或Debian上推薦。
Docker EE:對于Docker EE和CS-Engine,btrfs
僅在SLES上受支持。有關(guān)商業(yè)支持的Docker的所有支持配置,請參閱產(chǎn)品兼容性表。
更改存儲驅(qū)動程序?qū)⑹鼓褎?chuàng)建的任何容器在本地系統(tǒng)上都不可訪問。使用docker save
保存的容器,并推動現(xiàn)有圖像多克爾集線器或私人倉庫,讓你不必后重新創(chuàng)建它們。
btrfs
需要專用的塊存儲設(shè)備,如物理磁盤。該塊設(shè)備必須格式化為Btrfs并裝入/var/lib/docker/
。以下配置說明會引導(dǎo)您完成此過程。默認(rèn)情況下,SLES /
文件系統(tǒng)使用BTRFS格式化,因此對于SLES,不需要使用單獨的塊設(shè)備,但出于性能方面的考慮,您可以選擇這樣做。
btrfs
支持必須存在于你的內(nèi)核中。要檢查這一點,運行以下命令:$ sudo cat/proc/filesystems | grep btrfs btrfs
要在操作系統(tǒng)級別管理BTRFS文件系統(tǒng),您需要該btrfs
命令。如果您沒有此命令,請安裝btrfsprogs
軟件包(SLES)或btrfs-tools
軟件包(Ubuntu)。
此過程在SLES和Ubuntu上基本相同。
停止Docker。
2. 將/var/lib/docker/
內(nèi)容復(fù)制到備份位置,然后清空以下內(nèi)容/var/lib/docker/
:
$sudo cp-au/var/lib/docker/var/lib/docker.bk$sudo rm/var/lib/docker/%2A
3. 將您的專用塊設(shè)備或設(shè)備格式化為Btrfs文件系統(tǒng)。這個例子假定你正在使用兩個叫做/dev/xvdf
and的塊設(shè)備/dev/xvdg
。仔細(xì)檢查塊設(shè)備名稱,因為這是一種破壞性操作。$ sudo mkfs.btrfs -f /dev/xvdf /dev/xvdg Btrfs還有很多選項,包括striping和RAID。請參閱Btrfs文檔。
4. 將新的Btrfs文件系統(tǒng)/var/lib/docker/
掛載到掛載點上。您可以指定用于創(chuàng)建Btrfs文件系統(tǒng)的任何塊設(shè)備。
$ sudo mount -t btrfs /dev/xvdf /var/lib/docker
不要忘記在重新啟動時通過添加/etc/fstab
條目來使永久更改。
5. 將內(nèi)容復(fù)制/var/lib/docker.bk
到/var/lib/docker/
。$ sudo cp -au /var/lib/docker.bk/* / var / lib / docker /
6. 配置Docker以使用btrfs
存儲驅(qū)動程序。即使/var/lib/docker/
現(xiàn)在使用Btrfs文件系統(tǒng),這也是必需的。編輯或創(chuàng)建文件/etc/docker/daemon.json
。如果它是新文件,請?zhí)砑右韵聝?nèi)容。如果它是現(xiàn)有文件,則僅添加鍵和值,如果它不是結(jié)束括號(}
)前的最后一行,請仔細(xì)用逗號結(jié)束該行。
{ "storage-driver": "btrfs" }
查看每個存儲驅(qū)動程序的所有存儲選項:
- [Stable](../../../reference/commandline/dockerd/index#storage-driver-options)- [Edge](https://docs.docker.com/edge/engine/reference/commandline/dockerd/#storage-driver-options)
啟動Docker。運行后,驗證btrfs
是否正在用作存儲驅(qū)動程序。$ docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 17.03.1-ce 存儲驅(qū)動程序:btrfs 生成版本:Btrfs v4.4 庫文件版本:101 <output truncated>
2. 準(zhǔn)備好后,請刪除/var/lib/docker.bk
目錄。
Btrfs的好處之一是可以輕松地管理Btrfs文件系統(tǒng),而無需卸載文件系統(tǒng)或重新啟動Docker。
當(dāng)空間不足時,Btrfs會自動擴(kuò)展容量大約1 GB的數(shù)據(jù)塊。
要將塊設(shè)備添加到Btrfs卷,請使用btrfs device add
和btrfs filesystem balance
命令。
$ sudo btrfs device add /dev/svdh /var/lib/docker $ sudo btrfs filesystem balance /var/lib/docker
注意:雖然可以在Docker運行時執(zhí)行這些操作,但性能會受到影響。計劃停機(jī)窗口以平衡Btrfs文件系統(tǒng)可能是最好的。
btrfs
存儲驅(qū)動程序作品btrfs
存儲驅(qū)動器從工作方式不同devicemapper
在您的整個或其他存儲驅(qū)動程序/var/lib/docker/
目錄存儲在增加了Btrfs卷上。
有關(guān)圖像圖層和可寫容器圖層的信息存儲在/var/lib/docker/btrfs/subvolumes/
。該子目錄包含每個圖像或容器層的一個目錄,統(tǒng)一文件系統(tǒng)是從一個圖層加上所有其父圖層構(gòu)建的。子卷本質(zhì)上是寫入時復(fù)制,并具有從底層存儲池按需分配的空間。它們也可以嵌套和快照。下圖顯示了4個子卷。'Subvolume 2'和'Subvolume 3'是嵌套的,而'Subvolume 4'則顯示它自己的內(nèi)部目錄樹。
只有圖像的基礎(chǔ)層被存儲為真正的子卷。所有其他圖層都存儲為快照,只包含該圖層中引入的差異。您可以創(chuàng)建快照快照,如下圖所示。
在磁盤上,快照的外觀與子卷相似,但實際上它們更小巧,更節(jié)省空間。寫時復(fù)制用于最大限度地提高存儲效率并最小化層大小,并且容器的可寫層中的寫入在塊級進(jìn)行管理。下圖顯示了一個子卷及其快照共享數(shù)據(jù)。
為了獲得最大效率,當(dāng)容器需要更多空間時,它將以大小約1 GB的塊分配。
Docker的btrfs
存儲驅(qū)動程序?qū)⒚總€圖像層和容器存儲在其自己的Btrfs子卷或快照中。圖像的基礎(chǔ)層存儲為子卷,而子圖像層和容器存儲為快照。這在下圖中顯示。
在運行btrfs
驅(qū)動程序的Docker主機(jī)上創(chuàng)建映像和容器的高級過程如下所示:
圖像的基礎(chǔ)層存儲在Btrfs 子卷下/var/lib/docker/btrfs/subvolumes
。
2. 隨后的圖像層被存儲為增加了Btrfs 快照父層的子體積或快照的,但與此層中引入的變化。這些差異存儲在塊級別。
3. 容器的可寫圖層是最終圖像層的Btrfs快照,運行容器引入了差異。這些差異存儲在塊級別。容器如何讀取和寫入btrfs
閱讀文件的工作容器是圖像的空間高效快照??煺罩械脑獢?shù)據(jù)指向存儲池中的實際數(shù)據(jù)塊。這與子卷相同。因此,針對快照執(zhí)行的讀取基本上與針對子卷執(zhí)行的讀取相同。
編寫新文件:將新文件寫入容器會調(diào)用按需分配操作以將新數(shù)據(jù)塊分配給容器的快照。該文件然后被寫入這個新的空間。按需分配操作對于使用Btrfs進(jìn)行的所有寫入都是原生的,并且與將新數(shù)據(jù)寫入子卷相同。因此,將新文件寫入容器的快照以本地Btrfs速度運行。
修改現(xiàn)有文件:更新容器中的現(xiàn)有文件是寫時復(fù)制操作(redirect-on-write是Btrfs術(shù)語)。原始數(shù)據(jù)是從文件當(dāng)前存在的層讀取的,只有修改后的塊才寫入容器的可寫層。接下來,Btrfs驅(qū)動程序更新快照中的文件系統(tǒng)元數(shù)據(jù)以指向這個新數(shù)據(jù)。這種行為的開銷很小。
刪除文件或目錄:如果容器刪除存在于較低層的文件或目錄,則Btrfs會掩蓋較低層中文件或目錄的存在。如果一個容器創(chuàng)建一個文件然后將其刪除,則此操作在Btrfs文件系統(tǒng)中執(zhí)行,并且空間被回收。
使用Btrfs時,編寫和更新大量小文件可能會導(dǎo)致性能下降。
影響Docker在btrfs
存儲驅(qū)動程序下的性能有幾個因素。
注意:通過將Docker卷用于寫入繁重的工作負(fù)載,而不是依賴將數(shù)據(jù)存儲在容器的可寫層中,可以緩解這些因素中的許多因素。然而,在增加了Btrfs的情況下,多克爾量仍將從這些畫中后衛(wèi)吃虧,除非
/var/lib/docker/volumes/
是不通過增加了Btrfs支持。
頁面緩存。Btrfs不支持頁面緩存共享。這意味著訪問相同文件的每個進(jìn)程都將文件復(fù)制到Docker主機(jī)的內(nèi)存中。因此,btrfs
驅(qū)動程序可能不是PaaS等高密度用例的最佳選擇。
小寫。執(zhí)行大量小寫操作的容器(此使用模式與在短時間內(nèi)啟動和停止很多容器時發(fā)生的情況相匹配)可能導(dǎo)致Btrfs塊的使用不當(dāng)。這可能會過早地填充Btrfs文件系統(tǒng)并導(dǎo)致Docker主機(jī)出現(xiàn)空間不足的情況。使用btrfs filesys show
您必須密切監(jiān)控增加了Btrfs設(shè)備上的可用空間量。
順序?qū)懭?/strong>。寫入磁盤時,Btrfs使用日志記錄技術(shù)。這會影響順序?qū)懭氲男阅?,最多可將性能降?0%。
碎片化。碎片是Btrfs等寫入時復(fù)制文件系統(tǒng)的自然副產(chǎn)品。許多小型隨機(jī)寫入可能會增加此問題。碎片化可能表現(xiàn)為使用SSD時的CPU峰值或使用旋轉(zhuǎn)磁盤時的磁頭顛簸。這些問題都會損害性能。
如果您的Linux內(nèi)核版本為3.9或更高版本,則可以autodefrag
在安裝Btrfs卷時啟用該功能。在將其部署到生產(chǎn)環(huán)境之前,請先在自己的工作負(fù)載上測試此功能,因為有些測試顯示對性能有負(fù)面影響。
SSD性能:Btrfs包含SSD介質(zhì)的本機(jī)優(yōu)化。要啟用這些功能,請使用-o ssd
安裝選項安裝Btrfs文件系統(tǒng)。這些優(yōu)化包括通過避免優(yōu)化(例如不適用于固態(tài)介質(zhì)的搜索優(yōu)化)來增強(qiáng)SSD寫入性能。
平衡Btrfs文件系統(tǒng)經(jīng)常:使用操作系統(tǒng)實用程序(如cron
作業(yè))在非高峰時段定期平衡Btrfs文件系統(tǒng)。這回收未分配的塊,并有助于防止文件系統(tǒng)不必要的填滿。除非將其他物理塊設(shè)備添加到文件系統(tǒng),否則無法重新平衡完全完整的Btrfs文件系統(tǒng)。查看BTRFS Wiki。
使用快速存儲:固態(tài)硬盤(SSD)比旋轉(zhuǎn)磁盤提供更快的讀取和寫入速度。
將卷用于寫入繁重的工作負(fù)載:卷為寫入繁重的工作負(fù)載提供最佳和最可預(yù)測的性能。這是因為它們繞過了存儲驅(qū)動程序,并且不會產(chǎn)生精簡配置和寫入時復(fù)制引入的任何潛在開銷。卷還有其他好處,例如允許您在容器之間共享數(shù)據(jù),并且即使在沒有正在運行的容器正在使用它們時也會持久存在。
了解圖像,容器和存儲驅(qū)動程序
選擇存儲驅(qū)動程序
AUFS存儲驅(qū)動程序在實踐中
設(shè)備Mapper存儲驅(qū)動程序在實踐中的應(yīng)用