容器化的 MySQL 性能如何? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Tenxcloud10
V2EX    推广

容器化的 MySQL 性能如何?

  •  
  •   Tenxcloud10 2016-07-19 11:59:36 +08:00 3067 次点击
    这是一个创建于 3451 天前的主题,其中的信息可能已经有所发展或是发生改变。

    说到部署, Docker 将便携性和易用性拉高到一个新水准。 MySQL 相关的 Dockerfile 和脚本已经发布很长时间,在开发社区的使用率也稳步增长。这一点也在意料之中。

    在影响到 MySQL 性能的每个环节上,用户的典型担忧在于:容器化以后,在这些环节上是否存在显著的性能开销。为此,我们进行了充分的性能测试,下面我会对测试结果的某些细节进行探讨。

    我们的关注点主要在 MySQL 实例的 IO 和网络性能,尤其是对比采用了不同存储选项的实例,以及 docker bridge 网络模式带来了多少性能开销。测试的运行环境是: Oracle Server x5-2 ,处理器为 2x Xeon E5-2660 v3 ( 40 硬件线程), 256G 内存,操作系统 Ubuntu 16.04 , Docker 版本 v1.11.2 。

    Docker 有三种使用存储卷的方式:

    1. 默认是通过使用数据卷。使用 Docker 内部 volumes 管理功能,将数据写入宿主机的某个目录。

    2 .指定宿主机上的一个目录,将其挂载到容器内的特定位置。

    3 .创建一个数据卷容器,然后将数据卷共享给其它容器。

    Docker 镜像是由一组 layer 构成,每一个 layer 代表文件系统的差异。 Docker 的存储驱动负责叠加这些 layer ,进而构成一个镜像。然而,跳过 docker 存储驱动的数据卷和宿主机目录,在性能上接近原生的存储。 AUFS 是使用最广泛的 docker 驱动程序,因此我们使用它进行测试。

    为了测试网络开销,我们分别对 Docker host 和 bridge 网络进行了测试,方法是创建容器时分别指定--net=host 或--net=bridged 。创建容器时,默认采用 bridge 模式。 Host 模式只是在宿主机的网络栈上增加了容器,因此应该能够避免 bridge 模式带来的性能开销。

    测试时,我们使用了一个自定义的配置文件。为了增加 I/O 负载,首先我们特意将缓冲池大小设置为数据库大小的 10%左右。数据库大小是 2358MB ,所以缓冲池大小为 256MB 。然后,我们将缓存池大小逐渐增加到 16384MB ,观察 Docker 不受 I/O 限制时,会出现什么情况。

    Docker 运行 MySQL 时,自定义配置是很直接的。最简单的方式是创建容器时将 /etc/my.cnf 挂载到容器中(-v /path/to/host/mycnf:/etc/mycnf )。你也可以修改容器,并将修改 commit 到镜像中,但是这种方法不太好,因为每次升级 MySQL 时,你都要设置一次。

    我们已经使用 sysbench 进行了测试。我们运行以下命令,以便建立我们的测试数据库。 alt 文本

    测试之前,先运行 Warm-up 测试,测试程序运行 320s ,见下方。然后运行完整的测试。每个测试运行三次,在下表的结果中反映了这三次运行的平均值。 alt 文本

    在 bridge 模式下测试时,我们会在根据需要改变 mysql-host 的地址。

    测试结果如下: alt 文本

    我们发现, I/O 高负载情况下,不同的方式测试结果差异性更小。 Docker 运行 MySQL 并没有显著的 I/O 或网络瓶颈。从这个角度看, Docker 平台上的 MySQL 与直接运行在宿主机上并没有显著差别。值得注意的是: Docker 上运行时,采用不同的存储选项和不采用存储选项并没有显著差别。

    之后,我们将缓存池大小调整到 16384MB ,观察 I/O 负载低时,会发生什么情况。然后我们重新运行了一次测试用例。

    结果如下: alt 文本

    结果表明,与直接运行在宿主机上的 MySQL 相比,运行在 Docker 上有一定的性能开销。网络上也存在微小的开销。仍然需要注意的是, docker 不同的存储选项之间,性能并没有实际的差别。

    结论

    一个关键因素是 I/O 负载, I/O 负载过高会抹平 MySQL 在 Docker 和宿主机上的差异。当不受 I/O 负载影响时, Docker 显示出小幅度的瓶颈,尤其是运行在 bridge 网络模式下时。

    综合来说, docker 不同的存储选项不会对 MySQL 性能产生较大影响,因此可以随意选择存储。非常重要的一点是,将 MySQL 运行在容器中时,要通过配置,对其进行性能调优。

    容器化 MySQL 已经在测试和开发环境中大量使用,我们的测试结果也显示在生产环境中选择容器化 MySQL 并不需要性能方面的考虑。

    本文由时速云翻译,如若转载,需注明转载自“时速云” 原文链接: http://mysqlserverteam.com/mysql-with-docker-performance-characteristics/

    1 条回复    2016-07-19 12:49:00 +08:00
    isCyan
        1
    isCyan  
       2016-07-19 12:49:00 +08:00 via Android
    这机器内存比我硬盘大。。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     947 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 19:42 PVG 03:42 LAX 11:42 JFK 14:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86