【问题标题】:Python multiprocessing queue scaling to large numbers of workersPython多处理队列扩展到大量工作人员
【发布时间】:2011-10-19 13:40:27
【问题描述】:

我有一个启动工作进程的 python(2.6.5 64 位,Windows 2008 Server R2)应用程序。父进程将作业放入作业队列中,工作人员从中提取它们。同样,它有一个结果队列。每个工作人员通过查询服务器来执行其工作。工作人员的 CPU 使用率很低。

当工作人员数量增加时,服务器上的 CPU 使用率实际上会减少。服务器本身不是瓶颈,因为我可以从其他应用程序进一步加载它们。

还有其他人看到过类似的行为吗?当大量进程正在读取或写入相同的队列时,python 多处理队列是否存在问题?

【问题讨论】:

  • 请您澄清一下,您是说“我增加了工人的数量,但完成的工作量减少了”?
  • 你能分享一些代码吗?可能有很多原因,具体取决于实施。
  • @MattH:更少的工作意味着(A)服务器上的 CPU 使用率下降,(B)记录结果的速率下降。 (记录结果不是瓶颈,已经过测试,服务器处理能力过剩。)。
  • @Underhill:您的问题让我感到困惑,因为您交替谈论服务器和服务器,提到工人的工作是查询服务器。工人和父母都在同一个系统上吗?是不是那个系统的 CPU 使用率随着工作人员的增加而下降?
  • @MattH:父母和工人在同一个系统上。无论工人数量如何,这台机器上的 CPU 利用率总是很低。服务器是独立的机器;这些机器的 CPU 使用率在大量工人数量下会下降。

标签: python message-queue multiprocessing


【解决方案1】:

关于性能约束的两种不同想法:

  1. 瓶颈是工人相互争斗,父级争夺作业队列的访问权限。
  2. 瓶颈是服务器上的连接速率限制(syn-flood 保护)。

收集更多信息:

  1. 分析完成的工作量:每秒完成的任务,将此作为核心绩效指标。
  2. 使用数据包捕获查看网络活动的网络级延迟。
  3. 让您的工作人员记录他们等待访问作业队列的时间。

可能的改进:

  1. 如果可用/适用(例如 HTTP),让您的工作人员使用持久连接。
  2. 将任务拆分为多个作业队列,提供给工作人员池。

【讨论】:

  • Workers 已经使用了持久连接。我一直在考虑多队列方法,但是当实际问题仍然如此模糊时,我不愿重新安排那么多代码。 (我还考虑过每个工作进程使用 4 个工作线程,以减少实际进程的数量,以防问题是 python 多处理。)
【解决方案2】:

除非您提供所有详细信息,否则无法完全确定发生了什么。

但是,请记住,真正的并发性受限于硬件线程的实际数量。如果启动的进程数量远大于硬件线程的实际数量,那么在某些时候上下文切换开销将超过拥有更多并发进程的好处。

【讨论】:

  • 有大量可用的物理处理时间,CPU 利用率很低。这不应该是上下文切换问题。在 8 核系统上只有 30 名工作人员时会出现问题。此外,每个工作人员都有相当多的空闲时间:对服务器的查询大约需要 1/3 秒。
【解决方案3】:

创建新的头条是非常昂贵的操作。

控制大量并行网络连接的最简单方法之一是使用支持异步套接字的无堆栈线程。 Python 对此提供了强大的支持和大量库。

我最喜欢的是gevent,它有一个很棒且完全透明的猴子补丁实用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多