(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
答案 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功能。