我在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(...)
並嘗試自己操作計時器。不過,我希望有另一種方式,因爲我不能總是修改客戶的源代碼。有什麼建議麼?
「setitimer」,「SIGVTALRM」或「ITIMER_VIRTUAL」中的任何一個的Open MPI 1.8源代碼中都沒有出現過。我寧願看看你的程序或它可能用作問題原因的第三方庫。 –
是的,在發佈我的問題之前,我已經檢查了「setitimer」,「SIGVTALRM」或「ITIMER_VIRTUAL」事件的Open MPI源代碼,我知道沒有。我認爲這可能與Linux內核更多地相關,而不是直接打開MPI。由於我測試了不同的設置而沒有總是涉及相同的第三方庫,我真的不確定這個問題是否與我的代碼中的庫有關... – Marcel
您的程序寫入了什麼語言?看起來Haskell和Ruby都使用虛擬計時器來實現用戶級線程,並且在重負載下意外的信號開始彈出。 –