节点http服务器4 x更快保持活动禁用?

保持活力应该加快网站。

但是,当我在铬(本地主机:8080)运行这个死了简单的服务器,我得到这些加载时间:

  • 大约100毫秒“连接:closures”标题(即与setHeader行未注释)

  • 大约400毫秒,启用标准保持活动状态

我究竟做错了什么 ? 任何人都可以重现我的结果吗?

在过去的两天里,我一直在b my我的脑袋。

var fs = require('fs') // preparing 50 2k files ... var a = [], txt = '/*\n' + 'x'.repeat(2000) + '\n*/' for (var i = 0; i < 50; i++) { var name = '/test' + i + '.js' fs.writeFile(__dirname + name, txt) a.push('<script src="' + name + '"></script>') } fs.writeFile(__dirname + '/index.html', a.join('\n') + '\nhello world') var serve = function (req, res) { if (req.url === '/favicon.ico') { res.statusCode = 404; return res.end() } var pth = req.url + (req.url.match(/\/$/) ? 'index.html' : '') var s = fs.createReadStream(__dirname + pth) res.on('finish', function () { console.log('done', req.url) }) // THIS IS THE KILLER LINE. Just uncomment and restart the server. // on my system, the page loads 4 times FASTER // res.setHeader('Connection', 'close') res.statusCode = 200; s.pipe(res) } require('http').createServer(serve).listen(8080) 

编辑

为了清楚起见,使用标准快速服务器时的行为是相同的。 以下服务器代码将产生相同的结果(至less在我的系统上)

 // express server code var express = require('express') var app = express() var closeConnection = function (req, res, next) { res.setHeader('Connection', 'close'); next() } // THIS IS THE KILLER LINE. Just uncomment and restart the server. // on my system, the page loads 4 times FASTER // app.use('*', closeConnection) app.use(express.static(__dirname)) require('http').createServer(app).listen(8080) 

在你的服务器发生的事情和互联网上发生的事情之间有很大的区别,虽然我对你在这里报告的指标有点惊讶。 您没有说明如何捕捉指标或内容生成时间。 我们可以假设后者的时间小于100毫秒,这意味着在你的环回接口上发生了一些非常奇怪的事情,或者在这种情况下node.js做了一些非常奇怪的事情,或者浏览器任务的调度可能阻塞了web服务器任务。

当然,如果您发布的页面需要多个文件才能呈现,并通过互联网传递数据,禁用Keepalive应该会降低您的服务器负载和CPU使用率,但会增加页面加载时间。

我build议你开始添加其他组件,看看什么时候恢复预期的状态。 我将开始在单独的机器上运行客户端/运行多个客户端。

这似乎是由于默认的 Naglealgorithm 。 这会在发送TCP数据包之前导致延迟,等待可能在一个数据包中发送更多的数据以避免太小的数据包。

由于closures连接会导致挂起的数据包被立即发送,这不会影响不使用保持活动连接时的延迟。

正如在这个答案中所解释的那样,Nagle的algorithm可以像这样被禁用:

 server.on("connection", function (socket) { socket.setNoDelay(true); }); 

这应该解决延迟问题。 请注意,如果您不处理自己的缓冲区并发送大量小包,它可能会降低传输速率。

我注意到,当一个响应被pipe道化(导致使用分块传输编码)(甚至是一个Content-Length头部)时,会发生问题,但是,例如,在使用res.json()一次发送完整的响应时不会发生res.json()

而且,从Node.js 8.0.0开始,这个问题似乎就less得多了。 禁用Nagle的algorithm在我的情况下仍然有一个积极的影响。