我在我的 36 核服务器(EC2 c4.8xlarge/Amazon Linux)上运行这样的命令。
find . -type f | parallel -j 36 mycommand
要处理的文件数量约为 1,000,000 个,需要几十分钟。它应该同时运行 36 个进程。但是,从 的结果来看top
,最多大约有 10 个进程,并且 70% 是空闲的。ps
显示更多进程,但大多数已失效。
我猜是因为每个都mycommand
完成得太快了,parallel
无法赶上产生新进程的速度。所以我试图
parallel --nice 20
为自己分配更多的 CPU 时间parallel
,但这没有用。
有没有人有改善这个的想法?
$ parallel --version
GNU parallel 20151022
所以你每秒运行大约 600 个作业。单个 GNU Parallel 作业的开销大约为 2-5 毫秒,因此当您每秒获得超过 200 个作业时,如果不进行调整,GNU Parallel 将不会表现得更好。
调整是有更多
parallel
的并行产生工作。来自https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Running-more-than-250-jobs-workaround这样,您将拥有 50 个 GNU Parallel,每个每秒可以产生 100 个作业。
呃,如果我理解你的问题,你想同时处理所有文件吗?
parallel
将启动 的多个实例mycommand
,而不是多个find
实例。您正在尝试打开一百万个文件,一次打开 36 个。即使您的命令可以在一个 CPU 上以全功率运行,您仍然会首先承担打开这些文件的开销。I/O 是计算机上最耗时的操作之一。您最好的选择是预先将尽可能多的这些文件加载到您机器的 RAM 中,并尽可能多地在 RAM 中工作。根据您拥有的 RAM 大小,这可能会显着提高性能,因为一旦开始读取,后续读取如果一个接一个地立即完成,则往往会利用缓存。您可能还想确保您的文件系统以一种缓存有效的方式放置文件,并且当涉及到多个后续读取时,它也是一个很好的文件系统。
我认为
parallel
这次重构不会对您有太大帮助。