2014年7月IBM发布了一篇研究报告《Linux容器和虚拟机的性能比较》。该报告对实体机、虚拟机以及Linux Docker容器的性能进行了精准的量化及比较。
对于性能测试可以有很多方面,不过对于本文所关注的只是虚拟化实例与实体机之间性能开销的差距,因为与实体机相比较可以更直观地反映出资源消耗性进程对系统资源的占用率。报告中选用了吞吐量以及延时作为两个核心性能指标进行采集,这两个指标是性能测试用例中最为典型且易于分析的要素。
实验设备采用的是IBM x3650 M4服务器。具体参数如下:
CPU:两个2.4-3.0 GHz Intel Xeon E5-2665,共16核
RAM:256 GB
LINUX:Ubuntu 13.10(saucy)64位,内核版本3.11.0
Docker 1.0,QEMU 1.5.0,libvirt 1.1.1
测试过程中节能管理被禁用,为了充分发挥系统性能。
利用微基准测试来单独测量CPU、内存、网络和存储的资源消耗,并且也对实际的应用运行场景进行测试,应用测试对象选取了:redis和mysql。
测试场景选用了:
PXZ压缩计算:压缩算法是云服务中的常用组件,PXZ是基于LZMA算法的平行无损压缩工具,使用liblzma库。LZMA是一个Deflate和LZ77算法改良和优化后的压缩算法,2001年被首次应用于7-Zip压缩工具中。
Linpack:是国际上最流行的用于测试高性能计算机系统浮点性能的benchmark。通过对高性能计算机采用高斯消元法求解一元N次稠密线性代数方程组的测试,评价高性能计算机的浮点性能。
RandomAccess:测试内存在随机的访问压力下的性能表现。
Stream:是一个简单的基线测试程序,用于测试持续的内存带宽性能。
测试结果如下表所示:
在CPU、内存测试场景中,Docker作为轻量级容器性能表现优秀,只有很小的性能损耗。
网络配置
网络小包100byte传输时延
网络大包传输效率
存储配置
顺序IO吞吐率
随机IO吞吐率
Redis吞吐率
mysql吞吐率
从以上的结果中,我们得出以下结论:
虚拟机和容器基本上没有CPU和内存的额外开销,他们只会影响I/O和操作系统的交互,这是因为每次I/O操作都需要额外的周期,因此频繁的小规模I/O会对性能有较大影响。这类消耗增大了I/O延时,降低了CPU的循环效率,降低了系统的整体吞吐率。而事与愿违的是,绝大多数应用处理的还都是小I/O,这会影响容器的运行效率。
Docker加入了诸如分层镜像以及易用NAT等新特性,但这些特性的性能代价很高,因此Docker的默认设置性能不会超过虚拟机。
尽管KVM虚拟机具有良好的性能,但是配置性差是它的一个弱点。虚拟机要想达到较高的性能需要对内存、CPU、缓存进行大量的定制化配置,并需要反复的调优和试错,这种复杂的特质会对后续的运维工作造成较大的困扰。