ここ

2016-04-12 7 views
0

コードですWindows 7のr102546ランニングここ

それがハングアップする前にこのループは約60K 80K回実行することができます。それ以降は何も起こりません。

私の同僚のコンピュータでは、おそらく40kから60k回です。しかし、このループは永遠に続くべきではないでしょうか?

私は、最初の接続の設定の平均実行時間をテストするベンチマークを実行していたので、私はちょうど終了し、すべての後に時間を終了し、最初の開始時刻を取得することはできません。

これは私が使用しているOSに関連していますか?

問題を知っているユーザーがいらっしゃいます。

============================================== ============

更新2016年4月13日:

ある日、私はこの質問を提起した直後、私はそれがだった愚かなものを疑問実現。そして、私が本当にやりたいことではありませんでした。だから私はそれをさらに説明します。ここで

は、テスト構造である:

私はconnections.Clientは、「接続 '」イベントでの「セットアップ」イベントを送信します扱うノードのサーバーを持っています。サーバー側でRedis購読チャネルが作成され、dbからいくつかの照会が行われ、クライアントの 'setup'イベントのコールバックが呼び出されます。 'setup'コールバックのクライアント切断ソケット。 'disconnect'イベントで再接続します。

クライアントコードは、高い同時実行をシミュレートするために、バックエンドおよびクラスタで実行するようにsocket.ioクライアントを使用します。

コードこれらのようなものです: 最初の接続時(機能の一部がここに記載されていない)

[server] 
socket.on('setup', function(data, callback) { 
    queryFromDB(); 
    subscribeToRedis(); 
    callback(); 
} 

[client] 
var requests = 1000; 
if (cluster.isMaster) { 
    for (var i = 0; i < 100; ++i) { 
    cluster.fork(); 
    } 
} else { 
    var count = 0; 
    var startTime = process.hrtime(); 
    socket = io.connect(...); 
    socket.on('connect', function() { 
    socket.emit('setup', {arg1:'...', arg2:'...'}, function() { 
     var setupEndTime = process.hrtime(); 
     calculateSetupTime(startTime, setupEndTime); 
     socket.disconnect(); 
    } 
    } 

    socket.on('disconnect', function() { 
    if (count++ < requests) { 
     var disconnectEndTime = process.hrtime(); 
     calculateSetupTime(startTime, disconnectEndTime); 
     socket.connect(); 
    } else { 
     process.exit(); 
    } 
    } 
} 

はわずか500または600回を作ることができます。何とか私はすべてのhrtime()コードを削除し、1000回にしました。しかし、後で私は2000時間(hrtime()コードなし)のような要求の数を上げました、それは再び終了できませんでした。

私は完全に混乱しました。昨日、私はそれがhrtimeに関係していると思っていましたが、もちろんそうではありませんでした。私はhrtimeによって誤解されました。

しかし、今何が問題になっていますか?

============================================== ===================== 更新2016年4月19日

私はこの問題を解決しました。

私のクライアントコードでは、新しいユーザーをシミュレートするためにsocket.disconnectとsocket.connectを使用しています。これは間違っています。

この場合、サーバーは切断された古いソケットを認識しないことがあります。ソケットオブジェクトを削除し、別のソケットオブジェクトを削除する必要があります。

接続数が切断回数に等しくないことがわかります。これによりコードが再接続できなくなるため、応答がないためループ全体がハングします。

+0

Windows 4.2のノード4.2.4で試してみましたが、それを止める前に100万回以上の実行がありました。 –

答えて

0

あなたのコードは無限ループです。ある時点で、これは常にシステムリソースを使い果たし、アプリケーションをハングアップさせます。

あなたのアプリケーションをハングアップさせる以外に、あなたが投稿したコードはほとんどありません。基本的に、それは次のように説明することができます

For the rest of eternity, or until my app hangs, (whichever happens first): 
    Get the current high-resolution real time, and then ignore it without doing anything with it. 
    Increment a number and log it 
Repeat as quickly as possible 

これはあなたがやりたいことは本当にある場合 - あなたはそれをacheivedているが、それは常にいくつかの時点でハングします。それ以外の場合は、希望する結果をさらに説明することができます。

+0

はい、私は馬鹿馬鹿しい疑問を感じました。私は私の質問、PLZのチェックを更新しました。今それは自分自身をうまく説明するかもしれません。 – user3736388

+0

"これはいつもシステムリソースを使い果たし、アプリケーションがハングアップする原因となります。 ---どのリソースが正確に消耗しますか? – zerkms