Docker容器:更小不一定更好

本文讲的是Docker容器:更小不一定更好,【编者的话】按正常逻辑来说,我们应该选择体积较小的Docker容器。然而事实是,体积小却并不一定能带来性能上的优势。本文将介绍一个使用了一个体积稍大一点的容器,从而将性能提高30倍以上的例子。

按道理来说,我们应该选择体积较小的Docker容器。然而事实是,体积小却并不一定能带来性能上的优势。本文将介绍一个使用了一个体积稍大一点的容器,从而将性能提高30倍以上的例子。

摘要

当使用grep来处理大量的数据的时候,busybox中带的grep速度慢的让人痛苦。 解决之道是向容器添加一个(真正的)grep

背景

『Raspberry Pi中实现简单的亚结构匹配』一文中,我试图找到Raspberry Pi处理数据的极限。我选择使用亚结构的搜索作为课题,因为其充满挑战,并且是一个展示Pi中并行worker的处理能力的好例子。

我对NIM(_National Institutes of Health_,美国国立卫生研究院)的PubChem Compounds数据库中的数据做了预处理,然后抽取出SIMLES(_Simplified molecular input line entry specification_,简化分子线性输入规范)数据,这是一种描述化学合成物的语言。作为我首次十分不成熟的实现,我用grep来匹配亚结构。我把文件分拆到5个Pi,每个都会处理大约730个文件,约840M的数据,我然后用xargs实现多核并行处理。跑了几次后,所有的数据会被读到缓存中,然后Pi可以在1-2秒内处理完毕,以备实时的搜索。在1300万数据中找出所有含碳的化合物只需要花8-10秒,这相当不可思议。

在找到了解决方法后,我试着将它搬进Docker。

我选择使用voxxit/alpine-rpi来作为基础镜像 - 它相当小,大概只有5M,几乎包含所有需要的东西。但我发现其带的xargs不支持-P选项,因此我添加了xargs

apk --update add findutils

我测试了下,可是发现性能糟透了。于是我决定打开shell亲自试试,然后做一些优化。这是优化之前的性能:

/opt/smiles # date;time /bin/ash -c " ls | xargs -P 4 -n 50 grep -h 'C1CCCCC1C=O'| wc -l ";date
Sun Apr 19 14:25:54 GMT 2015
19
real    1m 4.21s
user    3m 57.52s
sys 0m 3.52s
Sun Apr 19 14:26:58 GMT 2015

正常情况下大量的IO操作的性能在跑了几次后会得到改善,系统能缓存下读到的数据。通常,3次循环就能让所有的数据缓存下来。然而,上面的数据并没有得到改善。

经过验证,我发现多核的并发确实是被用到了。

我继续往下探究,检查IO和VM的数据。发现真是糟透了!在这个时候我开始在Google查找Docker是否使用磁盘缓存,看看我是否漏掉了或者多添了某个参数。我确实不相信Docker使用的IO能慢到那种程度,而我一直是一个坚信想法都该去证实一下的人。

在查看了/proc/sys下面的内容,并且Ddocker之外试了搜索后,我决定是否我该使用一个更快的grep,结果,该容器使用了busybox:

/opt/smiles # ls -li /bin/grep
501101 lrwxrwxrwx    1 root     root            12 Mar  6 13:27 /bin/grep -> /bin/busybox

从体积小来看,这通常确实是一个很好的选择。然而,其携带的grep要慢许多。突然我好像柳暗花明,我决定安装下grep

/opt/smiles # apk search grep
ngrep-1.45-r1
grep-doc-2.20-r1
grep-2.20-r1
/opt/smiles # apk --update add grep
fetch http://repos.lax-noc.com/alpine/v3.1/main/armhf/APKINDEX.tar.gz
(1/2) Installing pcre (8.36-r1)
(2/2) Installing grep (2.20-r1)
Executing busybox-1.22.1-r14.trigger
OK: 6 MiB in 18 packages
/opt/smiles # which grep
/usr/bin/grep
/opt/smiles # ls -li /usr/bin/grep
66417 -rwxr-xr-x    1 root     root        189840 Feb  2 11:05 /usr/bin/grep

我然后重新运行测试,对着出来的结果,我高兴的都想出去跑三圈。

bash
/opt/smiles # date;time /bin/ash -c " ls | xargs -P 4 -n 50 grep -h 'C1CCCCC1C=O'| wc -l ";date
Sun Apr 19 14:30:35 GMT 2015
19
real    0m 1.81s
user    0m 4.39s
sys 0m 2.38s
Sun Apr 19 14:30:36 GMT 2015

吸取到的教训

这件事情再次印证了对常识进行质疑的必要性。在这里的常识是,更小体积的容器那绝对是更好。我相信了体积更小,更轻量的容器是一个好的实践,应该遵循。然而,验证结果证明更小不一定更好。

我也有在下载一个容器之前检查Dockerfile的习惯,在这里这却不够。这也同时提醒我,在使用容器之前需要清楚里面运行的是什么。

原文链接:Docker Containers: Smaller is not always better(翻译:钟最龙 校对:李颖杰)

原文发布时间为:2015-05-06

本文作者:kurtzhong 

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:Docker容器:更小不一定更好

时间: 2024-09-22 04:06:56

Docker容器:更小不一定更好的相关文章

微容器:更小的,更轻便的Docker容器

本文讲的是微容器:更小的,更轻便的Docker容器,[编者的话]本文介绍了微容器的概念和好处,并用一些例子介绍了如何构建微镜像,从scratch到Alpine Linux,并推荐了一些已有的基础微镜像,方便为几乎所有主流语言的应用构建微镜像.本文也指出了构建微镜像的基本原理:将构建时依赖和运行时依赖分开,构建时所用的镜像包含所有构建所用的工具,它可以比较大,但运行时的基础镜像应该仅包含运行时依赖.使用微容器,no going back! Docker 使你能把你的应用和应用的依赖打包到一个良好的

如何优化Flash动画,使文件更小,播放更流畅?

flash动画|优化 Flash作为Macromedia公司出品的网页制作与动画创作的专业软件,操作简便,功能强大,现已成为交互式矢量图形和Web动画事实上的标准. 但是,如果制作的Flash电影文件较大,动辄几百k的话,常常会让网上浏览者在不断等待中失去耐心.对Flash电影进行优化就显得很有必要了,但前提是我们不能有损电影的播放质量. 1.多使用符号(Symbol).如果电影中的元素有使用一次以上者,则应考虑将其转换为符号.重复使用符号并不会使电影文件明显增大,因为电影文件只需储存一次符号的

容器生态系统 - 每天5分钟玩转Docker容器技术(2)

对于像容器这类平台级别的技术,通常涉及的知识范围会很广,相关的软件,解决方案也会很多,初学者往往容易迷失. 那怎么办呢? 我们可以从生活经验中寻找答案. 当我们去陌生城市旅游想了解一下这个城市一般我们会怎么做? 我想大部分人应该会打开手机看一下这个城市的地图: 城市大概的位置和地理形状是什么? 都由哪几个区或县组成? 主要的交通干道是哪几条? 同样的道理,学习容器技术我们可以先从天上鸟瞰一下: 容器生态系统包含哪些不同层次的技术? 不同技术之间是什么关系? 哪些是核心技术哪些是辅助技术? 首先得

容器 What, Why, How - 每天5分钟玩转Docker容器技术(6)

容器核心知识 本篇通过 Docker 讨论容器的核心知识. 概述 容器核心知识主要回答有关容器 What.Why 和 How 三个问题.其中 How 是重点,将从架构.镜像.容器.网络和存储几个方面进行讲解. What - 什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行.开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机.物理服务器或公有云主机上运行. 容器与虚拟机 谈到容器,就不得不将它与虚拟机进行对比,因

Docker多步构建更小的Java镜像

本文讲的是Docker多步构建更小的Java镜像[编者的话]最新版Docker将支持多步构建(Multi-stage build),这样使用单个Dockerfile就可以定义多个中间镜像用于构建,测试以及发布等多个步骤,并且有效减小最终镜像的大小. [深圳站|3天烧脑式Kubernetes训练营]培训内容包括:Kubernetes概述.架构.日志和监控,部署.自动驾驶.服务发现.网络方案等核心机制分析,进阶篇--Kubernetes调度工作原理.资源管理及源码分析等. Github仓库: aru

创建尽可能小的 Docker 容器

当我们在使用 Docker 的时候,你会很快注意到你正在下载很多 MB 作为你的预先配置的容器.一个简单的 Ubuntu 容器很容易超过 200 MB,并且随着在上面安装软件,尺寸在逐渐增大.在某些情况下,你不需要任何事情都使用 Ubuntu .例如,如果你只是简单的想运行一个 web 服务,使用 GO 编写的,没有必要围绕它使用任何工具. 我一直在寻找尽可能小的容器入手,并且发现了一个: docker pull scratch scratch 镜像是完美的,真正的完美!它简洁,小巧以及快速.它

【教程】如何创建尽可能小的Docker容器

本文讲的是[教程]如何创建尽可能小的Docker容器,[编者的话]本文作者以一个使用Go语言编写的Web服务为例,重点介绍了如何通过Scratch创建一个尽可能小的Docker容器.在尝试过程中,作者也发现了很多问题,也逐一得到解决,感兴趣的读者一定要看看作者解决问题的思路.本文看点包括如何从Docker内部调用Docker.创建Docker容器的Docker容器.Go语言创建静态链接的可执行文件. 当在使用Docker的时候,如果想使用预先配置好的容器,就需要下载很大的镜像包.一个简单的Ubu

Docker植根中国:镜像服务更快、更稳定

Docker容器一经出现,就因其可移植性.不依赖于任何基础设施,而为大量开发人员所喜爱.我们也看到,在经过几年发展的,Docker现在已经成为了容器的事实标准.那么回首过去,Docker最初价值在哪,它是否已经实现了呢? Docker价值所在 整个容器的风潮是由Docker公司所掀起的,对于他们来说,在是最初推出Docker时,是希望能给用户带来哪些便利,解决哪些问题? Docker中国区总经理张峻回答说,"我认为我们最大的价值是在实现软件供应链的现代化." 意思是说,Docker希望

[译] 如何在无损的情况下让图片变的更小

本文讲的是[译] 如何在无损的情况下让图片变的更小, 原文地址:Making Photos Smaller Without Quality Loss 原文作者:Stephen Arthur 译文出自:掘金翻译计划 译者:Xat_MassacrE 校对者:meifans,windmxf 如何在无损的情况下让图片变的更小 Yelp(美国最大点评网站)已经有超过 1 亿张用户上传的照片了,其中不但有晚餐.理发等活动的照片还有我们的新特性照片 -- #yelfies(一种在拍摄时,加上自拍头像的一种新的