NodeJS / Http:套接字超时后的长延迟;保存以保持套接字打开?

时间:2018-02-19 09:54:16

标签: javascript node.js sockets http

考虑这个简单的服务器。它只是以文本形式返回请求的内容:

import {createServer} from 'http'

const server = createServer((req, res) => {
  let data = ''
  req.on('data', (chunk) => {
    data += chunk
  })

  req.on('end', () => {
    res.end(data)
  })
})

server.listen(56690, 'localhost', () => {
  global.console.log('server started')
})

当我发布到此服务器时,第一个请求需要~505 ms。后续请求只需几毫秒,只要我没有遇到keepAliveTimeout,从Node V8开始是5秒以上。也就是说,如果我在帖子后等待5秒钟,则下一个请求将再次采用> 500毫秒:

  • 首发:响应时间505ms
  • 立即发布:响应时间5ms
  • 立即发布:响应时间5ms
  • 立即发布:响应时间5ms
  • (等待6秒)
  • 发布:响应时间505ms

我知道节点服务器会在server.keepAliveTimeout(或server.timeout)之后销毁连接套接字。此外,我知道我可以通过调整这些设置来更改超时,例如server.keepAliveTimeout = 30000将保持活动超时时间增加到30秒。

我也可以通过

完全停用超时
  • 设置server.keepAliveTimeout = 0docs)和server.timeout = 0docs)或
  • 订阅timeout事件而不关闭那里提供的套接字,即。 server.on('timeout', (socket)=>{})server.onTimeout(0, ()=>{})。在这种情况下,套接字在超时时不会自动销毁(请参阅here:"但是,如果为服务器的超时事件分配了回叫功能,必须明确处理超时。")

我的问题:

  • 为什么Node需要这么长时间(500ms!)才能在超时后重新建立套接字?
  • 除了没有关闭套接字之外,有什么方法可以降低这个成本吗?
  • 在超时时关闭套接字或设置无限超时是否正确?我是否泄漏了资源?

环境:

  • 节点:v8.9.4和v9.5.0
  • 操作系统:Windows 10和Windows Server 2012 R2
  • CPU:Mobile Core i7 4x2.9 GHz和Xeon 4x2.4 GHz

0 个答案:

没有答案