2014-05-19 25 views
0

我在Gentoo 3.13上使用Open MPI 1.8來管理通過服務器/客戶端概念從一個程序到另一個程序的數據傳輸。服務器和客戶端均作爲獨立進程通過mpiexec啓動。幾天後(這是一個相當繁重的計算...),我有時會收到錯誤Open MPI虛擬計時器已過期

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(...)並嘗試自己操作計時器。不過,我希望有另一種方式,因爲我不能總是修改客戶的源代碼。有什麼建議麼?

+1

「setitimer」,「SIGVTALRM」或「ITIMER_VIRTUAL」中的任何一個的Open MPI 1.8源代碼中都沒有出現過。我寧願看看你的程序或它可能用作問題原因的第三方庫。 –

+0

是的,在發佈我的問題之前,我已經檢查了「setitimer」,「SIGVTALRM」或「ITIMER_VIRTUAL」事件的Open MPI源代碼,我知道沒有。我認爲這可能與Linux內核更多地相關,而不是直接打開MPI。由於我測試了不同的設置而沒有總是涉及相同的第三方庫,我真的不確定這個問題是否與我的代碼中的庫有關... – Marcel

+0

您的程序寫入了什麼語言?看起來Haskell和Ruby都使用虛擬計時器來實現用戶級線程,並且在重負載下意外的信號開始彈出。 –

回答

0

由於此問題尚未得到正式答覆,我將代表Hristo(@HristoIliev:我希望這對你很好)。正如在我的問題的第一條評論中指出的那樣,Open MPI源代碼中沒有任何提示可能導致虛擬計時器到期。事實上,計時器問題與第三方庫有關,它使得代碼在不可預知的時間之後崩潰(取決於當前的機器負載)。