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%左右的性能损耗,如果单表数据继续增大,性能损耗应该也会更多。

相关推荐
wno7043 分钟前
MYSQL 常用合并函数
android·数据库·mysql
for_ever_love__2 小时前
LangGraph State 设计:多节点之间怎么安全地共享数据
redis·mysql·状态模式·checkpoint·state·状态图·langgraph
codeejun4 小时前
每日一Go·MySQL-7、MySQL 核心原理全景图谱
开发语言·mysql·golang
minebmw74 小时前
第 04 讲 深入浅出索引(上):B+树索引的数据结构与查询过程
mysql
bksczm4 小时前
MySQL进阶篇之备份(下半篇)
数据库·mysql
骑着蜗牛撵大象3275 小时前
SQL 编辑器不是高级记事本:KStudio 与 KSQL Developer 里的建表与增删改查手法
数据库·sql·mysql·编辑器·crud·执行计划
CaptainT5 小时前
WHERE 到底筛掉了哪些行
sql·mysql
CaptainT5 小时前
先把例子跑起来:MySQL 环境与本文的示例数据
数据库·后端·mysql
夜雪一千5 小时前
MySQL中查询和操作JSON类型的数据
数据库·mysql·json
for_ever_love__6 小时前
MySQL 8.0 表设计规范:从业务建模、约束到索引评审的完整方法
数据库·mysql·表设计·建表规范