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 命令


准备数据


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


相关推荐

  • 语义熵识破LLM幻觉!牛津大学新研究登Nature
  • 全模态杀疯了!一夜刷新37项SOTA
  • 如何将JS对象的所有键名转换为小写?
  • 6700万参数比肩万亿巨兽GPT-4!微软MIT等联手破解Transformer推理密码
  • 中年财务男失业的第154天,被这件事彻底整破防了……
  • 万字图文:促销系统架构设计
  • “Vue 之父”最新采访:我是第一个吃螃蟹的人
  • 基于wujie的解决方案来简单聊聊微前端
  • 前端需要知道的缓存知识总结
  • 饿了么面试官:实现一下 Element-UI 官网的主题切换动画!
  • 即插即用的开源WINDOWS优化工具
  • 快速搭建Linux系统、一键清理Windows系统,两个实用开源项目
  • 基于Neo4j与LangChain实现GraphRAG:具象化理解其关键模块
  • 传统RAG及GraphRAG最佳实践探索及落地中的知识库建设、现实坑点:老刘说NLP技术社区第24、25讲精彩回放
  • 解密字符串的底层结构,它是怎么实现的?
  • 我的 3 个项目
  • 3分钟带你秒懂线程池设计机制
  • Kaggle竞赛Top5分享融合绝学。
  • [开源]MIT开源协议,一款 Vue UI 组件库,60多个开箱即用高质量组件
  • Spring Boot集成groovy快速入门Demo