立刻停止使用AUFS,开启Overlay!


声明:本文转载自https://my.oschina.net/kernalsky/blog/1600560,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

在大多数Ubuntu系统上,Docker的默认文件系统是AUFS.

别用它,用Overlay吧,下来我告诉你为什么。

首先,补充一下背景,我在POWER服务器上测试基础的LAMP环境的性能(LAMP代表Linux+Apache+MySQL/MariaDB+PHP)。为了能做更可靠和重复性的测试,我在Docker容器里构建了这个环境。

每次测试会下载Apache , MariaDB和PHP的源码并且编译。这个过程应该很快,我使用的POWER 8服务器有160个硬线程以及128GB内存,但是我发现构建的速度和一个BlueMix云上的2核Intel虚拟机一样。

为什么?我第一件事就是在<code>top</code>下观察编译的过程。<code>top</code>的头部信息是以下这样:
![图1](https://mmbiz.qlogo.cn/mmbiz/ibxUwW9RpKkjpCTCWVmN00mfwHItIHwTlcSd0YjMbhzxGNKarNdAtjL21cKC7Z5n846nmXKria6WVr7QEg4DibZww/0?wx_fmt=png)


显示超过70%的CPU时间都花在内核上了?那样非常奇怪,我们深入研究一下。

接下来我想到的是使用<code>perf</code>来分析CPU的负载细节。<code>perf top</code>结果显示说大量的时间花费在自旋锁上:
![图2](https://mmbiz.qlogo.cn/mmbiz/ibxUwW9RpKkjpCTCWVmN00mfwHItIHwTlccFDpicrlsMTGYlJqqjGEd1qs8XXt9QNT9Q5sFtfwh7OY7IpPOK1EfA/0?wx_fmt=png)

<code>perf top -g</code>给出了更多信息:那些时间是花费在了系统调用上,<code>open()</code>和<code>stat()</code>是罪魁祸首,我们还能看到一系列的系统方法在自旋锁的调用链上。

![图3](https://mmbiz.qlogo.cn/mmbiz/ibxUwW9RpKkjpCTCWVmN00mfwHItIHwTlSHkPne3N3KHzrPs2A5ictNqqfrQnRvLeRyGCDhvfJjIgBd4HUSm6Enw/0?wx_fmt=png)

为什么<code>open</code>和<code>stat</code>调用慢?我知道那些文件被挂载到AUFS上(如果你不确定,用<code>docker info</code>命令能看到)。那么,作为一个内核黑客,我决定继续寻根问底了,这个过程并不顺利。AUFS已经过时了,它是一组独立的补丁包,很多Linux发行版多年来都尝试去废弃它,实际上,红帽企业版并没有内置安装它(多亏了红帽,Docker似乎也有不再支持它的迹象)

想要远离这个恶梦的一个方法是使用其他的补丁包,我查看了一下Docker支持的其他文件系统,找到这个[PPT](out-of-tree patchset)非常好。我的选项非常简单:AUFS,btrfs,device-mapper或者Overlay。Overlay是一个不二的选择,它不需要我在云端的虚拟机上安装device mapper,或者像btrfs那样需要重新格式化。

它在Ubuntu上安装也很简单:

- 把你需要的docker容器用export或save命令备份到文件

- 在<code>/etc/default/docker</code>文件里的<code>DOCKER_OPTS</code>选项中添加<code> --storage-driver=overlay</code>,然后重启docker(使用<code>service docker restart</code>)

- 是用import或load命令把之前导出的容器重新导入。

- 验证一下一切是否正常,然后就可以把旧的储存路径删除掉了(<code>/var/lib/docker/aufs</code>)

我转移了我的容器后,我开始了另一次编译。

我首先注意到的是在Overlay上构建镜像缓慢了许多,但是一旦构建完成,开始编译之后,一切都有飞跃般的加速:

![图4](https://mmbiz.qlogo.cn/mmbiz/ibxUwW9RpKkjpCTCWVmN00mfwHItIHwTlaHU3ib2ibunqUBvcagh75vB4tX8MMDLJoXPLHBvPqHick9rUCutMCO2QQ/0?wx_fmt=png)

这些编译任务的过程从蜗牛那样慢变得像火箭那样快~完胜!

结论:

- 如果你用Docker来执行那些会产生大量的<code>open()</code>和<code>stat()</code>这种系统调用
- 如果你想要你的机器能真正的工作,而不是在自旋锁里转不出来
- 如果你想要用上更跟得上潮流的能被支持得更好的组件
- 如果你想用上比btrfs或者device mapper这些更省事的文件系统

那么现在就抛弃AUFS,切换到Overlay吧。

本文发表于2018年01月02日 16:32
(c)注:本文转载自https://my.oschina.net/kernalsky/blog/1600560,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1722 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1