微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Buildbot:工人闲置

如何解决Buildbot:工人闲置

我注意到工作人员之间的Builds分配不是最理想的,80%的时间是Builds在繁忙的工作人员上运行。

如果您查看图像,tmp_worker1可以处理triggered_build_1,但是它是闲置的!!!但是由于某些原因,triggered_build_1处于锁定状态,并被分配给忙碌的example-worker

enter image description here

我有一个设置:

  • 3名工人
  • 1个主要建设者
  • 3个可触发的生成器(带锁)

下面的主要源代码

# 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",factory=factory_subbuild,locks=worker_lock,)
)

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

解决方法

由于锁定以及主服务器分发构建的方式而触发此行为。

当需要运行构建时,主服务器执行以下步骤(link to the source code):

  • 随机选择一个工人
  • 检查工作人员和内部版本是否匹配
  • 检查构建版本是否可以获取工作线程所需的锁
  • 将内部版本分配给主版本

当在worker上开始构建时,它将获得锁定。

因此,如果主服务器在获取锁之前检查要分发的下一个构建的要求,则它可以在相同的工作程序上分派新的构建(即使他们需要相同的锁)。

如果您将隔离分配了构建的工作人员放入隔离区中,以便给工作人员足够的时间进行锁定,则可以解决此问题。 您可以使用canStartBuild函数来执行此操作,该函数正好在为工作进程(docs)分配内部版本之前运行。

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()

将其交给需要锁的工人。

c['builders'].append(
    util.BuilderConfig(name="triggered_build_0",workernames=['example-worker','tmp_worker0','tmp_worker1'],factory=factory_subbuild,canStartBuild=canStartBuildLockQuarantine,locks=worker_lock,)
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。