5

我有一个 perl 脚本,它为二进制程序的输入准备文件,并将二进制程序的执行提交给 SGE 排队系统版本 6.2u2。

提交作业时可以-sync y选择允许父 perl 脚本使用 waitpid 函数监视已提交作业的状态。

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

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

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

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

请注意“包含”的不正确拼写。那不是错字。它只是向您展示了代码/错误消息的这个区域必须维护得多么糟糕。

产生此错误的尝试提交甚至无法生成 STDOUT 和 STDERR 文件*.e{JOBID}*.o{JOBID}. 提交完全失败。

在 google 上搜索此错误消息只会导致在晦涩的留言板上出现未解决的帖子。

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

我希望这里有人可以解决这个问题。

回答这些问题中的任何一个都可以解决我的问题:

  1. 此错误是否在较新版本的 SGE 中仍然存在?
  2. 我可以更改 qsub 的命令行选项以避免这种情况吗?
  3. 这个错误消息到底在说什么?
4

2 回答 2

9

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

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

以下是 github repo 中的相关提交:

错误消息应该qsub sync -y说的是您已达到系统中作业数量的限制。这个参数被称为MAX_DYN_EC。我们版本中的默认值为 99,上面的更改将默认值增加到 1000。

MAX_DYN_EC(来自 sge_conf(5) 手册页)的定义是:

设置动态事件客户端的最大数量(由 qsub -sync y 和 Grid Engine DRMAA API 库会话使用)。默认设置为 99。动态事件客户端的数量不应大于系统拥有的文件描述符数量的一半。文件描述符的数量在与所有 exec 主机、所有事件客户端和 qmaster 需要的文件句柄的连接之间共享。

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

$ qconf -secl | grep qsub | wc -l

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

于 2011-11-22T21:43:42.303 回答
0

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

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

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

此解决方案的唯一警告是,您正在操作的队列不得区分交互式节点(由 提供qrsh)和非交互式节点(由 访问qsub)。如果存在区别(交互式节点可能比非交互式节点少),那么此解决方法可能无济于事。

然而,由于我没有找到任何能qsub -sync像这样有效地解决问题的方法,所以让这篇文章通过互联网传播给任何陷入我类似情况的任性灵魂。

于 2011-02-11T21:46:44.123 回答