我有一个 gnu 并行脚本,可将数据(分布到 100 个远程服务器的 100,000 个作业)导入中央数据库。第一份工作正在抨击中央数据库,因为它们几乎同时完成。之后的工作最终会分散开来,并且不会尝试同时导入所有工作。
有没有办法延迟每个远程服务器的第一个作业的执行?所以脚本可以说“现在将进程 #1 运行到 server1,在 5 秒内运行进程 #2 到 server2,在 10 秒内运行进程 #3 到 server3,在 20 秒内运行进程 #4 到服务器 4,...,。 ..”。在第一批发送到每个服务器之后,id 就像其他进程一样尽快运行。
有这个参数吗?
最佳答案
--delay
来自版本 20121222 和 --sshdelay
来自版本 20130122。
= 编辑 =
--delay 是从作业开始时开始测量的,因此如果您的作业运行时间超过延迟 * 作业槽数(例如,在您的示例中为 100 个服务器 * 5 秒),那么您会感觉在第一批之后似乎没有延迟.
比较:
time parallel -S 2/: --delay 1 'sleep {};hostname' ::: 2 2
至:
time parallel -S 2/: --delay 1 'sleep {};hostname' ::: 2 2 2
第一个需要 3 秒,第二个需要 4 秒。
没有仅处理第一批的功能。你可以做的是:
parallel 'if [ {#} -lt 100 ] ; then sleep {#} ; fi; do_stuff {}'
其中 100 是第一批的大小。
关于parallel-processing - GNU 并行 : Delay first jobs sent to remote servers,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16330869/