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