首页 > 解决方案 > 为什么我的 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() 有什么问题吗?还是与我的任务类型有关?

标签: pythonmultiprocessingcpu

解决方案


你没有展示你的任务实际上是做什么的。他们没有使用完整的 CPU 可能有很多原因。's' - 表示任务正在等待某事发生,它可能是以下之一:

  • 等待响应网络请求
  • 等待同步对象
  • 等待换出的页面从内存中加载(这在非常繁忙的系统上很常见,您分配的内存是否超出了系统的处理能力?)
  • 等待 IO 请求(您的任务是 IO 限制还是 CPU 限制)
  • 程序可以等待的其他事情

尝试使用“strace”来分析您的流程,看看那里是否发生了什么事。

还要查看您的 /proc/interrupts 以查看您是否有异常高的 IO 活动。您必须先获取基线以确定系统空闲时的中断量,然后在程序运行时再次对其进行采样


推荐阅读