高手的存在,就是让服务10亿人的时候,你感觉只是为你一个人服务......

Docker与VMware性能对比

目录
  1. 1. 测试场景:
  2. 2. 测试工具
  3. 3. 测试数据
    1. 3.1. LINPACK
    2. 3.2. STREAM
    3. 3.3. FIO
    4. 3.4. Netperf
    5. 3.5. Redis
  4. 4. 测试结论

公司的测试环境一直用的vmware,由于docker的优势,现准备将环境部署在docker中。
对比虚拟机,docker在磁盘空间上的节省不用说了,MB 与 GB的对比。
性能上的比较一直想做,由于资源和测试方案上面的不足,迟迟没做起来。好在VMware公司自己做了一份性能报告,在此整理一下。

一切源于2014年8月份召开的VMWorld会议,VM宣布与docker合作建立一个项目来研究如何在VM虚拟技术上使用docker。
然而IBM出来打了VM的脸(参考之前一篇文章,最下面IBM发表的论文),意思是我做了个实验,结论是docker对物理机几乎没有损耗,但是虚拟机对物理机的损耗很大。
VMWare当然不干了,事实是,VMware公司进行了与之前报道类似的实验。实验结果说明,虚拟机环境下运行Docker容器,其性能损失是完全可以接受的,有力的反驳了之前的言论。
根据VMware公司所公布的在vSphere虚拟机和直接在服务器中运行Docker容器的结果,可以看出:对于绝大部分的微测试集和Redis测试,vSphere表现出近乎和真实机器同样的性能,而且平均额外开销小于5%;最重要的是,在vSphere虚拟机的Docker容器中运行应用程序的额外开销和在真实服务器上的操作系统上运行容器的额外开销基本相等。
VMware公司的实验中,所采用的实验平台、测试集信息以及最终实验结果的详细信息如下。
实验平台包括了真实机器(直接运行Ubuntu和CentOS的Linux操作系统)、vSphere虚拟机(在与真实机器同样条件的操作系统中运行即将发布的vSphere)以及运行Docker的真实机器和虚拟机等4中情况。实验中采用包括LINPACK等4个微测试集以及Redis等真实负载。

针对各个测试集的性能结果如下:

LINPACK。对于45K的问题大小,虚拟化的额外开销基本可以忽略。对于更大的问题,由于内置页表的问题,硬件虚拟化会不可避免的引入相应的额外开销。但是,在虚拟机的Docker容器中运行应用程序和直接在虚拟机中运行并不会引入额外的开销。
STREAM。针对所有的操作,虚拟机会引入大约2-3%的额外开销。在真实机器上运行的Docker容器所带来的1-2%的额外开销可能处于噪声边缘,基本可以忽略。
FIO。对于随机读操作,虚拟机中的最大可接收IOPS相比于真实机器要小2%左右。但是,二者的随机写操作性能基本相同。总的来讲,Docker容器不会对随机读和随机写造成明显的性能损失。
Netperf。对于所有的实验平台,网络的吞吐量是相同的。在延迟测试方面,使用桥接NAT功能时,Docker容器会引入9-10微秒的额外延迟;如果直接使用宿主机网络,Docker容器基本上不会引入额外的延迟时间。
Redis。在虚拟机上运行Redis会比真实操作系统中运行性能稍有下降。但是,使用宿主机网络运行Docker容器时,无论Docker运行在真实机器还是虚拟机中,实验性能都跟直接运行在真实机器中基本相同。
基于以上的实验结果,VMware公司指出虚拟化会只会引入大约2%到4%的性能损失。在Docker容器中运行像Redis这样的应用程序,其性能是完全可以接受的,而其在安全、管理等方面的优势使得Docker容器成为虚拟化方面的推荐选择。

具体测试如下:

测试场景:

Native: Linux OS running directly on hardware (Ubuntu, CentOS)
vSphere VM: Upcoming release of vSphere with the same guest OS as native
Native-Docker: Docker version 1.2 running on a native OS
VM-Docker: Docker version 1.2 running in guest VM on a vSphere host

Alt text

测试工具

LINPACK: This benchmark solves a dense system of linear equations. For large problem sizes it has a large working set and does mostly floating point operations.
STREAM: This benchmark measures memory bandwidth across various configurations.
FIO: This benchmark is used for I/O benchmarking for block devices and file systems.
Netperf: This benchmark is used to measure network performance.
Redis: In this experiment, many clients perform continuous requests to the Redis server (key-value datastore).

测试数据

LINPACK

Alt text

STREAM

Alt text

FIO

Alt text

Netperf

Alt text

Alt text

Alt text

Alt text

Redis

Alt text

测试结论

Docker的性能几乎和原生主机性能一致;
Docker在VMware虚拟机中的性能损耗很小,仅仅在10GE时延上有大概20%左右的损耗;