【发布时间】: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