Jesse's Blog
Stay Hungry,Stay Foolish.
ATC18——容器优化方案SOCK
serverless论文总结系列#3

ATC18——容器优化方案SOCK

这是一篇优化容器冷启动的文章

论文链接:https://www.usenix.org/conference/atc18/presentation/oakes

解构container(docker瓶颈)

  • Bind mount可能比AUFS(或overlay)性能更好
  • 频繁的container创建和删除(涉及到频繁的namespace的创建和删除,可能会有性能瓶颈,比如network namespace,并发的creation和cleanup越多延迟越高),是不是可以把一些不必要的namespace隔离给剔除或者进行一些优化(disable创建或删除时不必要的影响性能的功能)
  • 频繁的创建和删除cgroup不如reuse cgroup,比如维护一个初始化好的cgroup池
  • 当host上挂载的越多,mount namespace拷贝的速度就越慢,简单的做法可以考虑使用chroot

SOCK优化方案

  • Lean containers:

    • 用bind mount代替overlay,分四层:系统层(base),package层(read-only,用来package caching),code层(lambda代码),scratch层(就是container layer,可写层)
    • 用cgroup pool来分配在container创建时分配cgroup,container删除时重新回到池中
    • 将mount namespace和network namespace省去,其瓶颈在docker瓶颈中已提到
  • Zygote机制:

    Zygote container就是一些已经预import需要的package的容器,内含Zygote进程,这样从这个进程fork出的新进程(子进程)并创建出的新容器不需要做重复性的初始化工作,直接从内存读相同的内容就好了,也就是:

    含Zygote进程的container–>含从Zygote fork出的子进程的container

  • 三级缓存:

    • handler cache:

      将idle instance pause,不消耗cpu但是消耗内存,之后再有request过来unpause是比新创建一个container快的(warm start)

    • install cache:

      lean containers中的package层,read-only且被所有container共享

    • import cache:

      就是Zygote机制,但是命中和驱逐机制需要定制。命中可能与传统cache不同,存在多命中的情况(handler需要的包可能既在tree cache中的子节点也可能是父节点),这时需要找到最合适的entry(也就是Zygote进程);驱逐因为Zygote进程会都有相同的包而存在共享内存的情况所以比较复杂


Last modified on 2021-05-18