障害回復,トレース,デバッグ
リモートカーネルの失敗
使用中のリモートカーネルには,ハードウェア,ネットワーク,ソフトウェアの問題により,いつでも障害が起こり得る.リモートカーネルの失敗は,次回 Parallel Computing Toolkit がカーネルにコマンドを送ろうとしたとき,またはカーネルから結果を読み込もうとしたときに知らされる.ユーザには警告メッセージParallel::rdeadが表示されてリモートカーネルの失敗が知らされる.
失敗したカーネルに割り当てられていたプロセスがある場合,そのようなプロセスは失われる.このようなプロセスにWaitを使っていたものがあったら,そのプロセスは戻ることがないため,プログラムは永久に終了しない.
Parallel Computing Toolkit はリモートカーネルに送信されたコマンドを追跡しているので,リモートカーネルが失敗したら,これらのコマンドを利用できる別のリモートカーネルに再割当てすることができる.あるいは,待機中のプロセスを終了し,失敗を表す$Failedを結果として返すだけの場合もある.選択される動作は変数$RecoveryModeの値で決まる.
$RecoveryMode | 障害回復モードの現在の設定を与える |
$RecoveryMode = None | 障害回復は行わない |
$RecoveryMode = Abandon | 失敗したカーネルに割り当てられたプロセスは結果$Failedを返す(デフォルト) |
$Recovery Mode = ReQueue | 失敗したカーネルのプロセスを別のカーネルに割り当てる |
ReQueue回復モードでは,1つでも利用できるカーネルがある限り,計算を終了することができる.しかし,リモート計算が副次的な影響を及ぼしていたり,計算が特定の数の利用できるリモートカーネルに依存していたりする場合は,正しくない結果が返されることもある.副次的な影響は,通常仮想共有メモリを使っている場合に現れる.障害が生じたカーネルのプロセスが共有リソースを独占して解放しなかった場合にはデッドロックが起る可能性もある.
Abandon回復モードを使うと独自の障害回復メソッドを実装することができる.
障害回復はプロセスがParallelSubmit[]で始まり,WaitAll[]で集められる場合にのみ影響する.ParallelEvaluate[]等,他の並列コマンドは失敗したリモートカーネルを扱うことができないので,失敗したら常に$Failedを返す.
トレースとデバッグ
並行プログラムのデバッグは厄介である.Parallel Computing Toolkit は計算の進捗状況を監視するためのトレース機能を提供する.これらの機能を使うには,ツールキット自体をロードする前にデバッグパッケージをロードしなければならない.
SetOptions[$Parallel,opts…] | Parallel Computing Toolkit のデバッグオプションを設定する |
Options[$Parallel] | 現在のデバッグオプション設定を与える |
Tracers ->{tracers…} | トレースイベントを設定する |
TraceHandler->handler | トレースイベントをどのように扱うかを指定する.可能な値には"Print"と"Save"が含まれる |
TraceList[] | トレースイベントの現在のリストを与える |
newTraceList[] | トレースリストを初期化する |
OptionValues[Tracers] | 可能なトレーサのリストを与える |
WSTP | Wolfram Symbolic Transfer Protocol (WSTP)のイベントをトレースする |
SendReceive | Send/Receive操作をトレースする |
Queueing | プロセススケジューリング(ParallelSubmit/WaitAll)をトレースする |
SharedMemory | 共有変数のアクセスをトレースする |
イベントをトレースする
特定のイベントを見るには,SetOptions[$Parallel,Tracers{tracers …}]で希望のイベントのクラスを指定する.その後は選択したイベントが生じるたびにメッセージが表示される.
例えば,ParallelMapは内部でSendとReceiveを使うため,計算がどのように分割されてリモートカーネルに送られるのかが分かる.
トレースイベントを保存する
ツールキットではトレースイベントを表示する代りに,後で分析に使えるようにリストに保存することができる.まず,トレースシステムがイベントを保存するように設定し,トレースリストを初期化する.
イベントのリストがTraceList[]で利用できるようになった.これを見る最もよい方法はTableFormを使う方法である.
リストをリセットするにはnewTraceList[]を使い,トレースを終了するには前述のようにオフにする.
トレースイベントの形式
WSTP
MathLink トレースメッセージについては「リモートカーネルを開始する」に記述されている.
SendReceive
という形式を持つ.ここで kernel は使用するカーネル,expr は送受信される式,n はカーネルのキューの大きさである.
Queueing
Queueingトレースメッセージは以下の形式のいずれかを持つ(pid はプロセスID,slave はリモートカーネル).
SharedMemory
SharedMemoryトレースメッセージは次の形式を持つ.
ここで kernel は共有変数にアクセスしたカーネル,access は変数がどのようにアクセスされたかについての記述である.
並列プログラムの放棄
ローカル(マスター)カーネルは並行計算の途中で中断および放棄することができる.すでにリモートカーネル上にある評価は引き続き実行される.放棄の後,Waitを使ってまだキューにあるプロセスを待つ,ResetQueuesを使ってそれらを廃棄する,AbortKernels[]を使ってリモートカーネルを放棄するのいずれかを行う.
ParallelEvaluate[]等,その他の操作をすべて放棄した場合は,続けてAbortKernels[]を使わなければならない.
ResetQueues[] | 実行中の全プロセスが終了するのを待ち,キューをすべてクリアする |
AbortKernels[] | リモートカーネルをすべて放棄し,それらを再び利用できるようにする |
CloseKernels[] | 全リモートカーネルへのWSTP接続を閉じる |
リモートカーネルを中断するための信頼できる方法は必ずしも存在するとは限らない.ResetQueues[] は中断を避けるために,実行中のすべての計算が正常に終了するのを待つ.これに時間がかかりすぎる場合は,マスターカーネルの放棄をもう一度試みてからAbortKernels[]を使う.
AbortKernels[]は応答しないリモートカーネルをすべて放棄しようとする.反応に失敗したカーネルは閉じられる.
リモートカーネルが計算を行っている途中でローカルカーネルを終了したら,リモートカーネルは実行し続けることがあるので,放棄するか,適切なオペレーティングシステムコマンドで終了するかしなければならない.