2011-02-03 42 views
5

我有一个perl脚本,用于准备输入二进制程序的文件并将二进制程序的执行提交给SGE排队系统版本6.2u2。SGE - QSUB未能在-sync模式下提交作业

通过-sync y选项提交作业,以允许父级perl脚本能够使用waitpid函数监视提交作业的状态。

这也非常有用,因为向父Perl脚本发送SIGTERM会将此信号传播给每个孩子,孩子们然后将这个信号转发到qsub上,从而正常终止所有关联的提交作业。

因此,能够使用此-sync y选项提交作业是相当重要的。

不幸的是,我不断收到以下错误:

Unable to initialize environment because of error: range_list containes no elements

通知 'containes' 的拼写不正确的。那是不是一个错字。它只是告诉你这个代码/错误消息的区域必须维护得不好。

产生此错误的提交提交未能生成STDOUT和STDERR文件*.e{JOBID}*.o{JOBID}。提交只是完全失败。

搜索谷歌这个错误消息只会导致未解决的帖子在晦涩的留言板上。

这个错误甚至不可靠地发生。我可以重新运行我的脚本,同样的作业不一定会产生错误。这似乎也不重要,我试图提交作业的节点。

我希望这里有人能弄明白这一点。因此

解答任何一个问题会解决我的问题:

  1. 这个错误在较新版本的SGE的坚持?
  2. 我可以改变我的qsub的命令行选项以避免这种情况吗?
  3. 这个错误信息在说什么?

回答

9

我们的网站在SGE 6.2u5中遇到了这个问题。我在邮件列表上发布了一些问题,但没有解决方案。到现在。

事实证明,该错误消息是假的。我通过阅读Univa github“open-core”回购中的更改日志来发现这一点。后来我看到了Son of Gridengine v8.0.0c发行说明中提到的问题。

这里是在GitHub库相关的提交:

什么错误消息应该说的是,你已经打了极限上的数字qsub sync -y工作在系统中。该参数被称为MAX_DYN_EC。在我们的版本,默认为99,高于增加的更改默认为1000

MAX_DYN_EC定义(从参阅sge_conf(5)手册页)是:

Sets the max number of dynamic event clients (as used by qsub -sync y and by Grid Engine DRMAA API library sessions). The default is set to 99. The number of dynamic event clients should not be bigger than half of the number of file descriptors the system has. The number of file descriptors are shared among the connections to all exec hosts, all event clients, and file handles that the qmaster needs.

您可以检查有多少您使用以下命令动态事件客户:

$ qconf -secl | grep qsub | wc -l 

我们已经通过qconf -mconf添加MAX_DYN_EC=1000qmaster_params。我测试过提交数百个qsub -sync y作业,我们不再遇到range_list错误。在MAX_DYN_EC更改之前,这样做会可靠地触发错误。

0

我找到了解决这个问题的方法 - 或者至少是解决方法。

我的目标是让qsub的个体实例保持在前台,因为它提交的作业仍在队列中或正在运行。这是通过-sync选项实现的,但导致了我在我的问题中描述的可怕的不可预知的错误。

此问题的解决方案是使用qrsh命令和now -n选项。这导致作业的行为类似于qsub -sync,因为我的脚本可以通过在qrsh实例上使用waitpid隐式监视提交的作业是否正在运行。

此解决方案唯一的缺陷是您正在操作的队列不能区分交互式节点(由qrsh提供)和非交互式节点(可由qsub访问)。如果存在差异(可能比非交互式节点的交互节点少),则此解决方法可能无效。

但是,由于我没有发现任何东西可以接近解决qsub -sync这个问题的地方,所以让这篇文章在整个互联网上发布给任何陷入类似情况的任性的灵魂。

+0

qsub和qrsh之间的区别是什么 – 2013-06-18 20:12:44