本文探討Docker多主機網絡的性能。
在過去的博文里,我測試過 Docker的網絡 。 MySQL服務器團隊 提供了他們自己的結果,和我的觀察是一致的。
本文里一系列的測試,想更多關注使用多主機的Docker網絡。因為當我們搭建高可用(HA)環境(比如,使用Percona XtraDB Cluster)時,就會期望實例運行在不同的主機上。
本文測試的另一個原因是Docker最近發布了1.12版本,支持Swarm Mode。Swarm Mode本身很有意思——在這個版本里,Docker決定在編排部署領域更深入,從而和Kubernetes以及Apache Mesos競爭。我認為Swarm Mode還很粗糙(畢竟是第一個版本),但是我確信Docker會在接下來的幾個版本里繼續優化這個特性。
Swarm Mode還假定用戶在不同的物理主機上運行服務,並且服務通過Docker的網絡通信。我想了解在多主機上使用Docker網絡時性能如何。
網絡性能對於像Percona XtraDB Cluster 和MySQL Group Replication(剛剛發布了另一個 Lab版本 )這樣的集群來說尤為重要。
在我的環境里,使用了兩台物理服務器,之間通過10GB網絡連接。這兩台服務器各有56個核的Intel CPU。
Sysbench環境:數據在內存里,僅僅使用主鍵查找。網絡測試中網絡往返很嚴重,但是能夠更清楚得看到對性能的影響。
如下是Docker網絡的可選方案:
- 沒有Docker容器(在下面的結果里標記成“direct”)
- Docker容器使用“host”網絡(標記為“host”)
- Docker容器使用“bridge”網絡,這里服務端口通過端口轉發來暴露(標記為“bridge”)
- Docker容器使用“overlay”網絡,客戶端和服務器都在通過overlay網絡連接的容器里啟動(結果里標記為“overlay”)。對於“overlay”網絡,可以使用第三方插件,使用不同的網絡實現,最知名的是:
- Calico network https://github.com/projectcalico/calico-containers
- Weave network https://github.com/weaveworks/weave
對於多主機網絡搭建,只有“overlay”(以及插件實現)可用。我使用“direct”,“host”和“bridge”作為參考以及比對,來衡量overlay實現的額外消耗。
我觀察到的結果如下:
觀察
- “Bridge”網絡會增加額外消耗,大概12%,這和我之前的benchmark是一致的。但是我想知道這是Docker的額外消耗,還是Linux bridge網絡實現的額外消耗。Docker應該使用的是我在《 在相同主機上使用Linux Network命名空間運行Percona XtraDB Cluster節點 》一文里講述的搭建方式,我懷疑Linux網絡命名空間和bridge也會帶來額外消耗。需要更多的測試來驗證這一點。
- 原生的“Overlay”Docker網絡受性能問題困擾。我用ksoftirq在一個CPU內核使用100%時觀察到了問題,並且看到了類似的報告。似乎Docker“overlay”里的網絡中斷並沒有適當分布到多個CPU里。“direct”和“bridge”配置里沒有這樣的問題。我認為這是Docker“overlay”網絡的問題(期望這個問題最終能夠解決)。
- Weave網絡結果非常糟糕。我看到了很多CPU分配給“weave”容器,因此我認為其實現有很嚴重的擴展性問題。
- Calico插件在多主機容器場景下性能最佳,甚至比“bridge-bridge”網絡更好。
結論
如果你需要使用Docker“overlay”網絡——如果想要部署多主機環境,或者使用Docker Swarm Mode,這是必須的——我推薦考慮使用Calico的Docker網絡插件。原生的Docker“overlay”網絡可以用來做原型設計或者快速測試,但是目前其在高端硬件上的性能有問題。