任务吞吐量不会随着多个工作容器和多个用户而增加

我们正在为每个用户运行大量的后台任务,但是增加处理这些任务的线程数量并不能使每分钟执行的任务数量达到预期的加速 – 奇怪的是,只有在多个用户涉及任务

在这种情况下,“worker”是一个Python 3.6容器,它使用threading模块运行5个线程,每个线程使用同一个Google Cloud PubSub主题

这是一个演示这个问题的例子

  • testing1:任务队列中的800个任务,所有任务都属于1个用户(A)
  • testing2:2000任务在另一个任务队列中,所有任务都属于另一个用户(B)
  • testing3:我们同时运行来自1和2的两个任务队列(在两个队列中均消耗),共计2800个任务。

  • 我们运行testing1与1个工人容器,这需要大约30分钟

  • 我们运行testing1与2个工人容器,这需要大约15分钟才能完成
  • 我们用1个工作容器运行testing2,这需要大约120分钟才能完成
  • 我们用2个工作容器运行testing2,这需要大约70分钟才能完成
  • 我们用2个工作容器运行testing3,这需要大约200分钟才能完成
  • 我们用4个工作容器来运行testing3,这需要200多分钟才能完成

据我所知,没有“死”的线程(死锁或其他),但有一个可能的情况下线程执行速度比预期慢得多? 当我们有4个工作容器/ 20个线程时,为什么吞吐量不会增加? 还有什么可以debugging来理解为什么吞吐量没有增加? 同样,它似乎只在同时执行多个任务队列时发生。

有关工人集装箱与之交谈的更多信息以及我们迄今为止发现的信息:

工作者容器都在通过HTTP / S进行通信:

  • 一个由Google云SQLpipe理的数据库实例(读写)。 我们没有看到任何显着的性能下降与多达100线程同时阅读或写作
  • 一个弹性search节点(读写)。 每个用户都有自己的索引,每个任务都附有索引。 我们观察到,多个指标同时编制时,指数performance出现亏损; 然而使用批量写入模式并没有改善这一点。
  • 另一个后端服务完成了任务的一部分,看着这个我们并没有发现它是一个瓶颈,因为它是独立的
  • Google Pub-Sub用于拉取和确认任务
  • 第三方API – 我们没有遇到任何费率限制