Shell 为什么不是';t我的申请';使用更多CPU进行性能扩展?

Shell 为什么不是';t我的申请';使用更多CPU进行性能扩展?,shell,parallel-processing,multiprocessing,Shell,Parallel Processing,Multiprocessing,我正在运行一个非常并行的软件。我需要运行的命令大约有400个,它们之间根本不相互依赖,所以我把它们分开,希望拥有更多的CPU意味着每单位时间执行更多的进程 代码: 很简单。以下是我的测试结果: 在1个CPU上,这需要1006秒,或16分钟46秒 使用10个CPU,这需要600秒或10分钟 为什么所用的时间不(大致)除以10?我觉得这里被骗了=( 编辑-当然,我愿意提供您想知道的其他详细信息,只是不确定什么是相关的,因为最简单地说,这就是我正在做的。您假设您的进程100%受CPU限制 如果您的进程

我正在运行一个非常并行的软件。我需要运行的命令大约有400个,它们之间根本不相互依赖,所以我把它们分开,希望拥有更多的CPU意味着每单位时间执行更多的进程

代码:

很简单。以下是我的测试结果:

在1个CPU上,这需要1006秒,或16分钟46秒

使用10个CPU,这需要600秒或10分钟

为什么所用的时间不(大致)除以10?我觉得这里被骗了=(


编辑-当然,我愿意提供您想知道的其他详细信息,只是不确定什么是相关的,因为最简单地说,这就是我正在做的。

您假设您的进程100%受CPU限制

如果您的进程执行任何磁盘或网络I/O操作,瓶颈将出现在那些无法并行的操作上(例如,一个进程将以100k/s的速度下载一个文件,两个进程以50k/s的速度下载一个文件,因此您根本看不到任何改进,此外,由于开销,您可能会遇到性能下降)


请参阅:-这使您能够估计并行任务时性能的改进,知道可并行部分和不可并行部分之间的比例)

进程在做什么?它们是IO绑定还是CPU绑定?这就是我有点不确定的地方。他们正在调用“eperl”,它将包含perl代码片段的文本模板扩展为更大的文件。可能是IO绑定的。您是否在虚拟机上运行?总CPU时间可能会被限制。是的,这是通过VNC实现的,我从“农场”远程请求CPU。我不知道有什么帽子我明白了。。因此,对于I/O绑定来说,你有点碰壁了?嗯,你只是在增加CPU的数量,如果你想提高IO绑定操作的性能,你还必须“并行化”IO,这意味着更好的磁盘、RAID控制器、更快的网络等等。该死,在我的例子中,这些听起来不像是选项。我可能会尝试更好地查看每个
$cmd
,看看它尝试访问哪些数据,然后尝试预取这些数据或其他东西。如果您有足够的内存,您可以尝试创建一个ram磁盘,并将加载最多的文件放在那里。另一个可能是巨大的改进,可能是尝试在20人一组中启动任务(每个处理器两个任务是一个很好的经验法则)等待这些任务完成,然后再启动20个等-事实上,您正在同时运行400个进程,这使得调度程序切换非常疯狂。如果您了解Java,请使用一个包含20个线程和Runtime.exec()的fixedThreadPool启动您的命令,以便在20个命令中的一个完成后,另一个命令将启动
foreach cmd ($CMD_LIST)
    $cmd &    #fork it off
end