2013-12-12 8 views
7

libuvでは、あまりに多くの作業やバグの多いコードでワーカースレッドを縛ることになります。ワーカースレッドやスレッドキューの健全性をチェックできる単純な関数はありますか? 100%確定的である必要はありません。なぜなら、ワーカースレッドが低速コードや無限ループにぶら下がっているかどうかを判断することが不可能であるからです。libuvワーカースレッドまたはワークキューヘルスチェック?

したがって、次のヒューリスティックのいずれかが良いでしょう:キューに入れられた項目の

  • 数はまだ上働いていません。これが大きすぎると、ワーカースレッドがビジー状態またはハングしている可能性があります。

  • libuvにはスレッドが強制終了する機構があります。ワーカースレッドはn秒後にチェックインしないと終了しますか?

+0

node.jsアプリまたはスタンドアロンの一部としてlibuvを使用していますか? –

答えて

1

この機能はlibuv自体には存在しません。そのような機能を提供するOSSは認識していません。殺害メカニズムの面では

は、libuvに焼きどれもありませんが、http://nikhilm.github.io/uvbook/threads.html#core-thread-operationsが示唆:

うまく設計されたプログラムが長く、すでに実行を開始している 労働者を実行し終了する方法を持っているでしょう。そのような作業者は、 は、メインプロセスだけが シグナル終結に設定する変数を定期的にチェックできます。

-1

これがnodejsの場合は、単純なモニタスレッドが行いますか?イベントキューの内部情報を取得する方法はわかりませんが、イベントキューにトレーサを挿入して、スレッドが適時に実行されていることを監視できます。 (これは、まだ実行されていないスレッドの数ではなく、スレッドが所定の時間内に実行されているかどうかによって負荷を測定します)。

モニタスレッドは、自身を再キューして、少なくとも10ミリ秒ごと(または累積ブロッキング・ミリ秒が許容される最大値)です。 nodejはスレッドをラウンドロビンで実行するので、モニタスレッドが所定の時間に実行された場合、他のすべてのスレッドが同じ10ミリ秒のウィンドウ内で実行される可能性があることがわかります。ノード内のようなもの:

// like Date.now(), but with higher precision 
// the extra precision is needed to be able to track small delays 
function dateNow() { 
    var t = process.hrtime(); 
    return (t[0] + t[1] * 1e-9) * 1000; 
} 

var _lastTimestamp = dateNow(); // when healthMonitor ran last, in ms 
var _maxAllowedDelay = 10.0;  // max ms delay we allow for our task to run 
function healthMonitor() { 
    var now = dateNow(); 
    var delay = now - _lastTimestamp; 
    if (delaly > _maxAllowedDelay) { 
     console.log("healthMonitor was late:", delay, " > ", _maxAllowedDelay); 
    } 
    _lastTimestamp = now; 
    setTimeout(healthMonitor, 1); 
} 

// launch the health monitor and run it forever 
// note: the node process will never exit, it will have to be killed 
healthMonitor(); 

アラートメッセージを抑制し、クリーンシャットダウンをサポートすることは、読者に残された課題です。

関連する問題