我正在尝试使用 cradle 作为 DB 驱动程序来测量一个简单的 Node.js 程序的吞吐量,该程序带有一个 CouchDB 后端。当我对程序加载时,我在 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 脚本。平均响应时间为 120ms,返回文档的平均大小为 3KB。
如您所见,我将 Cradle 的缓存设置为 false。为了调查,我查看了等待套接字的数量:它增加到大约 4000,此时它崩溃(netstat | grep WAIT | wc -l)
为了测试其他选项,我将缓存设置为 true。在这种情况下,程序不会崩溃,但等待套接字的数量会随着时间的推移增加到近 10000 个。
我还编写了与 Java Servlet 相同的程序(没有异步部分),它运行良好,等待套接字的数量没有超过 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