前言 自從使用docker以來,就經常聽說MySQL資料庫最好別運行在容器中,性能會損失很多。一些之前沒使用過容器的同事,對資料庫運行在容器中也是忌諱莫深,甚至只要資料庫跑在容器中出現性能問題時,首先就把問題推到容器上。 那麼到底會損失多少,性能損失會很多嗎? 為此我裝了兩個MySQL,版本都是8. ...
前言
自從使用docker以來,就經常聽說MySQL資料庫最好別運行在容器中,性能會損失很多。一些之前沒使用過容器的同事,對資料庫運行在容器中也是忌諱莫深,甚至只要資料庫跑在容器中出現性能問題時,首先就把問題推到容器上。
那麼到底會損失多少,性能損失會很多嗎?
為此我裝了兩個MySQL,版本都是8.0.34。一個用官網二進位包安裝,另一個用docker hub的MySQL鏡像安裝。兩個MySQL都運行在同一臺機器,但不同時運行,先後運行測試。測試工具用的sysbench,運行在另一臺機器。
提前聲明:測試流程比較簡單,只是用sysbench測了混合讀寫場景,測試次數也較少,不具有權威性。感興趣的話,可以自行完善測試流程。
如果對後文沒什麼興趣,這裡也可以直接說結論:單表百萬級以下時,非容器和容器的性能差異並不多。單表千萬級時,容器MySQL大概會損耗10% ~ 20%的性能。
應用 | 版本 | 備註 |
---|---|---|
Debian | 12.0 | 操作系統。4C16G |
docker | 20.10.17 | 容器運行時 |
MySQL(非docker) | 8.0.34 | 基於官方的二進位安裝包 |
MySQL(docker) | 8.0.34 | 使用docker hub的鏡像 |
sysbench | 1.0.20 | 壓測工具 |
MySQL配置
MySQL安裝後創建測試用的sysbench用戶和sysbench資料庫,調整innodb_buffer_pool_size為2GB。
docker容器的網路配置為bridge,掛載數據目錄。
sysbench命令
- 準備數據
sysbench --db-driver=mysql --mysql-host=192.168.3.21 --mysql-port=3306 --mysql-user=sysbench --mysql-password=123456 --mysql-db=sysbench --table_size=10000000 --tables=20 --threads=4 oltp_read_write prepare
- 執行測試
sysbench --db-driver=mysql --mysql-host=192.168.3.21 --mysql-port=3306 --mysql-user=sysbench --mysql-password=123456 --mysql-db=sysbench --time=300 --threads=8 --report-interval=10 oltp_read_write run
- 清理測試數據
sysbench --db-driver=mysql --mysql-host=192.168.3.21 --mysql-port=3306 --mysql-user=sysbench --mysql-password=123456 --mysql-db=sysbench --table_size=10000000 --tables=20 --threads=4 oltp_read_write cleanup
測試結果
單表1000w數據,20張表,測試4次。
MySQL運行環境 | 測試序列 | 總SQL執行數 | 每秒SQL數 | 每秒事務數 | 延遲時間(平均) | 延遲時間(95%) |
---|---|---|---|---|---|---|
非容器 | 1 | 3798093 | 12658.84 | 632.78 | 12.64 | 20.00 |
非容器 | 2 | 3914578 | 13047.91 | 652.28 | 12.26 | 17.01 |
非容器 | 3 | 4059867 | 13531.79 | 676.46 | 11.82 | 15.55 |
非容器 | 4 | 3772390 | 12574.00 | 628.58 | 12.72 | 19.65 |
容器 | 1 | 3230678 | 10768.41 | 538.28 | 14.86 | 26.20 |
容器 | 2 | 3538573 | 11794.68 | 589.62 | 13.57 | 19.29 |
容器 | 3 | 3567943 | 11892.56 | 594.50 | 13.45 | 17.63 |
容器 | 4 | 3616204 | 12053.53 | 602.58 | 13.27 | 17.32 |
平均統計:
MySQL運行環境 | 總SQL執行數 | 每秒SQL數 | 每秒事務數 | 延遲時間(平均) | 延遲時間(95%) |
---|---|---|---|---|---|
非容器 | 3,886,232 | 12,953.14 | 647.53 | 12.36 | 18.05 |
容器 | 3,488,350 | 11,627.3 | 581.25 | 13.79 | 20.11 |
環比 | -10.24% | -10.24% | -10.24% | +11.57% | +11.41% |
在測千萬級數據量之前,測過幾輪幾十萬級的數據量,非容器和容器版的MySQL並沒有多大區別。當數據量逐漸增多時,差異就愈加明顯。目前測單表1000w已經出現10%左右的性能損耗,如果單表數據繼續增大,性能損耗應該也會更多。
本文來自博客園,作者:花酒鋤作田,轉載請註明原文鏈接:https://www.cnblogs.com/XY-Heruo/p/17856386.html