node.js HTTP服务器响应速度较慢,文件较小

我正在为node.js中的一个简单的HTTP服务器开发一个性能testing:

var http = require('http'); var fs = require('fs'); var NO_CACHE = true; var fileCache; var sendFile = function(conn, file) { conn.writeHead(200, {'Content-Type': 'text/html', 'Content-Length': file.length}); conn.write(file); conn.end(); } http.createServer(function (req, res) { if (NO_CACHE || fileCache == undefined) { fs.readFile('index.html', function(err, file) { fileCache = file; sendFile(res, fileCache); }); } else { sendFile(res, fileCache); } }).listen(8080, 'localhost'); 

(代码也可以在这里find)。

服务器始终读取文件“index.html”并将其返回。 我意识到,如果文件大于或等于65483字节(非常接近2 ^ 16,但不是确切的),则服务器在1-3毫秒内给出结果,如果文件较小,则持续38-40毫秒给出一个响应(index.html文件正好可以在这里find65483字节)。 响应中的头部大约是128个字节:

 Content-Type: text/html Content-Length: 65483 Date: Thu, 14 May 2015 13:58:21 GMT Connection: keep-alive 

前两个标题由服务器设置,最后两个标题由任何中间件自动设置。 文件大小加上头两个头是65533字节,非常接近65535(2 ^ 16 – 1),区别可能是因为在这两个头回车。

这种行为对我来说看起来很奇怪,因为更大的文件应该持续更长时间的阅读,而且时间的差别非常大。

我用node.js 0.10.38和0.12.2得到了相同的结果。 对于性能testing,我使用了jMeter 2.13。

为了logging,这种行为不会发生在jMeter中使用vert.x与相同的文件和相同的testing计划(与vert.x服务器,更大的文件需要更多的时间来阅读)。

如果有人知道原因可能是什么(以及如何避免小文件),我很好奇知道。

正如bayou.io指出的那样,行为是由TCP noDelay引起的。 我添加到服务器:

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

并按照预期在1-3毫秒内给出响应。