参考自:张晨,邓玉辉.基于镜像层关联的Docker注册表缓存预取策略[J].计算机科学与探索,2021,15(02):249-260.
总结:这篇文章是提出了一个新的预取缓存策略——LCPA
预取触发点问题:
过去的研究中一般在收到GET manifest请求后就直接开始预取。
这会存在以下两个问题:
1.用户只会pull未拥有的layer,而registry端无法知道用户已经拥有哪些layer,全部预取的话就会导致预取的和实际需要的偏差较大,造成网络资源浪费和命中率的降低。
2.观察发现部分用户会因为网络拥塞或中断操作,只发送GET manifest请求而没有后续的GET layer请求,如果收到GET manifest就开始预取的话会导致全部预取都浪费掉
解决方法
本文选择第二次miss的pull layer请求作为触发点,首先使用pull layer作为触发点解决了问题2。选择第二个是因为注册表服务器第一次接收到某个镜像仓库内的未命中请求时,没有前驱请求可以建立关联,无法准确判断是否还有后续请求以及与其他镜像层的相关性。
LCPA策略
关联性分为三种情况:
1.强关联:客户端pull一个layer一定会pull另一个layer,即所有包含其中一个layer的镜像一定也包含另一个。如镜像存储库1中的2,4,6。
2.弱关联:pull 一个layer可能会pull另一个layer,即一个镜像I_A包含layer_A和layer_B,另一个镜像I_B包含layer_A和layer_C,则layer A和B就是弱关联的。如镜像存储库2中的1和5
3.无关联:两个layer没有任何关系,没有同时包含它们两个的镜像存在,就像镜像存储库2的10和15。
预取策略:
新请求与历史请求的关系:
1.如果是强关联,预取集合就是新层的所有强关联层
2.如果是弱关联,则计算关联程度
其中d 表示新请求和历史请求对应镜像层的间隔镜像层数量;Plast表示历史请求对应镜像层的流行度;Pnow表示新请求对应镜像层的流行度;Tlast表示历史请求到达的时间戳;Tnow表示新请求到达的时间戳。选取从新请求对应层至历史请求对应层方向的 C个镜像层作为弱关联层预取集合。
3.如果是无关联,清除该预取窗口中所有历史请求,仅保留最新请求,为后继请求提供关联性参考。
获得了预取集合后先检查内存中是否已经缓存了其中的层,然后再进行缓存。