【发布时间】:2014-03-06 08:45:06
【问题描述】:
操作系统:Cent-OS
我有一些30,000 工作(或脚本)要运行。每项工作需要 3-5 分钟。我有48 CPUs(nproc = 48)。我可以同时使用40 CPUs to run 40 Jobs。请建议一些脚本或工具通过并行运行每 40 个作业来处理 30,000 个作业。
我做了什么:
我创建了 40 个不同的文件夹,并通过为每个目录创建一个 shell 脚本并行执行作业。
我想知道下次处理这类工作的更好方法。
【问题讨论】:
-
编写一个脚本,其任务是通过分叉最多 40 个进程来分发 30,000 个作业。这个父脚本将等待子进程完成并通过分叉一个新进程继续下一个作业。在任何时候,您最多可以有 40 个子进程。
-
您现在有 40 个文件夹保存“文件?”每个工作,对吧?为什么不使用一个名为“queue/”的文件夹来保存所有文件,而运行作业的脚本将“将一个文件从文件夹 queue/ 移动到文件夹 working/ 并处理该作业;完成后移动文件到文件夹完成/“?这样你启动的脚本数=并发数;您可以查看队列中的内容、工作中的内容和已完成的内容。当您需要重新开始时,只需将所有文件移回“queue/”文件夹即可。您还可以在其仍在处理过程中添加更多作业或删除尚未开始的作业。
-
注意:在您的作业处理脚本中,当它“移动”文件时,最好将其移动到文件夹“working/”,并在文件名中附加其 pid ($$),并检查移动的文件确实持有它的pid(在文件名中)。这是一种处理锁定的简单方法,因为文件系统将以原子方式“移动”文件,不需要信号量或锁定。
-
@KenCheung forking 需要执行您的建议。
-
哦...是的。事实上,我有类似的东西,我的脚本开始使用 /etc/inittab (CentOS 5),当 queue/ 文件夹中没有文件时它会休眠。