【问题标题】:ZeroMQ/Python - CPU affinity hickup?ZeroMQ/Python - CPU 亲和力故障?
【发布时间】:2015-10-28 07:58:08
【问题描述】:

我有以下奇怪的情况。

我们有一个进程,称为 Distributor,它通过 ZeroMQ/TCP 从客户端接收任务,并将它们累积在一个队列中。有一个 Worker 进程,它通过 ZeroMQ/IPC 与 Distributor 对话。 Distributor 将每个传入的任务转发给 Worker,并等待答案。一旦 Worker 回答,它就会向它发送另一个任务(如果同时收到一个),并将答案返回给客户端(通过单独的 ZeroMQ/TCP 连接)。如果一个任务在 10ms 内没有被处理,它就会从队列中被丢弃。

使用 1 名 Worker,系统能够处理 ~3,500 个请求/秒。客户端每秒发送 10,000 个请求,因此丢弃了 6,500 个请求。

但是 - 当我在服务器上运行一些不相关的进程时,它会占用 100% 的 CPU(繁忙的等待循环或其他) - 然后,奇怪的是,系统可以突然处理 ~7,000 个请求/秒。当进程停止时,它会返回到 3,500。服务器有 4 个核心。

运行 2、3 或 4 个工人(连接到同一个 Distributor)时也会发生同样的情况,数量略有不同。

分发器是用 C++ 编写的。 Worker 是用 Python 编写的,并使用 pyzmq 绑定。 worker进程是一个简单的算术进程,不依赖于Distributor以外的任何外部I/O。

有一种理论认为这与 ZeroMQ 在服务器空闲时使用单独的 CPU 上的线程有关,而在服务器繁忙时使用相同的 CPU。如果是这种情况,我将不胜感激如何配置 ZeroMQ 的线程/CPU 亲和性以使其正常工作(无需在后台运行繁忙的循环)。

是否有任何 ZeroMQ 设置可以解释/解决此问题?

编辑:

用 C++ 编写的 Worker 不会发生这种情况。

【问题讨论】:

    标签: multithreading tcp client-server zeromq pyzmq


    【解决方案1】:

    这确实是一个 CPU 关联性问题。事实证明,在工作人员处理输入并等待下一个输入的设置中使用 ZeroMQ,如果上下文切换导致它切换到另一个进程,那么复制 ZeroMQ 数据会浪费大量时间。

    运行工人

    taskset -c 1 python worker.py
    

    解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 2016-05-31
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多