首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Buildbot:员工空闲

Buildbot:员工空闲
EN

Stack Overflow用户
提问于 2020-11-02 12:46:44
回答 1查看 277关注 0票数 2

我注意到,构建在员工之间的分布不是最优的,80%的构建时间都是在繁忙的工作人员上运行的。

如果您看一下图像,tmp_worker1 可以处理,但是它是空闲的!由于某种原因,** triggered_build_1 处于锁定状态,并被分配给繁忙的

我有下一个设置:

  • 3名工人
  • 1个主建筑商
  • 3个可触发的建筑商(带锁)

下面的主要源代码

代码语言:javascript
复制
# triggerable scheduler
c['schedulers'].append(schedulers.Triggerable(name="trigger_from_main",
    builderNames=['triggered_build_0', 'triggered_build_1', 'triggered_build_2']))

# main builder factory
factory_main = util.BuildFactory()

# trigger
factory_main.addStep(steps.Trigger(
    schedulerNames=['trigger_from_main'],
    waitForFinish=True,
    haltOnFailure=True,
    name='trigger'
))

# main builder 
c['builders'].append(
    util.BuilderConfig(name="test_main",
        workernames=['example-worker', 'tmp_worker0', 'tmp_worker1'],
        factory=factory_main,
    )
)

# lock
worker_lock = [util.WorkerLock("worker_builds", maxCount=1).access('counting')]

# 1st of 3 sub-builder
c['builders'].append(
    util.BuilderConfig(name="triggered_build_0",
        workernames=['example-worker', 'tmp_worker0', 'tmp_worker1'],
        factory=factory_subbuild,
        locks=worker_lock,
    )
)

# 2nd of 3 sub-builder
...
# 3rd of 3 sub-builder
...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-01 23:32:46

此行为是由锁和主程序分发构建的方式触发的。

当需要运行构建时,主程序执行以下步骤(链接到源代码):

  • 随机选择一名工人
  • 检查工作人员与构建是否匹配。
  • 检查构建是否可以接受工作人员所需的锁。
  • 将构建分配给主程序。

当在工人上开始构建时,它就会使用锁。

因此,如果主程序在获得锁之前检查下一个构建的调度要求,它就可以在同一个工作人员上分派一个新的构建(即使他们需要相同的锁)。

如果将构建指定的工作人员置于隔离状态,以便给工作人员足够的时间来获取锁,则可以修复此问题。您可以使用canStartBuild函数来完成这个任务,该函数是在为worker (文档)分配构建之前运行的。

代码语言:javascript
复制
def canStartBuildLockQuarantine(builder, wfb, request):
    # Put the worker in quarantine for 5 seconds
    wfb.worker.quarantine_timeout = 5
    wfb.worker.putInQuarantine()
    # Reset wfb.worker.quarantine_timeout
    wfb.worker.resetQuarantine()
    return True

把它给要取锁的工人。

代码语言:javascript
复制
c['builders'].append(
    util.BuilderConfig(name="triggered_build_0",
        workernames=['example-worker', 'tmp_worker0', 'tmp_worker1'],
        factory=factory_subbuild,
        canStartBuild=canStartBuildLockQuarantine,
        locks=worker_lock,
    )
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64645889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档