說到部署,docker將便攜性和易用性拉高到乙個新水準。mysql相關的dockerfile和指令碼已經發布很長時間,在開發社群的使用率也穩步增長。這一點也在意料之中。
在影響到mysql效能的每個環節上,使用者的典型擔憂在於:容器化以後,在這些環節上是否存在顯著的效能開銷。為此,我們進行了充分的效能測試,下面我會對測試結果的某些細節進行**。
我們的關注點主要在mysql例項的io和網路效能,尤其是對比採用了不同儲存選項的例項,以及docker bridge網路模式帶來了多少效能開銷。 測試的執行環境是:oracle server x5-2,處理器為2x xeon e5-2660 v3(40硬體執行緒),256g記憶體,作業系統ubuntu 16.04,docker版本v1.11.2。
docker有三種使用儲存卷的方式:
1. 預設是通過使用資料卷。使用docker內部volumes管理功能,將資料寫入宿主機的某個目錄。
2.指定宿主機上的乙個目錄,將其掛載到容器內的特定位置。
3.建立乙個資料卷容器,然後將資料卷共享給其它容器。
docker 映象是由一組layer構成,每乙個layer代表檔案系統的差異。docker的儲存驅動負責疊加這些layer,進而構成乙個映象。然而,跳過docker儲存驅動的資料卷和宿主機目錄,在效能上接近原生的儲存。aufs是使用最廣泛的docker驅動程式,因此我們使用它進行測試。
為了測試網路開銷,我們分別對docker host和bridge網路進行了測試,方法是建立容器時分別指定–net=host 或–net=bridged。建立容器時,預設採用bridge模式。host模式只是在宿主機的網路棧上增加了容器,因此應該能夠避免bridge模式帶來的效能開銷。
測試時,我們使用了乙個自定義的配置檔案。為了增加i/o負載,首先我們特意將緩衝池大小設定為資料庫大小的10%左右。資料庫大小是2358mb,所以緩衝池大小為256mb。然後,我們將快取池大小逐漸增加到16384mb,觀察docker不受i/o限制時,會出現什麼情況。
docker執行mysql時,自定義配置是很直接的。最簡單的方式是建立容器時將/etc/my.cnf 掛載到容器中(-v /path/to/host/mycnf:/etc/mycnf)。你也可以修改容器,並將修改commit到映象中,但是這種方法不太好,因為每次公升級mysql時,你都要設定一次。
我們已經使用 sysbench 進行了測試。我們執行以下命令,以便建立我們的測試資料庫。
測試之前,先執行warm-up測試,測試程式執行320s,見下方。然後執行完整的測試。每個測試執行三次,在下表的結果中反映了這三次執行的平均值。
在bridge模式下測試時,我們會在根據需要改變—mysql-host的位址。
測試結果如下:
機器和環境讀寫 (trans/sec)
直接執行在宿主機上
847docker volume –net=host
857docker hostdir –net=host
850docker datacontainer –net=host
849docker volume –net=bridged
868docker hostdir –net=bridged
846docker datacontainer –net=bridged
856
我們發現,i/o高負載情況下,不同的方式測試結果差異性更小。docker執行mysql並沒有顯著的i/o或網路瓶頸。從這個角度看,docker平台上的mysql與直接執行在宿主機上並沒有顯著差別。值得注意的是:docker上執行時,採用不同的儲存選項和不採用儲存選項並沒有顯著差別。
之後,我們將快取池大小調整到16384mb,觀察i/o負載低時,會發生什麼情況。然後我們重新執行了一次測試用例。
結果如下:
機器和環境讀寫 (trans/sec)
直接執行在宿主機上
12686
docker volume –net=host
12201
docker hostdir –net=host
12180
docker datacontainer –net=host
12233
docker volume –net=bridged
11698
docker hostdir –net=bridged
11644
docker datacontainer –net=bridged
11662
結果表明,與直接執行在宿主機上的mysql相比,執行在docker上有一定的效能開銷。網路上也存在微小的開銷。仍然需要注意的是,docker不同的儲存選項之間,效能並沒有實際的差別。
乙個關鍵因素是i/o負載,i/o負載過高會抹平mysql在docker和宿主機上的差異。當不受i/o負載影響時,docker顯示出小幅度的瓶頸,尤其是執行在bridge網路模式下時。
綜合來說,docker不同的儲存選項不會對mysql效能產生較大影響,因此可以隨意選擇儲存。非常重要的一點是,將mysql執行在容器中時,要通過配置,對其進行效能調優。
容器化mysql已經在測試和開發環境中大量使用,我們的測試結果也顯示在生產環境中選擇容器化mysql並不需要效能方面的考慮。
mysql容器效能優化 MySQL高階 效能優化
1.應用優化 1.1 使用資料庫連線池 使用資料庫連線池,避免資料庫連線頻繁的建立和銷毀,進而減少資源的消耗,提高資料庫的訪問效能。1.2 減少對mysql的訪問 1.2.1 避免資料重複檢索 能一次檢索獲取到結果,就不要進行倆次檢索,減少對資料庫的無用重請求。1.2.2 增加cache層 增加快取...
如何提高MySQL效能
一 問題的提出 在應用系統開發初期,由於開發資料庫資料比較少,對於查詢sql語句,複雜檢視的的編寫等體會不出sql語句各種寫法的效能優劣,但是如果將應用系統 提交實際應用後,隨著資料庫中資料的增加,系統的響應速度就成為目前系統需要解決的最主要的問題之一。系統優化中乙個很重要的方面就是sql語句的優化...
如何使用基於容器的虛擬化提高效率效能
本文講的是如何使用基於容器的虛擬化提高效率效能 it168雲計算 如果你不介意只使用一種作業系統的話,那麼和傳統的hypervisor相比,基於容器的虛擬化能夠提供更高的效率與效能。基於容器的虛擬化使用單個核心執行乙個作業系統的多個例項。每個例項在乙個完全隔離的環境中執行,因此不存在乙個容器訪問另乙...