python - 为什么我的 python 多处理不能使用所有 cpu?
问题描述
我有一个 48 核的服务器,所以我决定使用 python 多进程来运行我的 46 进程代码。
这是多处理包装函数:
import multiprocessing
def MPRun(func, args, dicts={}, n_pool=max(1, multiprocessing.cpu_count()-2), ret=True, show_process=True, show_num=100):
print('submit a multiprocess task with cpu', n_pool)
q = Queue()
if not isinstance(args, list) or not isinstance(dicts, dict):
print('args should be list, dicts should be dict', type(args), type(dicts))
sys.exit(1)
pool = multiprocessing.Pool(processes=n_pool)
res = []
for i, arg in enumerate(args):
if not isinstance(args[0], list):
q.put(pool.apply_async(func, tuple([arg]), dicts))
else:
q.put(pool.apply_async(func, tuple(arg), dicts))
count = 0
r = []
while count < len(args):
r.append(q.get().get())
count += 1
if show_process and count % show_num == show_num - 1:
print('MPRUN process[%d/%d]'%(count, len(args)))
pool.close()
pool.join()
return r
我这样称呼它:
MPRun(myfunc, [[task] for task in tasks])
当我在linux中调用top命令时,我发现它确实有46个python进程,但其中只有8-12个在运行,左边的状态是s(表示等待cpu运行)。并且许多 cpu 的空闲是 100%(这意味着它是空闲的)
没有其他代码在运行,所以,我很困惑,为什么那些空闲的 cpu 不运行 state 的任务?
我的 MPRun() 有什么问题吗?还是与我的任务类型有关?
解决方案
你没有展示你的任务实际上是做什么的。他们没有使用完整的 CPU 可能有很多原因。's' - 表示任务正在等待某事发生,它可能是以下之一:
- 等待响应网络请求
- 等待同步对象
- 等待换出的页面从内存中加载(这在非常繁忙的系统上很常见,您分配的内存是否超出了系统的处理能力?)
- 等待 IO 请求(您的任务是 IO 限制还是 CPU 限制)
- 程序可以等待的其他事情
尝试使用“strace”来分析您的流程,看看那里是否发生了什么事。
还要查看您的 /proc/interrupts 以查看您是否有异常高的 IO 活动。您必须先获取基线以确定系统空闲时的中断量,然后在程序运行时再次对其进行采样