社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

MySQL运行在Docker容器中会损失多少性能

Java知音 • 6 月前 • 1267 次点击  

前言


自从使用 docker 以来,就经常听说 MySQL 数据库最好别运行在容器中,性能会损失很多。一些之前没使用过容器的同事,对数据库运行在容器中也是忌讳莫深,甚至只要数据库跑在容器中出现性能问题时,首先就把问题推到容器上。


那么到底会损失多少,性能损失会很多吗?


为此我装了两个 MySQL,版本都是 8.0.34。一个用官网二进制包安装,另一个用 docker hub 的 MySQL 镜像安装。两个 MySQL 都运行在同一台机器,但不同时运行,先后运行测试。测试工具用的 sysbench,运行在另一台机器。


提前声明:测试流程比较简单,只是用 sysbench 测了混合读写场景,测试次数也较少,不具有权威性。感兴趣的话,可以自行完善测试流程。



如果对后文没什么兴趣,这里也可以直接说结论:单表百万级以下时,非容器和容器的性能差异并不多。单表千万级时,容器 MySQL 大概会损耗 10% ~ 20%的性能。


应用版本备注
Debian12.0操作系统。4C16G
docker20.10.17容器运行时
MySQL(非 docker)8.0.34基于官方的二进制安装包
MySQL(docker)8.0.34使用 docker hub 的镜像
sysbench1.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%)
非容器1379809312658.84632.7812.6420.00
非容器2391457813047.91652.2812.2617.01
非容器3 405986713531.79676.4611.8215.55
非容器4377239012574.00628.5812.7219.65
容器1323067810768.41538.2814.8626.20
容器2353857311794.68589.6213.5719.29
容器3356794311892.56594.5013.4517.63
容器4361620412053.53602.5813.2717.32


平均统计:


MySQL 运行环境总 SQL 执行数每秒 SQL 数每秒事务数延迟时间(平均)延迟时间(95%)
非容器3,886,23212,953.14647.5312.3618.05
容器3,488,35011,627.3581.2513.7920.11
环比-10.24%-10.24%-10.24% +11.57%+11.41%


在测千万级数据量之前,测过几轮几十万级的数据量,非容器和容器版的 MySQL 并没有多大区别。当数据量逐渐增多时,差异就愈加明显。目前测单表 1000w 已经出现 10%左右的性能损耗,如果单表数据继续增大,性能损耗应该也会更多。


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/172276
 
1267 次点击