????說到部署,Docker將便攜性和易用性拉高到一個新水準。MySQL相關的Dockerfile和腳本已經發(fā)布很長時間台囱,在開發(fā)社區(qū)的使用率也穩(wěn)步增長。這一點也在意料之中读整。
????在影響到MySQL性能的每個環(huán)節(jié)上,用戶的典型擔憂在于:容器化以后咱娶,在這些環(huán)節(jié)上是否存在顯著的性能開銷米间。為此,我們進行了充分的性能測試膘侮,下面我會對測試結果的某些細節(jié)進行探討屈糊。
????我們的關注點主要在MySQL實例的IO和網絡性能,尤其是對比采用了不同存儲選項的實例琼了,以及docker bridge網絡模式帶來了多少性能開銷逻锐。測試的運行環(huán)境是:Oracle Server x5-2,處理器為2x Xeon E5-2660 v3(40硬件線程)雕薪,256G內存昧诱,操作系統(tǒng)Ubuntu16.04,Docker版本v1.11.2所袁。
????Docker 鏡像是由一組layer構成盏档,每一個layer代表文件系統(tǒng)的差異。Docker的存儲驅動負責疊加這些layer燥爷,進而構成一個鏡像蜈亩。然而懦窘,跳過docker存儲驅動的數(shù)據(jù)卷和宿主機目錄,在性能上接近原生的存儲稚配。AUFS是使用最廣泛的docker驅動程序畅涂,因此我們使用它進行測試。
????為了測試網絡開銷道川,我們分別對Docker host和bridge網絡進行了測試午衰,方法是創(chuàng)建容器時分別指定–net=host?或–net=bridged。創(chuàng)建容器時愤惰,默認采用bridge模式苇经。Host模式只是在宿主機的網絡棧上增加了容器,因此應該能夠避免bridge模式帶來的性能開銷宦言。
????測試時扇单,我們使用了一個自定義的配置文件。為了增加I/O負載奠旺,首先我們特意將緩沖池大小設置為數(shù)據(jù)庫大小的10%左右蜘澜。數(shù)據(jù)庫大小是2358MB,所以緩沖池大小為256MB响疚。然后鄙信,我們將緩存池大小逐漸增加到16384MB,觀察Docker不受I/O限制時忿晕,會出現(xiàn)什么情況装诡。
????Docker運行MySQL時,自定義配置是很直接的践盼。最簡單的方式是創(chuàng)建容器時將 /etc/my.cnf?掛載到容器中(-v /path/to/host/mycnf:/etc/mycnf)鸦采。你也可以修改容器,并將修改commit到鏡像中咕幻,但是這種方法不太好渔伯,因為每次升級MySQL時,你都要設置一次肄程。
????我們已經使用 sysbench 進行了測試锣吼。我們運行以下命令,以便建立我們的測試數(shù)據(jù)庫蓝厌。
????測試之前玄叠,先運行Warm-up測試,測試程序運行320s拓提,見下方诸典。然后運行完整的測試。每個測試運行三次,在下表的結果中反映了這三次運行的平均值狐粱。
????在bridge模式下測試時舀寓,我們會在根據(jù)需要改變—mysql-host的地址。
測試結果如下:
????我們發(fā)現(xiàn)肌蜻,I/O高負載情況下互墓,不同的方式測試結果差異性更小。Docker運行MySQL并沒有顯著的I/O或網絡瓶頸蒋搜。從這個角度看篡撵,Docker平臺上的MySQL與直接運行在宿主機上并沒有顯著差別。值得注意的是:Docker上運行時豆挽,采用不同的存儲選項和不采用存儲選項并沒有顯著差別育谬。
????之后,我們將緩存池大小調整到16384MB帮哈,觀察I/O負載低時膛檀,會發(fā)生什么情況。然后我們重新運行了一次測試用例娘侍。
結果如下:
????結果表明咖刃,與直接運行在宿主機上的MySQL相比,運行在Docker上有一定的性能開銷憾筏。網絡上也存在微小的開銷嚎杨。仍然需要注意的是,docker不同的存儲選項之間氧腰,性能并沒有實際的差別枫浙。
結論
????一個關鍵因素是I/O負載,I/O負載過高會抹平MySQL在Docker和宿主機上的差異古拴。當不受I/O負載影響時箩帚,Docker顯示出小幅度的瓶頸,尤其是運行在bridge網絡模式下時斤富。
????綜合來說,docker不同的存儲選項不會對MySQL性能產生較大影響锻狗,因此可以隨意選擇存儲满力。非常重要的一點是,將MySQL運行在容器中時轻纪,要通過配置油额,對其進行性能調優(yōu)。
????容器化MySQL已經在測試和開發(fā)環(huán)境中大量使用刻帚,我們的測試結果也顯示在生產環(huán)境中選擇容器化MySQL并不需要性能方面的考慮潦嘶。
備注:以上內容完全摘錄自網上,供參考崇众。