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

前言

自从使用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命令

  • 准备数据
bash 复制代码
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
  • 执行测试
bash 复制代码
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
  • 清理测试数据
bash 复制代码
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%左右的性能损耗,如果单表数据继续增大,性能损耗应该也会更多。

相关推荐
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO1 小时前
MySQL事务
数据库·mysql
数据龙傲天2 小时前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
engineer-gxd3 小时前
MySQL 表的操作
mysql
cyt涛3 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
看山还是山,看水还是。4 小时前
MySQL 管理
数据库·笔记·mysql·adb
momo小菜pa5 小时前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke5 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
小宇成长录5 小时前
Mysql:数据库和表增删查改基本语句
数据库·mysql·数据库备份
团儿.6 小时前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构
权^7 小时前
MySQL--聚合查询、联合查询、子查询、合并查询(上万字超详解!!!)
大数据·数据库·学习·mysql