5

次の質問は、ここで説明されている質問に関連する非常に詳細な質問です。前の質問

Ubuntu Server 14.04 LTS 64 ビット Amazon マシン イメージを使用して、R バージョン 3.2.3 を使用して c4.8xlarge (36 コア) で起動しました。

次のコードを検討してください

library(doParallel)
cl=makeCluster(35)
registerDoParallel(cl)

tryCatch({
  evalWithTimeout({
    foreach(i=1:10) %:%
      foreach(j=1:50) %dopar% {
        tryCatch({
          evalWithTimeout({
            set.seed(j)
            source(paste("file",i,".R", sep = "")) # File that takes a long time to run
            save.image(file=paste("file", i, "-run",j,".RData",sep=""))
          },
          timeout=300); ### Timeout for individual processes
        }, TimeoutException=function(ex) {
          return(paste0("Timeout 1 Fail ", i, "-run", j))

        })
      }
  },
  timeout=3600); ### Cumulative Timeout for entire process
}, TimeoutException=function(ex) {

  return("Timeout 2 Fail")

})

stopCluster(cl)

両方のタイムアウト例外が機能することに注意してください。個々のプロセスがタイムアウトし、必要に応じて累積プロセスがタイムアウトすることがわかります。

しかし、個々のプロセスが開始でき、不明な理由で 300 秒後にタイムアウトしないことがわかりました。個々のプロセスのタイムアウトにより、プロセスが「単に時間がかかる」だけではないことに注意してください。その結果、コアはこの単一のプロセスで占有され、3600 秒の累積タイムアウトに達するまで 100% で実行されます。累積タイムアウトが設定されていない場合、プロセスとそのコアが無期限に占有され、foreach ループが無期限に継続することに注意してください。累積時間に達すると、「Timeout 2 Fail」が返され、スクリプトが続行されます。

質問: 個々のワーカー プロセスが「ハング」して、個々のタイムアウト メカニズムでさえ機能しない場合、ワーカーを再起動して並列処理で引き続き使用できるようにするにはどうすればよいですか? ワーカーを再起動できない場合、累積タイムアウトに達したとき以外の方法でワーカーを停止できますか? そうすることで、単一の「エラー」プロセスのみが実行されている間に、プロセスが累積タイムアウトに達するのを「待機」する長時間継続しないようにすることができます。

追加情報 "暴走" プロセスまたは "ハング" ワーカーが行為に巻き込まれました。htop を使用してプロセスを見ると、100% CPU で実行されている状態でした。次のリンクは、プロセスの gdb バックトレース呼び出しのスクリーンショットです。

バックトレースのスクリーンショット

質問: 「暴走」プロセスの原因はバックトレースで特定されていますか?

4

1 に答える 1