2011-10-10 66 views
0

我觉得我的问题是相当基本的,但我找不到任何相关的SO问题。多CPU在Linux上的多任务

我需要运行一个程序几千次(每次输入不同),目前它是由shell脚本完成的。该机器运行Ubuntu并有8个CPU(由cat /proc/cpuinfo显示)。使用top我看到只有1个CPU被利用。为了加快速度,我想利用所有8个CPU。我知道我可以在后台启动程序,然后再次调用它(实际上top表明在这种情况下使用了2个CPU),所以我可以更改我的shell脚本以8个组来调用程序。我的问题是,这是推荐的方式来利用所有的CPU,还是有另一种,有点'更清洁'的方式?

回答

1

您可以使用cpu亲缘关系来明确进程的处理器。

http://www.cyberciti.biz/tips/setting-processor-affinity-certain-task-or-process.html

但是,如果每个进程在CPU上运行(因为它应该,内核将确保事情尽可能高效地运行),然后就火n处理掉(8你的情况,或者让你的shell脚本找出什么是n是你的脚本更健壮一些,或者让它成为一个命令行选项),让内核为你做。每当一个过程结束时,发射另一个过程直到完成。

1

问题过于模糊。

想要使用所有CPU意味着您希望尽快获得最终结果 - 但多个实例的性能主要担心资源争用(降低性能)和缓存(提高性能)。

通常在多个进程中分割作业通常会使结果更快。有很多很多的方法来分散工作量。但是,如果不了解更多关于它在做什么,很难推荐一种特定的方法。

考虑到您有8个CPU,并且假设唯一受限制的资源是CPU,那么您不希望在作业中同时运行多于8个线程。因此,问题就变成了如何安排工作以确保最佳使用8个内核。将工作分成8个脚本并同时运行它们,您将首先看到所有8个脚本并发运行 - 但根据工作的性质,脚本将在不同时间完成的可能性很大。

所以如果你真的想要最佳地使用硬件,那就意味着运行8个进程作为守护进程,最好每个进程都有一个cpu亲缘关系设置,由消息队列提供。但是,如果你不打算定期运行这些代码,那么真的值得编码吗?另外,运行7并保持CPU可以更快地处理放在盒子上的问题和其他需求。

+0

我有些困惑 - 不是一个OS概念的线程,即OS分布单个CPU的时间片吗?无论如何,我的程序是单线程的,我想在每一个时刻运行它的多个实例。 (感谢关于留下一个CPU免费提示) –

+0

我更困惑。 “线索”在不同的情况下意味着很多不同的东西。在我的回答中,它大致相当于一个过程。 – symcbean