我注意到,构建在员工之间的分布不是最优的,80%的构建时间都是在繁忙的工作人员上运行的。
如果您看一下图像,tmp_worker1 可以处理,但是它是空闲的!由于某种原因,** triggered_build_1 处于锁定状态,并被分配给繁忙的

我有下一个设置:
下面的主要源代码
# 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
...发布于 2020-12-01 23:32:46
此行为是由锁和主程序分发构建的方式触发的。
当需要运行构建时,主程序执行以下步骤(链接到源代码):
当在工人上开始构建时,它就会使用锁。
因此,如果主程序在获得锁之前检查下一个构建的调度要求,它就可以在同一个工作人员上分派一个新的构建(即使他们需要相同的锁)。
如果将构建指定的工作人员置于隔离状态,以便给工作人员足够的时间来获取锁,则可以修复此问题。您可以使用canStartBuild函数来完成这个任务,该函数是在为worker (文档)分配构建之前运行的。
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把它给要取锁的工人。
c['builders'].append(
util.BuilderConfig(name="triggered_build_0",
workernames=['example-worker', 'tmp_worker0', 'tmp_worker1'],
factory=factory_subbuild,
canStartBuild=canStartBuildLockQuarantine,
locks=worker_lock,
)
)https://stackoverflow.com/questions/64645889
复制相似问题