为什么我的 python 多处理不能使用全部 cpu?

why my python multiprocessing can't use all 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个是运行ning,左边的状态是s(这意味着等待 cpu 到 运行)。很多cpu的idle是100%(就是idle)

没有其他代码 运行ning,所以,我很困惑,为什么那些空闲的 cpu 不 运行 国家的任务?

我的 MPRun() 有什么问题吗?还是跟我的任务类型有关?

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

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

尝试使用 'strace' 分析您的流程,看看那里是否有问题。

同时查看您的 /proc/interrupts,看看您的 IO 是否异常高 activity。您必须首先获取基线以确定系统空闲时的中断量,然后在程序处于 运行

时再次对其进行采样