我有一个使用单独的 python 进程实现的主/ worker 模型。主进程保存受互斥锁保护的作业/结果列表。许多工作进程在许多机器上运行(大约 200 个工作进程)。
我注意到,在每台机器上, worker 往往比其他 worker 进程多做 0-20% 或更少的工作,并且机器比其他机器多做 0-20% 或更少的工作。最快/最慢的 worker 和机器每天都不同。
这是主/ worker 模型的概念问题吗?它是否暗示实现有问题,或者一切都很好?
最佳答案
对于 +/- 20% 的情况,最简单的解释是您遇到了负载平衡问题;有些员工的工作量只比其他同事多 20%。这可能代表一个实现问题,也可能只是离散性;如果你有 200 个工作进程,但有 1040 个大致相等的工作要做,那么 1/5 的工作进程将有额外 20% 的工作要做,除非你可以分割工作,否则对此无能为力更精细。
Master/Worker 可以扩展(并像其他任何事情一样轻松地处理这些负载平衡问题),直到主进程中对共享资源的争用开始变得不平凡。您可以通过将关键部分(受互斥体保护的部分)减少到绝对最小值来稍微向前扩展;通过聚合工作单元来减少请求(但请注意,这与改善负载平衡的方向相反);或者通过拥有多个主人(可能是主人的层次结构)。如果这不起作用,您必须开始考虑更多的点对点工作调度算法,这样就不再存在单一瓶颈。 master/worker 的点对点类似物称为 work stealing ,这是(恕我直言)似乎不应该起作用的事情之一,直到有人向你展示它确实有效;它最近被 Cilk 所普及。 。这个想法是,每个人都会得到一份任务 list ,如果同伴需要更多的工作,他们会随机地从对方那里窃取任务,然后继续努力,直到完成。实现起来比master/worker更复杂,但避免了单master瓶颈。关于python - master/worker 是否可扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4015348/