一个简单的Node.JS基准

我正试图确定这是否是一个公平的基准。 目标是试图查看有多less并发连接与各种规模的Node.JS可以处理的有效负载。 代码如下。

var express = require('express'); var Sequelize = require('sequelize'); var fs = require('fs'); var app = express(); var data; var filename = process.argv[2] || './start.json'; console.log("Using: " + filename); data = fs.readFileSync(filename); var blockSize = 250000; app.get('/start', function (req, res) { // Break up data in blocks. Works to super high concurrents. // for(var i = 0; i < data.length; i+=blockSize) // res.write(data.slice(i, i+blockSize)); // Can only handle about 600 concurrent requests if datasize > 500KB res.send(data); }); app.listen(3000, function () { console.log('Listing on 3000.'); }); 

正如在评论中所述,如果有效负载大小大于500KB,并且有500个并发,它将在负载testing客户机上得到“由对等体重置的连接”。 如果你把数据分成几部分并把它写成大块的话,那么在这个数据开始之前,它可以存活得高得多。 股票节点和快递都展示了这种行为。

 data = fs.readFileSync(filename); 

同步方法是nodejs杀手。 它实际上阻止了所有请求的事件循环,使得演出真的很糟糕。

尝试这个 :

 var express = require('express'); var Sequelize = require('sequelize'); var fs = require('fs'); var app = express(); var filename = process.argv[2] || './start.json'; var blockSize = 250000; app.get('/start', function (req, res) { // Break up data in blocks. Works to super high concurrents. // for(var i = 0; i < data.length; i+=blockSize) // res.write(data.slice(i, i+blockSize)); // Can only handle about 600 concurrent requests if datasize > 500KB console.log("Using: " + filename); fs.readFile(filename, function (err, data) { if (err) throw err; res.send(data); }); }); app.listen(3000, function () { console.log('Listing on 3000.'); }); 

作为一种替代方法,您可以创build一个读取stream并对其进行pipe理,以下是基于您的代码的示例

 var express = require('express'); var fs = require('fs'); var app = express(); var data; var filename = process.argv[2] || './data.json'; console.log("Using: " + filename); data = fs.readFileSync(filename); var readStream = fs.createReadStream(filename); app.get('/start', function (req, res) { // Can only handle about 600 concurrent requests if datasize > 500KB //res.send(data); readStream.pipe(res); });