在AWS EC2上,使用32核的多处理Python代码比使用16核的慢
我不明白为什么在AWS EC2 c3.8XL上使用28-30核时,我的计算时间比使用12-16核时长。我做了一些测试,结果如下图所示: 最快的计算是当我使用13个核时。因此,如果我使用最大核数,这与我使用8个c3.8XL的核数相同: 这是我使用的简化代码在AWS EC2上,使用32核的多处理Python代码比使用16核的慢,python,amazon-ec2,multiprocessing,Python,Amazon Ec2,Multiprocessing,我不明白为什么在AWS EC2 c3.8XL上使用28-30核时,我的计算时间比使用12-16核时长。我做了一些测试,结果如下图所示: 最快的计算是当我使用13个核时。因此,如果我使用最大核数,这与我使用8个c3.8XL的核数相同: 这是我使用的简化代码 import random import multiprocessing as mp import threading as th import numpy as np x=mp.Value('f',0) y=mp.Value('f',0
import random
import multiprocessing as mp
import threading as th
import numpy as np
x=mp.Value('f',0)
y=mp.Value('f',0)
arr=[]
tasks=[]
nesto=[]
def calculation2(some_array):
global x, y, arr
p=False
a = np.sum(some_array)*random.random()
b = a **(random.random())
if a > x.value:
x.value=a
y.value=b
arr=some_array
p=True
if p:
return x.value, y.value, arr
def calculation1(number_of_pool):
global tasks
pool=mp.Pool(number_of_pool)
for i in range(1,500):
some_array=np.random.randint(100, size=(1, 4))
tasks+=[pool.apply_async(calculation2,args=(some_array,))]
def exec_activator():
global x, y, arr
while tasks_gen.is_alive() or len(tasks)>0:
try:
task=tasks.pop(0)
x.value, y.value, arr = task.get()
except:
pass
def results(task_act):
while task_act.is_alive():
pass
else:
print x.value
print y.value
print arr
tasks_gen=th.Thread(target=calculation1,args=(4,))
task_act=th.Thread(target=exec_activator)
result_print=th.Thread(target=results,args=(task_act,))
tasks_gen.start()
task_act.start()
result_print.start()
它的核心是两个计算:
- 计算1-计算阵列并为计算2制作作业 使用该阵列
- 计算2-计算数组外的某些计算并比较结果
如果英语不好,请提前道歉。如果您需要更多信息,请询问。c3.8XL是一款常春藤桥四核系统。它使用超线程;它实际上没有32个(硬件)独立的处理单元 试图在更多的操作系统进程之间并行执行CPU限制的任务,而不是在硬件中并行它们的处理器,这通常是没有意义的。事实上,这通常是有害的,因为资源开销和上下文切换(这就是您所看到的)
这可能取决于您的具体应用程序,而实验将帮助您找到最佳点(听起来您已经这样做了)。与可用RAM相比,内核太多,您可能正在使用虚拟内存(为了简化,与磁盘交换),这很容易降低您的速度。唯一的通用解决方案是获得更多的RAM。根据任务的具体情况,以正确的顺序从磁盘实际工作可能比将其全部放入虚拟的“内存”要快。或者,如果您可以使用本地SSD作为“磁盘”,则可以提供更快的随机访问(我不知道如何在AWS中做到这一点,只在Google云平台上)。我使用psutil来监控处理器和RAM。在测试数据上,它最多使用2-3%的RAM。我在Ubuntu服务器(EBS)上传输所有数据和python代码。如何测试它,我在一个微实例上运行它,并在0.2s
[[86 44 89 88]]中得到更少的结果\n real 0m0.175s
该代码是简化的代码,在任何计算机上都非常快速,我把它放在这里只是为了展示我如何构造真正的代码。这里我只是放置一些随机数组来计算一些随机数据。真正的代码是3-4倍长,更复杂,它取决于我硬盘上的盘中股票数据。Def和变量是用我的母语编写的,所以我必须做很多修改才能在这里显示出来。据你所知,有32个超线程,而不是物理内核。