在运行令人尴尬的并行作业时,避免重载并行文件系统的最佳方法是什么?

时间:2011-04-11 19:54:13

标签: c filesystems fortran parallel-processing embarrassingly-parallel

我们遇到一个令人尴尬的并行问题 - 我们运行一个单个程序的大量实例,每个程序都有不同的数据集;我们只需将应用程序多次提交到具有不同参数的批处理队列即可。

然而,由于有大量工作,并非所有工作都完成。它似乎不是队列中的问题 - 所有作业都已启动。

问题似乎是,随着应用程序的大量实例运行,大量同时完成大量作业,因此所有人都试图在几乎同时将数据写入并行文件系统。

然后问题似乎是程序无法写入文件系统并以某种方式崩溃,或者只是坐在那里等待写入,批处理队列系统在等待太长时间后终止工作。 (根据我对问题的回答,大多数未能完成的工作,如果不是全部,都不会留下核心文件)

安排磁盘写入以避免此问题的最佳方法是什么?我提到我们的程序是令人尴尬的并行突出显示每个进程都不知道其他进程的事实 - 他们不能互相交谈以某种方式安排他们的写入。

虽然我有程序的源代码,但我们想解决问题而不必在可能的情况下修改它,因为我们不维护或开发它(加上大多数注释都是意大利语)。 / p>

我对此事有一些想法:

  1. 每个作业首先写入节点的本地(暂存)磁盘。然后我们可以运行另一个工作,它会立即检查已完成的工作,并将文件从本地磁盘移动到并行文件系统。
  2. 在主/从系统中使用MPI包装程序,其中主服务器管理作业队列并将这些作业关闭到每个从属服务器;从属包装器运行应用程序并捕获异常(我可以为C ++中的文件系统超时可靠地执行此操作,或者可能是Java吗?),并将消息发送回主服务器以重新运行作业
  3. 与此同时,我需要纠缠我的主管以获取有关错误本身的更多信息 - 我从未遇到过个人问题,但我还没有将该程序用于大量数据集(尚未)。

    如果它有用:我们使用SGE(Sun GridEngine)批处理队列系统在HPC系统上运行Solaris。文件系统是NFS4,存储服务器也运行Solaris。 HPC节点和存储服务器通过光纤通道链路进行通信。

3 个答案:

答案 0 :(得分:7)

大多数并行文件系统,特别是超级计算中心的系统,都是针对HPC应用程序而不是串行服务器类型的。因此,他们对带宽进行了精心优化,而不是针对IOP(每秒I / O操作) - 也就是说,它们针对的是大量(1000多个进程)作业,编写了一些庞大的文件,而不是数以万计的少量文件。工作输出小小的文件。用户可以轻松地在桌面上运行运行良好(ish)的内容,并且天真地扩展到数百个同时发生的工作,使IOP系统瘫痪,挂起他们的工作,通常是其他人在同一系统上。

这里你可以做的主要是聚合,聚合,聚合。最好是告诉我们你在哪里运行,这样我们就可以获得有关系统的更多信息。但是一些经过验真的策略:

  1. 如果要为每个作业输出多个文件,请更改输出策略,以便每个作业写出一个包含所有其他文件的文件。如果你有本地ramdisk,你可以做一些简单的事情,比如将它们写入ramdisk,然后将它们转移到真正的文件系统。
  2. 以二进制编写,而不是以ascii编写。大数据从不进入ascii。二进制格式写入速度提高约10倍,略小,您可以一次编写大块而不是循环中的几个数字,这导致:
  3. 大写比小写更好。每个IO操作都是文件系统必须执行的操作。少量,大,写,而不是循环小写。
  4. 同样,请勿使用要求您在不同时间寻找文件不同部分的格式。寻求缓慢而无用。
  5. 如果您在节点上运行多个作业,则可以使用与上面相同的ramdisk技巧(或本地磁盘)来固定所有作业的输出,并立即将它们全部发送到并行文件系统。 / LI>

    上述建议将有利于您的代码无处不在的的I / O性能,而不仅仅是并行文件系统。 IO在任何地方都很慢,内存越多,执行的实际IO操作越少,它就越快。有些系统可能比其他系统更敏感,因此您可能不会在笔记本电脑上注意到这一点,但它会有所帮助。

    同样,拥有较少的大文件而不是许多小文件会加速从目录列表到文件系统备份的所有内容;它周围都很好。

答案 1 :(得分:2)

很难确定您是否不知道究竟是什么导致了崩溃。如果您认为这是与文件系统性能相关的错误,您可以尝试分布式文件系统:http://hadoop.apache.org/common/docs/r0.20.0/hdfs_user_guide.html

如果你想实现Master / Slave系统,也许Hadoop就是答案。

但首先我会试着找出导致崩溃的原因......

答案 2 :(得分:1)

操作系统在资源耗尽时总是表现不佳;有时他们只是中止要求操作系统无法提供的第一个资源单元的过程。许多操作系统都有文件句柄资源限制(Windows我认为有几千个句柄资源,你可以在像你这样的情况下遇到这种情况),而找不到自由句柄通常意味着操作系统对请求进程做了坏事。

需要更改程序的一个简单解决方案是同意,您的许多工作中不得超过N个一次写入。你需要一个所有工作都可以看到的共享信号量;大多数操作系统将为您提供一个设施,通常作为命名资源(!)。在启动任何作业之前将信号量初始化为N. 让每个写入作业在作业即将写入时从信号量获取资源单元,并在完成时释放该资源单元。完成此操作的代码量应该是一些插入高度并行应用程序的行。然后你调整N直到你不再有问题。 N == 1肯定会解决它,你可能会做得比这更好。