クレードルを DB ドライバーとして使用して、CouchDB バックエンドで単純な Node.js プログラムのスループットを測定しようとしています。プログラムに負荷をかけると、30 秒以内に次のエラーが表示されます。
EADDRINUSE、アドレスは既に使用されています
これが私のプログラムです:
var http = require ('http'),
url = require('url'),
cradle = require('cradle'),
c = new(cradle.Connection)('127.0.0.1',5984,{cache: false, raw: false}),
db = c.database('testdb'),
port=8081;
http.createServer(function(req,res) {
var id = url.parse(req.url).pathname.substring(1);
db.get(id,function(err, doc) {
res.writeHead(200,{'Content-Type': 'application/json'});
res.write(JSON.stringify(doc));
res.end();
});
}).listen(port);
console.log("Server listening on port "+port);
50 人の同時ユーザーで JMeter スクリプトを使用しています。平均応答時間は 120 ミリ秒で、返されたドキュメントの平均サイズは 3 KB です。
ご覧のとおり、Cradle のキャッシュを false に設定しました。調査するために、待機中のソケットの数を調べました。約 4000 まで増加し、その時点でクラッシュします (netstat | grep WAIT | wc -l)。
他のオプションをテストするために、キャッシュを true に設定しました。この場合、プログラムはクラッシュしませんが、待機中のソケットの数は時間の経過とともにほぼ 10000 に増加します。
また、Java サーブレットとして同じプログラム (非同期部分を除く) を作成しましたが、待機中のソケットの数が 20 をはるかに超えることなく正常に実行されました。
私の質問は、「EADDRINUSE、アドレスは既に使用されています」というエラーが表示されるのはなぜですか? 待機中のソケットの数が非常に多いのはなぜですか?
PS: これは、netstat|grep WAIT の出力の抜粋です。
tcp4 0 0 localhost.5984 localhost.58926 TIME_WAIT
tcp4 0 0 localhost.5984 localhost.58925 TIME_WAIT
tcp4 0 0 localhost.58924 localhost.5984 TIME_WAIT
tcp4 0 0 localhost.58922 localhost.5984 TIME_WAIT
tcp4 0 0 localhost.5984 localhost.58923 TIME_WAIT