R和GNU Parallel - 如何限制使用的核心数

问题描述 投票:1回答:1

(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并行使用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看到),前两个作业完成,并且没有更多的工作完成,尽管所有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
r anaconda gnu-parallel
1个回答
1
投票

根据htop的输出,脚本/Users/name/anaconda3/lib/R/bin/Rscript使用多个CPU线程(182%)。你有4个CPU线程,因为你运行2个Rscripts我们无法判断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功率。

© www.soinside.com 2019 - 2024. All rights reserved.