【发布时间】:2014-04-19 15:28:11
【问题描述】:
在这样的基本节点 http 服务器上:
var http = require('http');
var server = http.createServer(function(req, res){
console.log("number of concurr. connections: " + this.getConnections());
//var pendingConnections = ???
});
server.maxConnections = 500;
server.listen(4000);
如果我一次向服务器发送 500 个请求,则并发数。连接数约为 350。硬限制设置为 500(net.server.backlog 也是),我想知道,当新请求开始时,如何访问挂起的连接数(本例中最多 150 个)。
所以我认为我必须访问在端口 4000 上侦听的底层套接字才能获取此信息,但直到现在我无法获取它。
编辑
查看node-http有一个名为connection的事件,所以我认为请求的往返如下:
- 客户端连接到服务器套接字 --> 3-way-handshake,套接字持续状态
CONNECTED(或ESTABLISHED?!)然后在节点事件connection被发射。 - 节点 http 服务器接受这个挂起的连接并通过发出
request开始处理请求
所以连接数必须至少与请求数一样大,但是通过以下示例我无法确认:
var http = require('http');
var activeRequets = 0;
var activeConnections = 0;
var server = http.createServer(function(req, res){
activeRequests++;
res.send("foo");
});
server.on('connection', function (socket) {
socket.setKeepAlive(false);
activeConnections++;
});
setInterval(function(){
console.log("activeConns: " + activeConnections + " activeRequests: " + activeRequests);
activeRequests = 0;
activeConnections = 0;
}, 500);
server.maxConnections = 1024;
server.listen(4000, '127.0.0.1');
即使我用 1000 个并发连接对服务器施加压力并在响应中增加一个延迟,activeRequests 也大多与activeConnections 一样高。更糟糕的是,activeRequests 往往高于 activeconnections,这怎么可能?
【问题讨论】: