2011-07-19 10 views
1

EC2でnode.jsスクリプトを実行して、ノードHTTPサーバーを子プロセスとして監視および実行しています。実行中Node.jsプロセスの実行が遅くなる

残念なことに、この子サーバーはゆっくりと速度が低下します。同じ要求が2秒以上かかると、0.2秒かかる要求はドラッグアウトを開始します。

このデバッグの一環として、子サーバーを強制終了して別のサーバーを起動するために2時間の再起動を実装しました。これは効果がありません! HTTPサーバーの子プロセスが再起動されますが、まだ遅いです!この親スクリプトを再起動するだけで、子がより速くなります。

なぜ、HTTPサーバーが強制終了され、再起動されても速度が低下しますか?

環境はEC2 Ubuntuサーバー上で0.4.9 Node.jsです。親スクリプトは以下の通りです。

var http = require('http'); 

var server, 
    firstOperated = null; 
    lastOperated = null; 

function operating(str) { 
    return (str.toString().substring(0, 13) != 'SERVER ONLINE') ? log(str) : 
     lastOperated = new Date(); 
} 

function log(str) { 
    str = str.toString('utf8'); 

    if (str.length) console.log(str.replace(/\n+$/gim, '')); 
} 

function createServer() { 
    if (server) { 
     server.kill('SIGKILL'); 

     return console.log('KILLED NON RESPONSIVE SERVER');   
    } 

    server = require('child_process').spawn('node', [__dirname + '/http.js', 80]); 

    firstOperated = new Date(); 

    server.stdout.on('data', operating); 
    server.stderr.on('data', log); 

    server.on('exit', function(code) { 
     lastOperated = null; 
     server = null; 

     console.log("SERVER EXITED: " + code); 
    }); 
} 

createServer(); 

setInterval(function() { 
    if (new Date() - firstOperated > 1000 * 60 * 60 * 2) return createServer(); 

    if (new Date() - lastOperated < 5 * 1000) return; // server seems to be operating ok 

    createServer(); 
}, 5 * 1000); 
+2

createServer()を呼び出すたびにrequire( 'child_process')を呼び出すのはなぜですか? createServer()の外部でrequire( 'child_process')を呼び出すと、改善されますか? – Ivan

答えて

1

EC2インスタンスは、マイクロインスタンスであり、そしてあなたは約15秒の使用量よりも多くのために高いCPUで実行されている、あなたは(深刻)スロットルされます。これは症状を説明するでしょう。解決策は、小さなインスタンスまでスケールアップすることです。 (CPUサイクルを消費するNodeプロセスである必要はありません)。

関連する問題