肖桂荣,肖荣生
(福州大学福建省空间信息工程研究中心,福建 福州 350116)
随着大数据迅猛发展,数据规模越来越大,数据种类越来越多,依托于云平台的各种应用呈现出种类繁多这一特征[1]. 各种云平台应用所依赖的生产环境千差万别,云平台应用对云平台中的资源利用率、隔离性和快速部署性提出了要求. 为统一管理云应用和集群资源,出现了集群复用技术,它可以提高资源利用率,实现平台应用的统一管理以及平台资源的共享. 传统的虚拟化技术已经不能满足PaaS(platform as a service)平台这种场景的需求,而轻量级虚拟化在高效性、隔离性和快速性方面非常适合PaaS平台这种要求[2-3],所以轻量级虚拟化在各大互联网公司得到广泛的应用. 例如百度基于Docker[4]开发了Matrix,Google在Kubernetes[5]集群管理系统中用Docker或Rkt[6]作为底层容器.
目前主流轻量级虚拟化技术主要有Docker、OpenVZ[7]和Rkt,它们在实现高效性、隔离性和快速性方面有共性也有异性. 不同云平台应用,对PaaS场景中高效性、隔离性和快速性要求不一样,因此对轻量级虚拟化技术进行技术分析和性能评测显得十分重要. 目前轻量级虚拟化技术没有标准的性能评测标准,Felter等[8]对Docker和Kvm(kernel-based virtual machine)[9]在CPU、内存等方面进行了性能比较,中国存储网对Docker、Rkt、OpenVZ利弊进行对比分析[10]. 本文对Docker、OpenVZ和Rkt在资源控制、隔离性方面进行技术实现分析,对它们在高效性、隔离性和快速性上进行性能评测,并选取Kvm进行实验对比,为PaaS云平台虚拟化技术的选型提供依据和参考指标.
1) OpenVZ. OpenVZ是Linux平台下操作系统级的服务器虚拟化解决方案. 在资源控制方面,OpenVZ通过User Beancounters限制各种内核对象使用,Fair CPU Scheduling实现容器内处理器资源和进程调度,VCPU Affinity控制容器CPU个数,Disk Quotas控制磁盘使用比例,I/O Scheduling实现对I/O分配.
OpenVZ通过Namespaces实现对容器资源隔离,使用PID(proportion integration differentiation)、IPC(inter-process communication)、Mount、Network、UTS(unix timesharing system)以及USER等Namespaces实现资源的隔离,使OpenVZ的容器运行环境相对独立,拥有独立的进程ID、内存段、文件系统、网络和唯一标识的Hostname.
2) Docker. Docker是dotCloud 开源的高级容器引擎. Docker通过Libcontainer中Cgroups实现对资源的控制. Cgroups是Linux内核提供的限制进程资源使用的机制,包含Blkio、CPU、CPUAcct(CPU accounting controller)、CPUSet、Devices、Freezer、Memory、Net_cls(network classid)、Ns(namespace)等控制器,对Docker容器资源使用进行控制.
Docker使用Namespaces实现容器资源隔离,对容器PID,IPC,Mount,Network,UTS进行隔离,由于USER Namespaces中的复杂性,Libcontainer没有实现,用户可通过配置Capabilities、Selinux 、Apparmor 等实现安全隔离.
3) Rkt. Rkt是CoreOS开源的高安全性、高执行效率以及强兼容能力的容器引擎. Rkt运行模式分为Privileged、Container/Cgroups、Virtual Machine三种[6],是可插拔的. Rkt默认运行Container/Cgroups模式,通过Cgroups做资源控制,控制Rkt中Pod对CPU、内存、磁盘I/O等物理机资源使用. 在Privileged运行模式下,Rkt通过Chroot(change root)实现对宿主机资源特定权限的控制,控制Pod对宿主机资源访问. 当应用程序对运行环境有全虚拟化要求时,Rkt支持在Virtual Machine运行模式下通过LKVM(lightweight kernel-based virtual machine)技术实现以全虚拟化模式运行Pod,使其资源控制相对独立.
Rkt在默认运行模式下,使用Namespaces做资源隔离,使Rkt容器的网络、进程等运行在独立的环境中. 用户可选Virtual Machine运行模式代替Container/Cgroups,以全虚拟化的方式运行Pod,使虚拟机拥有独立内核和虚拟机管理程序.
本实验的性能测试指标包括轻量级虚拟化技术的高效性、隔离性和快速性. 高效性测试包括CPU、内存、磁盘I/O、网络四个方面,隔离性测试包括在CPU、内存、磁盘、网络接收、网络发送、Fork Bomb六种压力程序下对同宿主机下其它虚拟机性能影响,快速性针对虚拟机启动速度进行测试. 为了与基于Cgroups和Namespaces技术实现的Docker进行对比,实验中Rkt选择默认Container/Cgroups运行模式,并选取Kvm对比测试. 为保证数据准确性,宿主机为同一台,宿主机系统为Centos 6.7,宿主机CPU、内存、硬盘环境分别为Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz、64G/DDR3 1333、1T/7200,具体性能测试指标和标准检查程序如表1所示.
表1 测试指标与标准检查程序
2.2.1 高效性测试方法
CPU测试:实验选取Intel© Optimized LINPACK[11]进行CPU性能测试,该工具采用高斯消元法求解N元一次稠密线性组来评价其CPU处理性能. 该基准实验是根据用户指定的参数生成一个线性方程组,通过方程的求解时间和计算量来计算CPU的浮点性能. 实验中计算10 000阶的稠密线性代数方程组来评估CPU性能.
内存测试:实验选取STREAM[12]进行内存测试. STREAM是一个组合的基准测试,用来测试持续的内存带宽,包含对内存Add, Copy, Scale和Triad 4种操作测试.
磁盘I/O测试:实验选取IOzone[13]进行磁盘I/O性能测试. 通过IOzone测试不同模式下磁盘的读写性能,包含写、读、重复读、重复写模式下磁盘I/O性能测试. 本实验测试1 GB的大文件,其中每条记录大小为8 KB,对写、读、重复读、重复写磁盘性能进行测试.
网络性能测试:实验选取Netperf[14]进行网络性能测试. Netperf工具以Client/Server方式工作,通过Netserver端侦听Netperf进行网络性能测试. 选取与宿主机同属一局域网的一物理机运行Netperf的Server端,在实验物理机的Native、Docker、OpenVZ和Rkt上分别运行Netperf 的Client端进行网络性能测试.
2.2.2 隔离性测试方法
实验选取StressTests[15]压力测试工具,StressTests包含CPU、内存、Fork、磁盘I/O、网络方面的压力测试程序. 另外,选取Apache Benchmark[16]模拟PaaS应用,根据ab请求所用时间进行定量分析. 在一台物理机上同时建立5个虚拟机(M1, M2, M3, M4, M5),当M1未运行StressTests压力测试程序时,在M2, M3, M4, M5上运行Apache Benchmark模拟PaaS应用,并获取其平均消耗时间t1. 当M1运行压力测试程序时,在M2, M3, M4, M5上运行Apache Benchmark模拟PaaS应用,并获取其平均消耗时间t2. 通过将(t2-t1)/t1的值百分化,定量分析和评估各个虚拟化技术的隔离性能.
2.2.3 快速性测试方法
实验设计一个DefinitionTime Benchmark程序, 该程序分为Server端,Client端,以及辅助程序Hander脚本. 实验中Server端一直启动,用于接收Client端和辅助程序Hander的Post请求,并记录请求时间. 用户通过Hander脚本启动创建虚拟机,并给Server端发送Post请求,记录Post请求时间t1. 当虚拟机启动创建好时执行Client端,发送Post请求给Server端,记录Post请求时间为t2,(t2-t1)为启动创建一个可用虚拟机所需时间.
1) CPU 性能测试. 实验结果如图1所示,Rkt和Docker的CPU性能和Native基本相同,OpenVZ性能损耗10%,Kvm虚拟机性能损耗60%. 因为Rkt和Docker与宿主机共享CPU,OpenVZ中FairCPU Scheduling需性能损耗,Kvm中Hypervisor层对CPU指令进行转换,性能开销大.
图1 CPU测试Fig.1 CPU test
图2 内存测试Fig.2 Memory test
2) 内存测试. 实验结果如图2所示,Docker虚拟机的内存性能与Native几乎一样,Rkt虚拟机内存性能与Native相近,OpenVZ内存性能比Kvm略高,Kvm内存性能损耗17%. 因为基于容器的虚拟化技术能返回未使用的内存给主机或其它容器,使得高效地利用内存,而基于管理程序的虚拟化层执行内存访问指令的转换消耗,造成性能损失.
3) 磁盘I/O测试. 实验结果如图3所示,Rkt磁盘性能与本地最接近,Docker磁盘性能与OpenVZ磁盘性能相似,但是在Read时Docker与OpenVZ性能消耗较多,Kvm性能最差. 因为Rkt文件系统是基于Pod创建,Docker基于AUFS文件系统,实现镜像的写时复制,OpenVZ中Disk Quotas需性能损耗,Kvm在管理层需对磁盘I/O命令进行转换,性能消耗大.
4) 网络性能测试. 实验结果如图4所示,Docker,OpenVZ和Rkt在网络TCP方面的性能与本地接近,因为轻量级虚拟化在网络方面支持都不强,基本都是使用本地I/O. Kvm在网络方面的性能开销较大,由于Kvm中独立于主机的网络I/O,设备驱动需要基于硬件的虚拟化层提供支持,访问网络I/O需要经过一系列转换才能执行.
图3 磁盘I/O测试Fig.3 Disk I/O test
图4 网络性能测试Fig.4 Network performance test
高效性性能测试结果表明,PaaS平台应用对CPU性能有高要求时适合选择基于Rkt的PaaS云平台,对内存性能有高要求时适合选择基于Docker的PaaS云平台,对磁盘I/O有高要求时可以适合选择基于Rkt的PaaS平台,对TCP发送性能有高要求时适合选择基于Docker的PaaS平台,对TCP接收性能有高要求时适合选择基于Rkt的PaaS平台. 不同轻量级虚拟化技术因自身技术实现不同,在高效性上的性能测试表现不同,存在自身的优缺点,用户可以结合对CPU、内存、磁盘I/O、网络性能需求,并根据高效性性能测试结果选择合适PaaS云平台解决方案.
表2 压力测试结果
实验结果如表2所示,CPU 压力测试程序对所有的虚拟化技术都没有影响,这表明Cgroups下CPU子系统和OpenVZ使用的VCPU Affinity都具有很好的CPU隔离性能. 在内存隔离性上,Rkt和Docker都表现不好,而OpenVZ表现较好,说明Cgroups下Memory子系统的控制能力没有User Beancounters好. 所有轻量级虚拟化技术在磁盘I/O和网络I/O压力测试程序下都有影响,因为轻量级虚拟化技术是在操作系统级别上对系统内核和动态用户进程进行支持的虚拟化技术,单个虚拟机在磁盘I/O和网络I/O压力下会对同宿主机其它虚拟机性能表现有影响. Fork Bomb是一个经典的循环创建子进程的测试程序,它会一直创建进程,直到没有可用资源. Fork Bomb的实验结果表明Rkt和Docker存在一定的安全问题,因为Cgroups不能限制容器中的进程总数. 通过实验结果分析可知Kvm的隔离性比较好,因为Kvm虚拟机不与主机共享操作系统内核,适合对内存、磁盘、网络隔离性有高要求的应用部署.
隔离性测试结果表明,OpenVZ是轻量级虚拟化技术中隔离性最好的,适合用于对隔离性有较高要求的PaaS平台构建. 对于轻量级虚拟化技术在隔离性上的不足,用户可以通过减少宿主机上虚拟机的个数来减缓对隔离性的影响,使用户可以利用轻量级虚拟化技术的优势,同时弥补隔离性方面的不足.
表3 快速性测试结果
实验结果如表3,Docker可以在0.1秒级启动创建一个虚拟机,因为Docker是基于系统内核Cgroups和Namespaces实现. Rkt虚拟机创建时间比Docker稍慢,因为Docker容器进程由Docker Daemon守护进程接收命令工具消息进行Fork创建,Rkt容器进程由Rkt命令直接Fork创建,Rkt启动的容器进程从属于执行Rkt的SSHD进程所在的Cgroups,Docker启动的容器进程在一个独立的Cgroups内. OpenVZ能在10秒级启动创建,Kvm需要超过20 s的时间才能完成,因为OpenVZ创建虚拟机时需要镜像拷贝,而Kvm虚拟机有独立系统内核,需要时间进行镜像加载和系统初始化.
快速性测试结果表明,Docker具有最好的快速性,适合用于对快速性有高要求的PaaS平台构建. 对于其它虚拟化技术在快速性方面的不足,用户可以通过提升宿主机硬件的方式提升快速性性能.
分析Docker,OpenVZ和Rkt轻量级虚拟化技术在资源控制和隔离方面的技术实现,并对它们在高效性,隔离性和快速性方面进行测评. 实验表明,OpenVZ具有较好的高效性,良好的隔离性,但快速性较差,适合对隔离性有高要求的PaaS场景; Docker具有很好的高效性,隔离性较弱,最好的快速性,适合对快速性和高效性有高要求的PaaS场景; Rkt具有最好的高效性,隔离性很弱,最好的快速性,适合对高效性有很高要求的PaaS场景; Kvm具有强隔离性,高效性和快速性表现较差,适合对隔离性有很高要求的场景. 研究结果对PaaS平台轻量级虚拟化技术选型具有重要参考意义.
随着基于轻量级虚拟化的PaaS云平台的高速发展,传统应用部署难、迁移难、维护难等问题的日益突出,越来越多大数据相关应用开始部署在基于轻量级虚拟化技术构建的PaaS平台上. 利用本文对面向PaaS平台的轻量级虚拟化技术的研究成果,用户可以根据应用在高效性、隔离性、快速性上的权重选择合适的PaaS平台. 例如,分布式计算框架对高效性和快速性要求高,适合将计算框架打包成Rkt镜像,使计算框架可以在基于Rkt的PaaS平台上大规模快速启动部署与快速停止部署; 企业门户网站对稳定性要求高,高效性要求弱,为了减少应用部署在PaaS平台上其它服务对其干扰,对隔离性有一定要求,适合选择基于OpenVZ构建的PaaS平台进行部署.
未来工作将研究测试不同宿主机操作系统中各轻量级虚拟化技术的性能表现,并针对Docker中不同文件管理系统中的各项性能进行评测,对Rkt中不同隔离机制下的性能表现进行对比分析.
[1] 林闯,苏文博,孟坤,等. 云计算安全:架构,机制与模型评价[J]. 计算机学报,2013,36(9):1 765-1 784.
[2] 王亚玲,李春阳,崔蔚,等. 基于 Docker 的 PaaS 平台建设[J]. 计算机系统应用,2016,25(3):72-77.
[3] MORABITO R. A performance evaluation of container technologies on Internet of things devices[C]//Computer Communications Workshops. San Francisco :IEEE,2016:999-1 000.
[4] 于烨,李斌,刘思尧. Docker 技术的移植性分析研究[J]. 软件,2015 (7):57-60.
[5] 龚正,吴治辉,叶伙荣, 等. Kubernetes权威指南:从Docker到Kubernetes实践全接触[M]. 北京: 电子工业出版社, 2016.
[6] Rkt 官方帮助文档[EB/OL]. (2014-11-27)[2016-04-01]. https://www.coreos.com/rkt/.
[7] BABU A,HAREESH M J,MARTIN J P,etal. System performance evaluation of para virtualization, container virtualization, and full virtualization using xen, openvz, and xenserver[C]//Advances in Computing and Communications. Cochin:IEEE,2014:247-250.
[8] FELTER W,FERREIRA A,RAJAMONY R,etal. An updated performance comparison of virtual machines and linux containers[C]//Performance Analysis of Systems and Software. Philadelphia:IEEE,2015:171-172.
[9] 任永杰. KVM虚拟化技术实战与原理解析[M]. 北京:机械工业出版社,2013.
[10] 中国存储网. 三大容器之战Docker、Rocket/Rkt 和OpenVZ/Odin[EB/OL]. (2015-08-14)[2016-06-18]. http://www.chinastor.com/a/jishu/docker/0Q41A2H015.html.
[11] Intel© Optimized LINPACK官网[EB/OL]. (2013-09-27)[2016-04-16]. https://www.software.intel.com/zh-cn/articles/intel-mkl-benchmarks-suite.
[12] STREAM官网[EB/OL]. (2016-02-22)[2016-04-17]. http://www.cs.virginia.edu/stream/.
[13] IOzone[EB/OL]. (2016-01-23)[2016-04-26]. http://www.iozone.org/.
[14] Netperf[EB/OL]. (2015-06-21)[2016-05-10]. http://www.netperf.org/netperf/.
[15] StressTests[EB/OL]. (2007-01-14)[2016-05-16]. http://www.web2.clarkson.edu/class/cs644/isolation/index.html.
[16] Apache Benchmark[EB/OL]. (2015-12-20)[2016-05-29]. http://www.httpd.apache.org/.