gpt4 book ai didi

multithreading - ZeroMQ/Python - CPU 亲和性问题?

转载 作者:可可西里 更新时间:2023-11-01 02:32:11 24 4
gpt4 key购买 nike

我有以下奇怪的情况。

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

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

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

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

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

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

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

编辑:

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

最佳答案

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

运行 worker

taskset -c 1 python worker.py

解决问题。

关于multithreading - ZeroMQ/Python - CPU 亲和性问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31834251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com