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%左右的性能损耗,如果单表数据继续增大,性能损耗应该也会更多。
MySQL运行在docker容器中会损失多少性能的更多相关文章
- MySQL(6)--复制,docker容器中
MySQL5.7.11实现replication 启动两个安装好mysql的空的docker image ----------------- shell1 master $docker run -i ...
- Elasticsearch核心技术(1)--- Docker容器中运行ES、Kibana、Cerebro
Docker容器中运行ES,Kibana,Cerebro和Logstash安装与数据导入ES 想加强ES有关的知识,看了阮一鸣老师讲的<Elasticsearch核心技术与实战>收获很大, ...
- Docker容器中运行ASP.NET Core
在Linux和Windows的Docker容器中运行ASP.NET Core 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了. ...
- .NetCore下使用IdentityServer4 & JwtBearer认证授权在CentOS Docker容器中运行遇到的坑及填坑
今天我把WebAPI部署到CentOS Docker容器中运行,发现原有在Windows下允许的JWTBearer配置出现了问题 在Window下我一直使用这个配置,没有问题 services.Add ...
- 一个docker容器中运行多个服务还是弄一堆docker容器运行?
不建议直接在单个 Docker 容器中运行多个程序. 以 2017年 10 月18 日 Docker 官方支持 Kubernetes 为分水岭计算,Kubernetes 赢得容器编排之战的最终胜利已经 ...
- 为Docker容器中运行的gitlab添加ssh的一些问题记录
最近做的一个东西,是将gitlab10.x的汉化版本,从源码编译(在源码中自己定制一些东西),然后制作成Docker镜像,作为Docker容器来运行 在启用容器中的gitlab的ssh的时候,遇到了一 ...
- 在docker容器中运行hello world!
在docker容器中运行hello world! docker容器可以理解为在沙盒中运行的进程.这个沙盒包含了该进程运行所必须的资源,包括文件系统.系统类库.shell 环境等等.但这个沙盒默认是不会 ...
- docker_facenet_image在Docker容器中运行Facenet环境搭建
对开发和运维人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境.任意时间让应用正常运行.而Docker恰恰是可以实现这一终极目标的瑞士军刀. 具体来说,Docker在开发和运维过程中,具 ...
- Docker容器中MySQL最大连接数被限制为214的解决方案
原文:Docker容器中MySQL最大连接数被限制为214的解决方案 一.背景 话说笔者在上次的博客里简单的讲了一下调整MySQL最大连接数的方法.在文章的最后笔者提到了还有一些特殊情况比如说Dock ...
- .Net Core 3.0 的 docker 容器中运行 无法 访问 Oracle数据库
.Net Core 3.0 的 docker 容器中运行 无法 访问 Oracle数据库 , 一直报下面的错误 ORA-00604: error occurred at recursive SQL ...
随机推荐
- rest-apiV2.0.0升级为simplest-api开源框架生态之simplest-jpa发布
什么是 simplest simplest 追求存粹简单和极致. 旨在为项目快速开发提供一系列的基础能力,方便用户根据项目需求快速进行功能拓展 不在去关心一些繁琐.重复工作,而是把重点聚焦到业务. 前 ...
- Go的任务调度单元与并发编程
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 本文主要介绍Go语言.进程.线程.协程的出现背景原因以及 ...
- 如何爆破js加密后的密码?
如何爆破js加密后的密码? 1.首先burp中安装插件: https://github.com/whwlsfb/BurpCrypto 安装插件完毕后,分析进行js加密的算法. 2.分析加密过程: 找到 ...
- css里的position的static|relative|absolute|fixed的区别
前提:仅以div块为例,其它不清楚 注:1.下面截图看起来不是从页面左上角位置开始,是因为body元素有默认的margin,有边框 2.当position不是static时,top和bottom需要指 ...
- JaCoCo助您毁灭线上僵尸代码
一. 现状·问题 随着需求不断迭代,业务系统的业务代码突飞猛进,在你自豪于自己的代码量产出很高时,有没有回头看看线上真正的客户使用量又有多少呢? 费事费力耗费大量人力成本上线的功能,可能一年没人使用, ...
- GDB苹果网页一键打包工具(IOS,IPA,苹果应用网页打包,WINDOWS平台)
工具简介 GDB苹果网页一键打包工具(IOS,IPA,苹果应用网页打包,Windows平台)可以把本地HTML项目或者网站打包为一个苹果应用IPA文件,无需编写任何代码,支持在苹果设备上安装运行.作为 ...
- MPI转以太网Plus模块Modbus连接两台变频器通信案例
MPI转以太网Plus模块Modbus主站连接两台变频器通信案例 MPI转以太网Plus模块连接200PLC无需编程实现Modbus主从站功能与2台变频器modbus通信:以下就是MPI转以太网模块作 ...
- 手动实现Transformer
Transformer和BERT可谓是LLM的基础模型,彻底搞懂极其必要.Transformer最初设想是作为文本翻译模型使用的,而BERT模型构建使用了Transformer的部分组件,如果理解 ...
- 3DMatch
详细描述链接:3DMatch 数据集.github(介绍非常详细) 官网主页: 主页 3DMatch数据集收集了来自于62个场景的数据,其中54个场景的数据用于训练,8个场景的数据用于评估,其具体名称 ...
- Python基础——字符编码、文件处理
文章目录 字符编码 一 引入 二 知识储备 2.1 三大核心硬件 2.2 文本编辑器读取文件内容的流程 2.3 python解释器执行文件的流程 2.4 总结 三.字符编码介绍 3.1 什么是字符编码 ...