全栈算力,加速行业AI落地 了解详情
写点什么

Docker 在云环境中的应用实践初探:优势、局限性与效能评测

  • 2014-11-10
  • 本文字数:4558 字

    阅读完需:约 15 分钟

本文依据笔者所在团队的一些近期开发和应用的实践,整理出一些有意义的信息,拿出来和社区分享。其中既包括在云端应用 Docker 与相关技术的讨论,同时也有实施过程中的一些效能评测,以及整个过程中遇到的一些国内特有的问题和我们的一些解决方案,想法。希望可以给方兴未艾的 Docker 用户群体和社区,提供一些有价值的参考,并引出有意义的讨论。

背景简介

Docker 以及一系列与之相关的容器化的技术,经过多年的积累,在过去数月间得到了迅速的市场流行和关注,可谓厚积薄发。一方面是因为容器技术本身的优点,比如更节省测试,部署,弹性扩容和运维的成本及资源,另一方面也是由于业界的重要公司都十分重视并且投入容器虚拟技术,比如 Google、RedHat、IBM、Facebook、Amazon 以及微软。其中微软开放技术作为微软在开源社区领域的主要参与者,一直以来都积极的跟踪容器基础上的虚拟化技术,并且积极参与到相关的开源项目中,比如今年夏天宣布的由微软开放技术参与的,在微软公有云环境下对 Google 的 Kubernetes 和 Docker 的 libswarm 支持。我们已经成功把Kubernetes 和libswarm 引入到Azure,使得容器技术超越简单部署迈向更加复杂拓扑的云端。

2014 年 10 月 15 日, Docker 公司刚刚在美国与微软共同宣布,双方展开战略合作,在即将发布的Windows Server 中,将为发展迅速的Docker 分布式应用开放平台的全新容器技术提供支持。利用Docker 技术开发容器应用的开发者与企业,将得以在Windows Server 或Linux 平台上共享快速成长的Docker 生态系统,充分利用其中的用户、应用和工具等资源。

Docker 在实际应用中的一些问题和局限性

之前有文章讨论过,基于容器的云现在还没有成为主流,主要还是安全性的问题。但是我们在整个实验中也总结出一些在真实环境中遇到的安全性之外的问题。

第一个就是很重要的Docker Hub 的访问问题。我们知道国内访问一些海外的网站有时候会有稳定性的问题。Docker Hub 在我们的实践中就经常出现访问不了的问题。但这种访问的问题并不是持续的,而是时有时无。由于大量的成熟Docker 映像(image)都需要从Docker Hub 下载,很多脚本在执行到这一步时,结果很难预料。一种方案是修改缺省的Docker Hub 地址,改为采用国内的一些镜像(mirror)。但是在没有官方认证的成熟稳定的镜像网站时,Docker 映像的更新不容易得到保证;另一种方案是自行搭建自己的Docker Hub。但是一来这样就失去了强大的社区贡献的映像资源,二来要花费很多精力来保持更新和同步。容器技术带来的简单化,又因为映像管理而复杂化,得不偿失。

第二个就是容器技术的资源管理和运维。因为容器技术本身更适于解决大规模应用场景,所以通常都是集群基础上的部署、运维,但是目前对这一系列任务的自动化处理尚无统一的或者标准的框架。如果要让Docker 真正在实际环境中发挥最大的效能并且易于维护,就需要有很成熟稳定的资源编排(orchestration)、资源调度(scheduling)和部署(deployment)的支持,但是这方面暂时还没有很明显的最佳解决方案,所以大多数人都在摸索和搭建自己的解决方案。我们在微软开放技术内部也是在一些开源技术的基础之上,自行开发了容器在微软公有云Azure 上的资源管理调度和部署运维的系统,传统上的开发运维和持续集成,持续部署的技术,比如Chef,Puppet,Jenkins 等,都可以很容易的与容器技术一起工作。

市场上还有很多的一些比较有希望的相关新技术,比如Twitter 的Apache Mesos,Facebook 的Tupperware,Docker 自己的libswarm,以及Google 的Kubernetes。其中Kubernetes 因为在Google 经历了数年的实战检验,加上最近微软、RedHat、IBM 和Docker 等也都宣布支持参与此项目,使得Kubernetes 有着很好的前景。

第三个是个对用户有益,但是对公有云运营商带来挑战的问题。因为实际评测中发现,同样的应用和负载,相比原有的虚拟化场景,容器化部署的资源花费通常只有10% 甚至1%。意味着某些场景下的应用如果迁移至容器环境,用户会大量节约成本,从而促进用户向云环境迁移的意愿,但同时也给云服务商IaaS 服务带来新的挑战。

基于特定场景的Docker 效能评测与分析

微软开放技术一直以来积极参与容器技术,不但在微软的公有云平台实现了对Docker 的支持,而且我们内部的很多项目也开始积极采用或者迁移到Docker 环境中。其中有一个项目,早期是利用原有的虚拟化技术,在云平台上通过部署与启动大量虚拟机,来达到对多用户同时在线提供弹性的云服务。由于项目的设计和要求,需要做到用户的环境隔离,所以基本上一个用户需要有一个对应的虚拟机。当服务需求达到高峰时,需要部署和启动大量的Linux 虚拟机。这带来了显著的资源开销,并且在云环境下最终转换为等价的成本开销。由于虚拟机的启动是由需求动态驱动的,对终端用户来说启动时间也造成了用户体验的下降。

针对这一问题,我们在第一时间就开始尝试Docker 基础上的容器技术。但是针对我们的特定应用场景,需要评估一下效能,以及功能上是否达到甚至好于原有虚拟机架构基础上一样的要求。功能和效能的测试思路描述如下:

功能测试。我们采取将原有的多个虚拟机的集群部署,改为在少量的虚拟机上的Docker 容器集群,即原来的一个虚拟机上的所有的代码和库,都转制生成完全对应的Docker 容器,基本上一对一。例如原来是8 个不同角色和任务的虚拟机节点组成的集群,转化为8 个不同角色和任务的Docker 容器。端口映射到宿主虚拟机的不同端口,进而通过云服务面向互联网公共端口。整个容器基础上的集群启动运行后,经测试,功能上和原有的虚拟机集群没有任何区别。

效能测试。我们并不做性能测试(benchmark),因为我们相对于极值,更关心在模拟实际应用部署场景时的次序,资源的利用效率和容量。因为实际场景中,每一个新的节点的生成需求并不是同步和同时的,所以我们的模拟生成频率是每隔数秒启动一个预制的容器,每个容器映像预装了一个最简单的python 脚本,启动运行后,持续的循环做很简单的基本运算,使得单个容器的CPU 平均使用量大致与我们实际应用时实测的真实应用的CPU 使用量相当,在0.1%-0.9% 之间。

测试环境:

宿主的虚拟机配置:1 core, 2GB RAM, 20GB HD, 入门级的低端配置。

Docker 映像尺寸:500MB, Ubuntu 14.04,with ssh, ruby, python and a simple application

对应的虚拟机映像尺寸:5GB (对应 Docker 和 VM 尺寸大概有一个数量级差别)

当 Docker 映像下载到本地后,启动一个容器耗时不到 1 秒,和云端虚拟机的启动动辄 1-2 分钟甚至更久基本上不在一个数量级。

容器启动后,无延迟,立即可以使用。

首先监测随启动的容器总量增加,可用内存的递减规律。结果如下图(y 轴单位 kB,x 轴容器实例数),在 200 个容器以内,内存耗费基本呈线性。并且 Docker 并未将映像的所有内容都加载到内存。

再监测单个容器平均占总内存百分比随容器增加的变化。如下图(y 轴单位 %,x 轴容器实例数),前 20 个容器平均内存开销虽然较小,但是波动较大,之后是相对均匀区域,有小量增长,但是波动被平均化了。当继续增加到约 150 时,平均花费和波动都开始增加,显示额外开销(overhead)加大,波动也增大到无法被平均值平滑了。具体的研究也与此一致,从 150 个容器开始,开始出现不可用,无反应或者无法杀掉的僵尸容器(Zombie)。升至 200 时我们平均录得 6 个僵尸容器。所以在我们这个特定的配置,场景和环境下,可以认为 150 是个资源分配上的有效极值。

在从零到 200 个容器实例的部署启动过程中我们监控了此一过程中的 CPU 使用情况。由于我们的容器尚未附加大量工作负载,所以这个数据反应的的是基准 CPU 开销(baseline)。结果如下图,由宿主环境录得的数据显示(y 轴单位 %,x 轴为容器实例数),在单一宿主环境下启动容器的 CPU 开销很小,200 个容器时也基本在 5-6% 以下。而且在此区间内随部署容器的增加,CPU 花费基本呈线性。

由于时间所限,我们暂时还没有对网络带宽花费做测试,这将在后续的工作中逐步完成。但是基于经验估算,假设一台宿主机的带宽为 1000M bps,当被大量共享时实际可用带宽不到 70%,再折算为 Bps,并考虑 HTTP 的额外开销之后,实际可用带宽约 60MBps,分到 200 个同样的容器,每个容器的现实带宽大概只有 300K Bps。这对一般的网站或网络应用是基本够用,但是高峰和一些消耗带宽的应用就需要认真测算。

结果讨论

综上所述,在云计算环境用户主要关注的资源——CPU、内存、存储、网络带宽四大要素中,在一定范围内,增加同质容器实例的数目时,资源的耗费基本为线性。所以如果要做优化的资源调配,需要进行单个应用的平均和峰值评测,结合负载的模式(pattern),来计算最有可能先达到瓶颈的资源,并以此为上限优化资源调配算法。由于异源容器应用实例的不确定性,最有效的部署方式是同源的容器应用实例,尽量部署到同样的宿主环境,因为这样可以相对精确的取得单个容器实例的平均资源花费,从而作为经验参数代入资源配置的算法里,得到优化的结果。

此外在架构层面,由于对资源使用效率要做精细化分配,不同角色的模块,扩展曲线会有很大不同,所以建议松散耦合,按角色、堆栈层分离模块,分别做标准的分布式部署,以达到最大效能。比如标准 MVC 网站架构,可以将所有模块打包到一个容器映像,部署和扩容时会很简单。但是如果要最大化资源利用效率,应当数据层,应用层和网络服务器层分开建立容器映像,分开部署,独立扩容。当然这就需要更有效的工具和框架的帮助来实现。

总结

我们在微软公有云环境下的对 Docker 现实场景的应用实践,使我们得到了从用户角度出发,在类似场景下应用时可能遇到的问题及第一手资料。经过对某些特定场景下的资源利用效率评测,也更好的了解了以 Docker 为代表的容器化技术的适应对象和需要关注的问题。微软开放技术会一如既往的持续加大对容器技术的研发和投入。并希望和国内的开源社区一起推动容器技术的应用,使这项可以为用户节省大量资源的技术能在更多的产品环境中和应用场景中真真正正得到广泛而持久的应用。

进深阅读

作者介绍

商之狄,现任微软开放技术(中国)首席项目经理,从事开源技术、云计算和大数据相关的新技术研发与推广工作。商之狄曾在美国硅谷的start-up、互联网及电子商务领域工作多年:曾参与过用超级计算机进行最早的人类基因组全注释;用机器学习、并行计算和计算机视觉技术帮助全球最大的制药公司从数百万潜在药物中快速筛选抗癌新药;参与开发过语义基础上的垂直搜索引擎;在全球最大的支付企业技术研发部进行超高通量交易和欺诈检测业务向大规模云环境迁移的试验。在全球最大零售企业的电子商务部门任资深架构师时,领导开发了大数据基础上的全自动精准在线推广营销系统。


感谢杨赛对本文的策划和审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-11-10 07:476186

评论

发布
暂无评论
发现更多内容

当在线纠纷解决遇到区块链:去中心化司法的诞生

CECBC

更新丨织信Informat V1.12:审批流通知支持移动端打开链接,一键实现快速审批

优秀

低代码开发

QT读取剪切板内容-实现复制粘贴文本和图片

DS小龙哥

3月月更

区块链技术如何赋能公共资源招采管理服务?

CECBC

掌握《网络》,见微才能知著

蔡农曰

TCP https 网络 HTTP TCP/IP

模块九:毕业设计

黄秀明

「架构实战营」

自己动手写Docker系列 -- 4.3实现volume数据卷

Docker

常见的社群玩法盘点,你做的是哪一种?

源字节1号

开源 社群

电路模型和电路定律(Ⅰ)

謓泽

3月月更

自己动手写Docker系列 -- 4.4实现简单镜像打包

Docker

模块九秒杀作业

novoer

「架构实战营」

架构师实战营王者荣耀商城异地多活架构设计

刘洋

#架构实战营 「架构实战营」

云上业务配置选型的一些小Tips

穿过生命散发芬芳

3月月更

模块5作业-”微博评论“的高性能高可用计算架构

卡西毛豆静爸

「架构实战营」

优秀程序员的30种思维--技术执念篇(22/100)

hackstoic

技术思维

元宇宙时代的5大风险

CECBC

B端/C端中,产品or运营哪个更重要?

源字节1号

运营

LabVIEW实现CRC校验

不脱发的程序猿

LabVIEW CRC校验

自己动手写Docker系列 -- 4.2使用AUFS包装busybox

Docker

Redis缓存应用—旁路缓存和数据一致性

javaadu

redis 缓存

《不敢止步》--读书笔记

stars

架构实战营毕业总结

novoer

「架构实战营」

一个LabVIEW控件,生成模拟波形效果

不脱发的程序猿

数据可视化 LabVIEW 生成模拟波形效果

一个用于学习KVM的迷你虚拟机

ScratchLab

虚拟机 虚拟化 kvm VT-x

自己动手写Docker系列 -- 4.1使用busybox创建容器

Docker

RabbitMQ 的五种消息模型

Ayue、

RabbitMQ 3月月更

架构学习总结

tony

「架构实战营」

聊一聊C语言位域/位段

不脱发的程序猿

C语言 嵌入式开发 位域/位段

2万字详解测试金字塔

俞凡

最佳实践 测试 研发效能

从简单代码入手,分析线程池原理

架构 线程池 池化思想

ICT的圣杯(三):产业融合的技术乐章

脑极体

Docker在云环境中的应用实践初探:优势、局限性与效能评测_最佳实践_商之狄_InfoQ精选文章