我觉得我的问题很基本,但我找不到任何相关的问题。
我需要运行几千次程序(每次输入不同),目前它是由shell脚本完成的。该机器运行Ubuntu并有8个CPU(由cat /proc/cpuinfo
显示)。使用top
我看到只使用了1个CPU。为了加快速度,我想利用所有8个CPU。我知道我可以在后台启动程序,然后再次调用它(事实上top
显示在这种情况下使用了2个CPU),所以我可以更改我的shell脚本以8个为一组调用程序我的问题是,这是一种利用所有CPU的推荐方法,还是有另一种有点'更清洁'的方式?
答案 0 :(得分:1)
问题过于模糊。
您想要使用所有CPU意味着您希望尽可能快地获得最终结果 - 但多个实例的性能主要问题是争用资源(降低性能)和缓存(提高性能)。
通常在多个流程之间拆分作业通常会更快地产生结果。分离工作量的方法有很多种。但是,如果不了解它正在做什么,就很难推荐一种特定的方法。
鉴于您有8个CPU,并且假设唯一受约束的资源是CPU,那么您不希望在作业上同时运行8个以上的线程。因此问题就变成了您安排工作的方式,以确保您以最佳方式使用8个内核。将工作拆分为8个脚本并同时运行它们,您最初会看到所有8个脚本同时运行 - 但根据工作性质,脚本很可能会在不同时间完成。
因此,如果您真的想要最佳地使用硬件,那意味着将8个进程作为守护进程运行,最好每个进程都有一个cpu亲和性集,由消息队列提供。但是,如果你不打算定期运行,那么编码这一切真的值得吗?此外,仅运行7并保持CPU以处理盒子上的quueue和其他要求可能会更快。
答案 1 :(得分:1)
您可以使用cpu affinity来明确有关进程的处理器。
http://www.cyberciti.biz/tips/setting-processor-affinity-certain-task-or-process.html
但是,如果每个进程都在cpu上运行(正如它应该的那样,内核将确保事情尽可能高效地运行),那么只需关闭n
进程(在你的情况下是8,或者make你的shell脚本弄清楚n
是什么,所以你的脚本更健壮,或者让它成为命令行选项)并让内核为你做。每次进程结束时,都要触发另一个进程,直到完成为止。