【发布时间】:2014-07-07 05:38:46
【问题描述】:
我在 Gentoo 3.13 上使用 Open MPI 1.8 来管理通过服务器/客户端概念从一个程序到另一个程序的数据传输。服务器和客户端都通过mpiexec 作为单独的进程启动。几天后(这是一个相当繁重的计算......),我有时会收到错误
mpiexec noticed that process rank 0 with PID 17213 on node XXX exited on signal 26 (Virtual timer expired).
不幸的是,错误不能以可靠的方式重现,即错误并不总是出现,也不总是出现在程序流程的同一点。我在其他机器上也遇到过这个错误。我已经将问题追溯到ITIMER_VIRTUAL,它在到期时提供SIGVTALRM(例如,参见http://man7.org/linux/man-pages/man2/setitimer.2.html)。在手册页的 BUGS 部分中,它说
在负载非常重的情况下,ITIMER_REAL 计时器可能会在先前到期的信号传递之前到期。此类事件中的第二个信号将丢失。
我想知道ITIMER_VIRTUAL 是否也有类似的情况?有没有人遇到过类似的问题并可以确认错误?
我能想到的唯一解决方法是调用setitimer(...) 并尝试自己操作计时器。但是,我希望有另一种方法,因为我不能总是修改客户的源代码。有什么建议吗?
【问题讨论】:
-
在 Open MPI 1.8 源代码中没有出现任何
setitimer、SIGVTALRM或ITIMER_VIRTUAL。我宁愿查看您的程序或它可能用作问题原因的第 3 方库。 -
是的,在发布我的问题之前,我已经检查了 Open MPI 源代码中是否存在
setitimer、SIGVTALRM或ITIMER_VIRTUAL,我知道没有。我认为这可能与 Linux 内核有关,而不是直接与 Open MPI 相关。由于我测试了不同的设置,但并不总是涉及相同的第三方库,我真的不确定这个问题是否与我代码中的库有关...... -
你的程序是用什么语言编写的?似乎 Haskell 和 Ruby 都使用虚拟计时器来实现用户级线程,并且在重负载下会出现意外信号。
-
它是用 C/C++ 实现的。
-
我必须道歉。深入挖掘发现确实有一个第三方库在我们所有的测试设置中都使用过,并导致计时器到期。 @HristoIliev 您能否将您的评论更改为答案,以便我接受并关闭此问题?