Node.js性能因文件格式不同而有所不同?

时间:2013-11-25 20:25:18

标签: node.js png buffer jpeg

我们公司在Node.js中编写了一个主要处理动态内容的服务器,但偶尔我们需要提供各种格式的文件,包括图像。它在大多数情况下都可以正常工作,但性能会因文件格式而异。这些文件只存储在磁盘上,我们没有对Node中的图像或其他文件进行任何处理。

例如,我们测试了几个JPG,PNG,PDF和EXE文件,并且似乎有一些Node影响了不同的格式。 PNG文件最差,JPG和EXE似乎是最好的。文件大小似乎不是问题(JPG图像远大于PNG传输速度更快),除非我的理解不正确,否则大小不应该是一个因素,因为它们都存储在Buffer对象中。

原始服务器使用Express,因此我们希望确保不会以某种方式干扰并将此小型裸机文件服务器作为测试编写。它旨在通过仅在启动时加载文件一次来排除磁盘访问时间(可以忽略不计,至少可以说)。使用Apache Benchmark,我们发现问题仍然存在于这样一个简单的实现中。我们一直在开发Windows,但在Ubuntu上也看到了相同的结果。我们测试了没有Content-type头的所有情况(以及因此mime查找调用),欺骗mime类型(因此PNG将有一个“image / jpeg”头,反之亦然),并更改文件扩展名,所有这些没有明显的影响。这是测试服务器:

var fs = require("fs"),
  http = require("http"),
  filePath = process.argv[2];
  fileData = fs.readFileSync(filePath),
  mimeType = require("mime").lookup(filePath);

var server = http.createServer(function (req, res) {
  res.writeHead(200, { "Content-type": mimeType });
  res.end(fileData);
});

server.listen(3000);
console.log("File server started. Serving: " + filePath);

process.on("uncaughtException", function (err) {
  console.log("Caught exception: " + err.stack);
});

我们在这里缺少什么?我们似乎无法找到有关此问题的任何文档或解释。我们对更改为不同的服务器平台不感兴趣,我们只希望文件以相同的速率传输,而不管格式如何。为什么某些文件格式比其他文件格式花费的时间更长?

提供以下两个测试结果供参考,测试多次运行,结果通常在此范围内。

ab -n 1000 -c 100 http://127.0.0.1:3000/

JPEG,440KB

Concurrency Level:      100
Time taken for tests:   4.430 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      497711000 bytes
HTML transferred:       497610000 bytes
Requests per second:    225.73 [#/sec] (mean)
Time per request:       443.009 [ms] (mean)
Time per request:       4.430 [ms] (mean, across all concurrent requests)
Transfer rate:          109714.73 [Kbytes/sec] received

PNG,485KB

Concurrency Level:      100
Time taken for tests:   75.969 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      451543000 bytes
HTML transferred:       451443000 bytes
Requests per second:    13.16 [#/sec] (mean)
Time per request:       7596.900 [ms] (mean)
Time per request:       75.969 [ms] (mean, across all concurrent requests)
Transfer rate:          5804.47 [Kbytes/sec] received
编辑:似乎Symantec Endpoint Protection是罪魁祸首,尽管我们认为它不会影响Ubuntu测试的结果(它不在该机器上)。文件现在正确传输。

0 个答案:

没有答案