我们有一个令人尴尬的并行问题——我们运行单个程序的大量实例,每个实例具有不同的数据集;我们只需将应用程序多次提交到批处理队列,每次使用不同的参数即可。
然而,由于有大量工作,并非所有工作都完成。队列中似乎没有问题 - 所有作业都已启动。
问题似乎在于,在运行大量应用程序实例的情况下,许多作业大致同时完成,因此都试图几乎同时将它们的数据写入并行文件系统。
然后问题似乎是程序无法写入文件系统并以某种方式崩溃,或者只是坐在那里等待写入并且批处理队列系统在等待太久后终止了作业。(从我收集到的问题来看,大多数未能完成的工作,如果不是全部,不要留下核心文件)
安排磁盘写入以避免此问题的最佳方法是什么?我提到我们的程序是令人尴尬的并行,以强调每个进程都不知道其他进程的事实——它们不能相互交谈以以某种方式安排他们的写入。
虽然我有该程序的源代码,但我们希望解决问题而无需尽可能修改它,因为我们不维护或开发它(加上大多数评论都是意大利语)。
我对这个问题有一些想法:
- 每个作业首先写入节点的本地(暂存)磁盘。然后我们可以运行另一个作业,它不时检查哪些作业已完成并将文件从本地磁盘移动到并行文件系统。
- 在主/从系统中围绕程序使用 MPI 包装器,其中主管理作业队列并将这些作业分配给每个从属;并且从属包装器运行应用程序并捕获异常(我可以可靠地为 C++ 或 Java 中的文件系统超时执行此操作吗?),并将消息发送回主控器以重新运行作业
与此同时,我需要向我的主管询问有关错误本身的更多信息——我个人从未遇到过它,但我还没有必要将程序用于大量数据集。
如果有用:我们在 HPC 系统上使用 SGE(Sun GridEngine)批处理队列系统运行 Solaris。文件系统是 NFS4,存储服务器也运行 Solaris。HPC 节点和存储服务器通过光纤通道链路进行通信。