MySQL 性能实测:Docker 容器 vs 裸机部署,差距到底有多大?

news/2025/12/8 20:01:47/文章来源:https://www.cnblogs.com/kaiye/p/19323468

本文通过多组对照实验,深入测试 MySQL 在 Docker 容器和裸机环境下的性能差异,揭示影响性能的真正因素。

测试背景

网上关于 "Docker 部署数据库会有性能损耗" 的说法众说纷纭。为了搞清楚真相,我在阿里云 ECS(2核2G,Alibaba Cloud Linux 8)上进行了一系列对照实验。

测试环境:

  • 服务器:阿里云 ECS 2核2G
  • 系统:Alibaba Cloud Linux 8 (kernel 5.10.134)
  • MySQL 版本:8.0.44(裸机)/ 8.0.27 & 8.0.44(Docker)
  • 测试工具:sysbench oltp_read_only
  • 测试数据:sxsz_db 数据库,约 32,000 条记录

第一回合:Docker 比裸机慢 10 倍?

初始测试结果

第一次测试时,我用最简单的方式启动了 Docker MySQL:

# Docker 使用默认桥接网络,端口映射 3307:3306
docker run -d -p 3307:3306 mysql:8.0

测试结果让我大吃一惊:

并发数裸机(Unix socket)Docker(桥接网络)差距
50 0.08s (625 QPS) 0.80s (63 QPS) 10倍
100 0.15s (667 QPS) 1.56s (64 QPS) 10倍
200 0.35s (571 QPS) 3.66s (55 QPS) 10倍
500+ 正常完成 连接崩溃 -

看起来 Docker 部署 MySQL 性能惨不忍睹?

问题分析

仔细分析后发现,这个对比极不公平

  1. 连接方式不同:裸机用的是 Unix socket,Docker 用的是 TCP
  2. 网络模式不同:Docker 使用桥接网络 + NAT 端口转发
  3. 配置不同:Docker 默认 max_connections=151,裸机配置了 2000

这就像让一个人骑自行车和另一个人开汽车比赛,然后得出"人比汽车快"的结论。

第二回合:公平对比 TCP 连接

调整 Docker 网络模式

为了公平对比,我把 Docker 改为 host 网络模式:

docker run -d \--name mysql-test \--network=host \--cpus=2 \--memory=2g \-e MYSQL_ROOT_PASSWORD='password' \mysql:8.0 \--max_connections=2000

TCP 模式对比结果

两者都使用 TCP 127.0.0.1:3306 连接:

线程数裸机 QPSDocker QPS差异
10 2,761 2,997 +9%
50 2,607 2,955 +13%
100 2,637 2,828 +7%
200 2,546 2,805 +10%

咦?Docker 反而更快了?这不科学!

第三回合:Unix Socket 对比

让 Docker 也用 Unix Socket

Docker 默认不暴露 socket 文件,需要手动挂载:

mkdir -p /root/mysql-docker/socket
chmod 777 /root/mysql-docker/socketdocker run -d \--name mysql-test \-v /root/mysql-docker/data:/var/lib/mysql \-v /root/mysql-docker/socket:/var/run/mysqld \mysql:8.0 \--max_connections=2000

Unix Socket 对比结果

线程数裸机 QPSDocker QPS差异
10 4,921 5,681 +15%
50 4,963 5,674 +14%
100 4,781 5,491 +15%
200 4,518 5,079 +12%

Docker 还是更快?这明显不对劲。

第四回合:排查变量

检查版本差异

# 裸机
mysql -e "SELECT VERSION();"
# 8.0.44# Docker  
docker exec mysql-test mysql -e "SELECT VERSION();"
# 8.0.27

版本差了 17 个小版本!升级 Docker 到 8.0.44 后再测:

版本环境50线程 QPS100线程 QPS
8.0.27 Docker 3,909 3,745
8.0.44 Docker 3,563 3,509
8.0.44 裸机 3,422 3,238

发现:MySQL 8.0.27 比 8.0.44 快约 10%,但 Docker 依然略快于裸机。

检查数据目录

两者使用的数据目录不同:

  • 裸机:/var/lib/mysql
  • Docker:/root/mysql-docker/data

不同的数据文件,碎片程度、页分布可能不同,影响测试结果。

第五回合:终极公平对比

使用同一份数据

让 Docker 直接挂载裸机的数据目录:

docker run -d \--name mysql-test \-v /var/lib/mysql:/var/lib/mysql \-v /root/mysql-docker/socket:/var/run/mysqld \mysql:8.0.44 \--max_connections=2000

最终结果

清除系统缓存后测试:

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
线程数Docker QPS裸机 QPS差异
50 3,567 3,454 +3%
100 3,347 3,362 -0.4%

终于得到了符合预期的结果:Docker 和裸机性能几乎完全一致!

业界数据验证

我的测试结论与业界研究一致:

MySQL 官方博客(2016):

"MySQL under Docker performs just as well as running MySQL directly on the host computer"

IBM 研究论文:

"Docker is nearly identical to native performance... The exception is Docker's NAT — if you use port mapping, then you can expect a minor hit in latency"

结论

性能影响因素排序

因素性能影响说明
桥接网络 vs Host/Socket ~10倍 最大影响因素!NAT 转发开销巨大
Unix socket vs TCP ~30% 内核直接通信 vs TCP 协议栈
MySQL 版本差异 ~10% 新版本不一定更快
Docker 容器开销 <5% 几乎可忽略

核心结论

  1. Docker 本身的性能开销可以忽略不计
  2. 网络配置才是性能差距的罪魁祸首
  3. 生产环境建议
    • 优先使用 --network=host 或 Unix socket 挂载
    • 桥接网络仅用于开发测试环境
    • 注意 MySQL 版本对性能的影响

最佳实践配置

# 高性能 Docker MySQL 配置
docker run -d \--name mysql \--network=host \                    # 使用宿主机网络--cpus=2 \--memory=2g \--restart=always \-v /data/mysql:/var/lib/mysql \     # 数据持久化-e MYSQL_ROOT_PASSWORD='your_password' \mysql:8.0 \--max_connections=2000 \--innodb_buffer_pool_size=1G

或者使用 Unix socket:

# Go 连接字符串(Unix socket,最快)
dsn := "user:pass@unix(/var/run/mysqld/mysqld.sock)/dbname"# Go 连接字符串(TCP)
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname"

测试日期:2024年12月
测试环境:阿里云 ECS 2核2G,Alibaba Cloud Linux 8
测试工具:sysbench 1.0.x,oltp_read_only 工作负载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/993474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:【二叉搜索树】:程序的“决策树”,排序数据的基石

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

thinkphp6 request /i /s等转换

在ThinkPHP框架中,`$this->request->post(type/s, )`里的`/s`是一个参数过滤和类型转换的标识。 具体含义:- `/s` 表示将获取到的参数转换为字符串类型(string)。 如果不加`/s`,默认情况下ThinkPHP会根据参…

An Explainable KG-RAG-Based Approach to Evidence-Based Fake News Detection Using LLMs

方法主张类型分类:采用微调后的 DeBERTaV3-large 模型,识别输入主张的类型,具体包括 “立场声明”“事件 / 属性主张”“因果主张”“数值主张”“引文验证” 五类。示例检索:运用 BM25 算法,从训练集中检索与输入…

10 种低情商行为

10 种低情商行为🔍 10 种低情商行为打断别人说话→ 不尊重他人表达权永远抬杠→ 把交流变辩论赛,消耗他人耐心过度分享负能量→ 情绪倾倒,透支他人善意玩笑开过界→ 用他人痛点博笑点,制造尴尬 当众揭短 → 公开他…

科学破解“睡眠信用卡”困局:狄耐克脑电波交互技术,重塑健康作息新模式

深夜加班的屏幕蓝光尚未熄灭,周末补觉的闹钟却已响起——这种“先透支、后偿还”的“睡眠信用卡”模式,正成为当代都市人群的普遍生活常态。 然而,越来越多医学研究证实,碎片化、补偿式的睡眠不仅无法修复身体机能…

2025 最新免费降 AI 率网站测评!13 款中英文工具实测,哪个最好用?

2025 最新免费降 AI 率网站测评!13 款中英文工具实测,哪个最好用?随着 AI 写作工具的普及,学术论文、公众号文案等内容的 AI 生成检测也愈发严格,降 AI 率工具成为刚需!为了帮大家避开踩坑,实测了 13 款支持中文…

Google 开源项目风格指南

每个较大的开源项目都有自己的风格指南:关于如何为该项目编写代码的一系列约定(有时候会比较武断)。当所有代码均保持一致的风格,在理解大型代码库时更为轻松。官方网站 https://zh-google-styleguide.readthedocs…

男士洗面奶哪个牌子最好?露卡菲娅山茶花洗面奶,排行榜单热销款揭秘!

敏感肌秋冬新选择:露卡菲娅山茶花洗面奶 作为一个屏障受损三年的敏感肌,选洁面简直是在“拆盲盒”——皂基类洗后紧绷脱皮,普通氨基酸又总洗不干净闷闭口,直到遇见露卡菲娅山茶花洗面奶,才终于找到肌肤的“安全区…

软件构造大作业:儿童故事管理平台的开发

课程实验及大作业主题:儿童故事管理平台的开发 最终目标: 构建一个集故事生成、插图创作、语音合成于一体的儿童故事管理平台。用户可以提供关键词,平台自动生成一个图文并茂、并配有朗读音频的完整故事。 核心要求…

flex布局精进: align-items: stretch;属性

问题1:多个盒子排列时,不同盒子内容不同,导致高度不同 此时如果想让所有盒子的高度/宽度一致: display: flex; align-items: stretch; 含义,flex布局下,卡片高度、宽度拉伸,使其与高度(宽度)最大的孩子保持一致…

v-if

v-else和v-else-if 1.作用:辅助v-if进行判断渲染 2.语法: v-else: v-else后面不需要加任何语句 v-else-if: v-else-if="表达式"注意事项: 1.v-if是如果的意思 条件为:true会渲染 条件为:false不渲染 …

英语_阅读_Paddling a dragon boat_待读

Paddling a dragon boat is no piece of cake. 划龙舟可不是件容易的事。 Besides the key time required to be part of a team, its a full-body exercise. 除了需要投入大量时间成为团队一员外,这也是一项全身性的…

langchain4j 学习系列(6)-结构化输出(参数提取)

继续学习langchain4j,玩过dify的朋友想必对"参数提取器"这个节点很熟悉,示例: 参数提取器可以很方便的从“非结构的自然语言”中,提取出结构化的结果。下面来看看langchain4j如何实现类似功能:public s…

小型功率三极管S9013、SOT-23介绍

S9013简介 S9013三极管是一种NPN型三极管,以硅为主要材料,属于小型的功率三极管,这种三极管很常见,有插件TO-92、贴片SOT-23两种封装,它有三个引脚,分别是基极b,集电极C,发射极e,对于插件的S9013,字体面向自…

Python 简单基础教程

Python 是一门简洁、易上手的编程语言,广泛应用于数据分析、Web 开发、人工智能、自动化等领域。本教程从零基础开始,带你掌握 Python 核心基础。 一、环境准备 1. 安装 Python安装注意:Windows:勾选「Add Python …

屏幕上那一行刺眼的红色 `Time Limit Exceeded`,是不是你我再熟悉不过的场景?

本文提供了一种与AI协作进行算法优化的新思路。通过一个结构化的AI指令模板,引导AI扮演“算法陪练”的角色,不仅能解决代码性能问题,更能帮助开发者深入理解优化原理,真正提升个人能力。无论是深夜在 LeetCode 上奋…

【论术】项目复盘总结-响应式界面

工作的意义和动力本质上是终身学习者在自由市场中的创造性表达 —— 佚名 项目需求:首页需要在用户屏幕下实现自适应并尽量维持UI稿中的样式,而用户的分辨率不能保持在1920*1080,缩放比率通常在150%,且界面图片要确保…

if 的虚拟语气和省略形式

时态 从句谓语动词 主句谓语动词现在 \(\text{did/were}\) \(\text{would/coud/should/might + do}\)过去 \(\text{had done}\) \(\text{would/coud/should/might + have done}\)将来 \(\text{did/were, were to do, s…

Ubuntu 架构磁盘清理的手段

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

西电2025硕士网课——人工智能安全与伦理练习答案

西电2025年研究生网课人工智能安全与伦理(北航雨课堂) 答案参考于https://github.com/LazzyXP/AI-Security-and-Ethics-BeiHang-Univer...,修改了一部分错误的答案第一章-AI安全与伦理概述AI 解释生成系统的手段包括…