R和GNU并行-如何限制使用的内核数

时间:2019-03-05 19:44:06

标签: r anaconda gnu-parallel

(GNU Parallel的新手)

我的目标是在多个内核上运行具有不同参数的相同Rscript。我的第一个问题是要在笔记本电脑上工作(2个真实内核,4个虚拟内核),然后将其移植到具有64个内核的内核上。

当前:

我有一个Rscript“ Test.R”,它接受参数,然后执行某件事(例如添加一些数字,然后将其写入文件),然后停止。

我有一个“ commands.txt”文件,其中包含以下内容:

/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 100
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 50 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 50 200 1000

所以这告诉GNU parallel使用R运行Test.R(我已经使用anaconda安装了它)

在终端中(导航到Test.R和commands.txt所在的桌面之后),我使用以下命令:

parallel --jobs 2 < commands.txt

我想要做的是使用2个核,并运行来自commands.txt的命令,直到完成所有任务。 (我尝试过对该命令进行变体处理,例如将2更改为1,在这种情况下,其中2个内核以100%的速度运行,而另外2个内核以20-30%的速度运行)。

运行此命令时,所有4个内核都达到100%(从htop看到),并且前2个工作完成了,尽管所有4个内核仍处于100%,但没有更多工作完成。

当我在64核计算上运行相同的命令时,所有64核都变为100%,我必须取消作业。

任何有关资源查看的建议,或者我做错了什么,将不胜感激。

一个长问题,让我知道是否可以澄清。

在运行上述命令期间,htop的请求输出(按CPU%排序:

   1  [||||||||||||||||||||||||100.0%]   Tasks: 490, 490 thr; 4 running
   2  [|||||||||||||||||||||||||99.3%]   Load average: 4.24 3.46 4.12 
   3  [||||||||||||||||||||||||100.0%]   Uptime: 1 day, 18:56:02
   4  [||||||||||||||||||||||||100.0%]
   Mem[|||||||||||||||||||5.83G/8.00G]
   Swp[||||||||||          678M/2.00G]

   PID USER      PRI  NI  VIRT   RES S CPU% MEM%   TIME+  Command
  9719 user     16   0 4763M  291M ? 182.  3.6  0:19.74 /Users/user/anaconda3
  9711 user     16   0 4763M  294M ? 182.  3.6  0:20.69 /Users/user/anaconda3
  7575 user     24   0 4446M 94240 ? 11.7  1.1  1:52.76 /Applications/Utilities
  8833 user     17   0 86.0G  259M ?  0.8  3.2  1:33.25 /System/Library/StagedF
  9709 user     24   0 4195M  2664 R  0.2  0.0  0:00.12 htop
  9676 user     24   0 4197M 14496 ?  0.0  0.2  0:00.13 perl /usr/local/bin/par

1 个答案:

答案 0 :(得分:1)

基于htop的输出,脚本/Users/name/anaconda3/lib/R/bin/Rscript使用多个CPU线程(182%)。您有4个CPU线程,并且由于您运行了2个Rscript,所以我们无法确定Rscript如果自己运行会吞噬所有4个CPU线程。也许它将吞噬所有可用的CPU线程(您在64核计算机上的测试表明了这一点)。

如果您使用的是GNU / Linux,则可以限制程序可以与taskset一起使用的CPU线程:

taskset 9 parallel --jobs 2 < commands.txt

这将强制GNU Parallel(及其所有子代)仅使用CPU线程1和4(二进制中的9:1001)。因此,运行该命令应将两个作业限制为只能在两个线程中运行。

通过使用9(1001二进制)或6(0110二进制),我们可以合理地确定两个CPU线程位于两个不同的内核上。 3(11个二进制文件)可能引用附带的CPU内核上的两个线程,因此可能会更慢。 5(101个二进制)也是如此。

通常,您希望使用尽可能多的CPU线程,因为这通常会使计算速度更快。从您的问题尚不清楚,为什么要避免这种情况。

如果要与他人共享服务器,更好的解决方案是使用nice。这样,您可以使用其他人没有使用的所有CPU功能。