惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
Jina AI
Jina AI
雷峰网
雷峰网
博客园_首页
WordPress大学
WordPress大学
博客园 - 司徒正美
爱范儿
爱范儿
博客园 - 聂微东
IT之家
IT之家
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
博客园 - Franky
V
V2EX
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志

博客园 - 小y

HP-Socket压力测试例子,用恐怖如斯来形容。 经典分类算法KNN的研究 用python自己回测股票策略 怎么让大模型查询本地数据库输出结果(Dify+豆包) OpenClaw工作原理解析【建议背诵】 AiAgent工具之网页搜索 怎么在百度搜索中屏蔽csdn 使用C#调用Yolo26模型的ONNX ESP32 使用MicroPython编写代码实现远程控制LED灯 使用Razor模板引擎实现自动生成代码 ESP32开发环境下载、USB驱动安装 2026年最新年会抽奖小程序 grafana+prometheus快速实现可视化大屏 PyAutoGUI库自动化测试脚本工具模拟键盘鼠标操作 性能卓越的开源时序数据库——QuestDB GitHub超 30000+ star , 超强大的开源项目Supervision DevExpress系列:dxValidationProvider和dxErrorProvider两种控件的用法和区别 用C# GDI编写粒子效果 动画图解嵌入式常见的通讯协议:SPI、I²C、UART、红外 C#中的MVVM框架 .net 9 中的WinUI3和MAUI有什么区别 Netty的高性能之道 一文搞定理解RPC CSS flex布局(弹性布局/弹性盒子) 为什么选择使用TypeScript?这篇文章讲透了
实测:MySQL跑在Docker里会损失多少性能?寻找Docker优化点
小y · 2025-04-09 · via 博客园 - 小y

一、场景复现:一个让老板皱眉的TPS曲线

1.1 压测环境

  • 宿主机配置:4核8G SSD云服务器,Ubuntu 20.04
  • Docker MySQL:官方镜像 mysql:8.0,默认配置
  • 对比组:同服务器原生安装MySQL 8.0
  • 工具:sysbench 模拟1000万数据,100并发读写

1.2 结果对比(关键指标)

指标

原生MySQL

Docker MySQL

性能损失

平均TPS

1523

1386

9.1%

95%延迟(ms)

21

29

38%

磁盘IO吞吐(MB/s)

62

51

17.7%

老码农点评:TPS看似只降了9%,但延迟飙升38%——对实时业务简直是噩梦!


二、刨根问底:Docker吃掉性能的4只“蛀虫”

2.1 网络栈:Bridge模式的隐形税

  • 问题:Docker默认的bridge网络需经过NAT转发,增加2~3ms延迟。
  • 实测对比:
# 使用host网络模式  
docker run --network=host mysql:8.0  
    • 结果:延迟下降22%,TPS提升7%

2.2 文件系统:Overlay2的双重写入惩罚

  • 原理:Docker的联合文件系统(Overlay2)会导致写操作额外复制元数据。
  • 优化方案:
# 1. 数据卷直连宿主机  
docker run -v /mnt/ssd/mysql:/var/lib/mysql mysql  

# 2. 使用性能模式挂载  
mount -o noatime,data=writeback /dev/sdb /mnt/ssd  
    • 效果:IO吞吐提升31%

2.3 CPU调度:CGroup的温柔陷阱

  • 坑点:默认CPU配额限制导致高负载时争抢资源。
  • 救命配置:
# 允许容器突破CPU限制(慎用!)  
docker run --cpus=4 --cpu-quota=-1 mysql  

2.4 内存竞争:Swap的死亡螺旋

  • 案例:当容器内存超限时,Docker强制触发Swap,性能断崖式下跌。
  • 硬核建议:
# 限制内存并禁用Swap  
docker run -m 4g --memory-swap=4g mysql  

三、实战:将性能损失压缩到3%的配置模板

3.1 终极docker-compose.yml

version: '3.8'  
services:  
  mysql:  
    image: mysql:8.0  
    network_mode: "host"  
    volumes:  
      - /mnt/nvme/mysql:/var/lib/mysql  
    environment:  
      - MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT=2  
    deploy:  
      resources:  
        limits:  
          memory: 6G  
          cpus: '3'  
    command:  
      --innodb_buffer_pool_size=4G  
      --innodb_flush_method=O_DIRECT  

3.2 调优后性能对比

指标

调优前损失

调优后损失

TPS

9.1%

2.8%

延迟

38%

5.1%

IO吞吐

17.7%

4.3%


四、结论:什么时候该用/不该用Docker跑MySQL?

✅ 推荐场景

  • 开发/测试环境:牺牲3%性能换秒级环境重建,血赚!
  • 中小规模Web应用:日均百万PV以下无压力
  • 云原生技术栈:K8s生态红利远大于性能损耗

❌ 劝退场景

  • 金融级高频交易:延迟多1ms都可能损失百万
  • 超大规模数据分析:Hadoop/Spark直连物理机才是王道
  • 老旧机械硬盘服务器:IO性能本就吃紧,别让Docker雪上加霜

五、互动时间

“你愿意用5%的性能换取容器化的便利吗?在评论区说出你的选择!”