【问题标题】:node.js http server: how to get pending socket connections?node.js http 服务器:如何获取挂起的套接字连接?
【发布时间】: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的事件,所以我认为请求的往返如下:

  1. 客户端连接到服务器套接字 --> 3-way-handshake,套接字持续状态CONNECTED(或ESTABLISHED?!)然后在节点事件connection被发射。
  2. 节点 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,这怎么可能?

【问题讨论】:

    标签: node.js sockets http


    【解决方案1】:

    IIRC 对于您正在侦听的特定 IP 和端口,您可以只计算有多少状态为 SYN_RECV 的连接。是使用子进程执行 netstat 和 grep(或类似实用程序)以获取该信息,还是编写绑定以使用 *nix C API 获取此信息,这取决于您。

    【讨论】:

    • 好点。所以我需要知道当前的接受队列有多大。据我了解,客户端连接到服务器套接字,完成了 3 次握手,然后,套接字持续状态为SYN_RECV,直到应用层(http 服务器)接受此套接字来处理请求,或者我错了?
    • 我有疑问,因为如果我连续阅读netstat -an,几乎没有(或至少1-2)SYN_RECV。只要应用程序层没有接受它,一个套接字是否处于状态CONNECTED?在 http(keep-alive 选项除外)中导致每个请求 = 新套接字。
    猜你喜欢
    • 2018-05-07
    • 2014-04-12
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2011-04-27
    • 2019-12-10
    相关资源
    最近更新 更多