Jos*_*arl 7 c filesystems parallel-processing fortran embarrassingly-parallel
我们遇到一个令人尴尬的并行问题 - 我们运行一个单个程序的大量实例,每个程序都有不同的数据集; 我们只需将应用程序多次提交到具有不同参数的批处理队列即可.
但是,由于有大量工作,并非所有工作都完成.它似乎不是队列中的问题 - 所有作业都已启动.
问题似乎是,随着应用程序的大量实例运行,许多作业大致同时完成,因此所有人都试图在几乎同时将其数据写入并行文件系统.
然后问题似乎是程序无法写入文件系统并以某种方式崩溃,或者只是坐在那里等待写入,批处理队列系统在等待太长时间后就会终止作业.(从我收集的问题来看,大多数未能完成的工作,如果不是全部,都不会留下核心文件)
调度磁盘写入以避免此问题的最佳方法是什么?我提到我们的程序是令人尴尬的并行突出显示每个进程都不知道其他进程的事实 - 他们不能互相交谈以某种方式安排他们的写入.
虽然我有程序的源代码,但我们希望解决问题而不必在可能的情况下修改它,因为我们不维护或开发它(加上大多数注释都是意大利语).
我对此事有一些想法:
与此同时,我需要纠缠我的主管以获取有关错误本身的更多信息 - 我从未亲自遇到过它,但我还没有将程序用于大量数据集(尚未).
如果它有用:我们在HPC系统上使用SGE(Sun GridEngine)批处理队列系统运行Solaris.文件系统是NFS4,存储服务器也运行Solaris.HPC节点和存储服务器通过光纤通道链路进行通信.
大多数并行文件系统,特别是超级计算中心的系统,都是针对HPC应用程序而不是串行场类型的.因此,他们对带宽进行了精心优化,而不是针对IOP(每秒I/O操作) - 也就是说,它们针对的是大量(1000多个进程)作业,编写了一些庞大的文件,而不是数以万计的少量文件.工作输出小小的文件.用户可以轻松地在桌面上运行运行良好(ish)的东西,并且天真地扩展到数百个同时工作,使IOP系统挨饿,挂起他们的工作,通常是同一系统上的其他工作.
你在这里可以做的主要是聚合,聚合,聚合.最好是告诉我们你在哪里运行,这样我们就可以获得有关系统的更多信息.但是一些经过验证的策略:
以上的建议将有利于你的代码的I/O性能无处不在,而不是嘉世通并行文件系统.IO在任何地方都很慢,你在内存中做的越多,你执行的实际IO操作越少,它就会越快.有些系统可能比其他系统更敏感,因此您可能不会在笔记本电脑上注意到这么多,但它会有所帮助.
同样,拥有较少的大文件而不是许多小文件将加速从目录列表到文件系统备份的所有内容; 它周围都很好.