为什么我的 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。您必须首先获取基线以确定系统空闲时的中断量,然后在程序处于 运行
时再次对其进行采样
我有一台 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。您必须首先获取基线以确定系统空闲时的中断量,然后在程序处于 运行
时再次对其进行采样