容器性能剖析从三个方面,容器存储,逻辑隔离,性能隔离。
1.容器存储
使用Storage Driver有些需要在跟Backing Filesystem有关的
根据查阅资料可知总体上,overlay要比aufs和device mapper快一点,在某些场景下甚至比btrfs快。下面是对overlay性能影响较大的几个方面:
- 页缓存(page caching):overlayfs支持页缓存的共享,这意味着多个使用同一文件的容器可以共享同一页缓存,这使得overlayfs具有很高的内存使用效率;
- copy-up操作:overlay的拷贝操作工作在文件层面上,也就是对文件的第一次修改需要复制整个文件,这回带来一些性能开销,在修改大文件时尤其明显。
但overlay的拷贝操作比aufs还是快一点,因为aufs有很多层,而overlay只有两层,所以overlay在文件的搜索方面相对于aufs具有优势。
- i节点限制:使用overlay作为storage driver会消耗大量的i节点,随着镜像和容器数量的增长这种消耗尤其显著,这在一定程度上限制了overlay的使用。
本文是将bind mount与上述容器存储解决方案进行实验对比
mount 的 bind 选项将第一个目录克隆到第二个。一个目录中的改变将会在另一个中出现 — 毕竟,它是同一磁盘上的同一个块。
使用 bind 与对同一设备进行两次挂载的区别在于:您可以挂载子目录而无需挂载整个文件系统。
2.逻辑隔离:namespace
用namespse进行NET,UTS,IPC,PID划分并且给出了部分操作的结果,提现了工作量
3.性能隔离:cgroup
本文通过对cgroup创建多个实例进行对比
通过上述实验
作者结论使用bind挂载方式,使用开销小的chroot来替代mnt ns,并没有说明使用其他cgroup技术。
作者寻找了公用的python page包使用比例进行优化
作者基于上述实验和构想提出了SOCK容器runc
存储使用bind mount 通信用了unix domain socket通信,用namespace进行隔离
然后通过预加载python包的方式进行容器优化。
主要实现使用Zygotes机制这样的机制会增大内存开销,会加速运行速度 .
Zygotes机制
ZygoteInit 主要完成 4 项工作:
1.注册一个 Socket。Zygote 是一个孵化器,一旦有新程序需要运行时,系统会通过这个 Socket 在第一时间通知它孵化一个进程
2.预加载各类资源(类比于此处加载python包)
3.启动 SystemServer。Zygote 只会初始化一次,因此它需要新建一个专门的进程来承载系统服务的运行
4.进入死循环,不断地处理 Socket 请求
由此可以知道,Zygote 主要是通过 Socket 来处理客户端的请求的。