在分布式yocto构建环境中,在NFS上的繁忙构建节点上托管全局sstate缓存(通过SSTATE_MIRRORS)是不是一个坏主意?
我最近在yocto构建配置中引入了SSTATE_MIRRORS,以进一步减少yocto构建在“构建节点”上的时间( vSphere和开发人员工作站中的Jenkins代理)。按照手册,如果没有在本地sstate缓存(SSTATE_DIR)中找到已经构建的工件,约克托将搜索它们。
所有构建节点都有一个本地SSTATE_DIR,它们在其中缓存生成结果。其中一个构建节点(第一个Jenkins代理)被指定为“全局缓存的守护者”,并将其本地SSTATE_DIR导出为r/ of共享。其他构建节点挂载它,并通过SSTATE_MIRRORS在其构建配置中引用它。我以为我在这里有个好主意,拍了拍自己的背。
唉,我看到在进行更改之后,构建时间有了显著的增加。
当然,在得出任何结论之前,我有很多疑难解答和测量工作要做。我们使用的是NFS v4,并且肯定会在那里进行调优。此外,我怀疑承载NFS共享的构建节点间歇性地非常繁忙地执行yocto构建自身(填充它的混合本地/全局缓存),为内核留下很少的CPU周期来管理NFS请求。
我想知道其他人是否可以根据自己的经验提供建议,实现共享的yocto sstate缓存。
发布于 2021-02-13 11:51:08
很难确切地说你看到了一些分析数据的问题,但是我有一些观察和建议。
您在正确的轨道上使用NFS作为CI节点之间的sstate缓存,但我建议再走一步。与其让一个节点作为sstate缓存的“守护者”,让所有其他节点使用它作为镜像,我建议让每个节点将公共NFS共享直接挂载为SSTATE_DIR
。这允许所有节点在构建过程中读取和写入缓存,并且在更新所需的sstate对象方面做得更好。如果只有一个节点填充缓存,则不太可能包含其他构建所需的所有对象。
此外,我建议NFS服务器是一个持久服务器,而不是绑定到Jenkins代理。这给你带来了一些好处:
SSTATE_MIRROR
,从而直接受益于您的Jenkins节点产生的缓存。如果您这样做是正确的,开发人员应该能够复制以前由Jenkins完全从sstate构建的构建,这可以节省大量的本地构建时间。即使您没有完全复制Jenkins以前做过的构建,您仍然可以从sstate中提取大量的数据。最后要检查的是是否启用了哈希等价。哈希等价是一种构建加速技术,它允许bitbake检测元数据何时更改到通常会导致其重新构建的配方,从而产生与以前构建的sstate对象相同的输出,而不是从sstate构建它。默认情况下,从Yocto3.0 (codename )开始启用此功能。如果基础结构中没有运行哈希等效服务器,bitbake将在构建期间启动本地服务器。但是,在像Jenkins节点这样的分布式环境中工作时,这可能会导致一些问题,因为哈希等价性很大程度上取决于sstate缓存的内容。如果每个节点在本地运行它自己的哈希等价服务器,则它们可以得到发散的sstate散列(特别是当CI节点是瞬态的,而本地的哈希等价数据库丢失时),这可能导致更多的sstate丢失。解决方案是要么运行一个哈希等效服务器(bitbake附带一个)并将所有CI节点指向它,要么通过设置:BB_SIGNATURE_HANDLER = "OEBasicHash"
完全禁用哈希等价。
https://stackoverflow.com/questions/66180757
复制相似问题