nodejs每秒请求和并发调用

时间:2015-11-12 23:23:59

标签: node.js performance benchmarking

我在Debian 7 x64上运行节点v0.12.7,我想在具有4GB内存的16核虚拟专用服务器上对其性能进行基准测试。

我正在运行以下简约代码:

// server.js
var http = require('http');
http.createServer(function (request, response) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World');
}).listen(80,"0.0.0.0");

我在另一个终端中使用此命令启动它:

node server.js

此时节点正在一个核心上运行。然后我使用ab来用这个命令测试它的性能:

ab -n 10000 -c 100 -k http://127.0.0.1/

...并获得以下结果:

...
Requests per second:    3925.81 [#/sec] (mean)
...
Percentage of the requests served within a certain time (ms)
50%     35
...

我想知道你是否有人做过类似的测试,如果你:

  • 得到了更好的结果
  • 获得了相同的结果,但能够调整您的节点应用/服务器,以获得更高的请求/和/或更低的延迟。

我不得不提一下,在群集模式下使用pm2运行它有15个内核,这让我有4500个请求/秒,这让我觉得我错过了另一个瓶颈。

感谢您对此主题的任何想法。 保罗

2 个答案:

答案 0 :(得分:2)

发布我的结果(希望它可以让其他人受益):

在MacBook Pro 2.2 GHz,Core I7,16 GB上。使用JMeter完成测试。在处理15K要求后,ab冻结并抛出一些错误。

用户数:200 每个用户发出5000个请求。

结果:没有节点群集

Total Samples Processed: 1000000
Throughput: 22419 req/sec
Total Time: 44 seconds

结果:使用群集 - 8个节点(= numCpus)

Total Samples Processed: 1000000
Throughput: 36091 req/sec
Total Time: 27 seconds

结果:使用群集 - 6个节点(总cpus的3:1)

Total Samples Processed: 1000000
Throughput: 36685 req/sec
Total Time: 27 seconds

结果:使用群集 - 4个节点(= numCpus / 2)

Total Samples Processed: 1000000
Throughput: 35604 req/sec
Total Time: 28 seconds

真的很棒。对于具有4/6/8节点的群集,性能几乎相同。

服务器代码如下。

"use strict";

var http = require('http');
const PORT = 8080;

var total = 0;

var server = http.createServer(function(request, response) {
  total++;

  if ((total % 1000) === 0) {
    console.log("Completed:" + total);
  }
  response.end('It Works!! Path Hit: ' + request.url);
});

server.listen(PORT, function() {
  console.log("Server listening on: http://localhost:%s", PORT);
});

以下代码用于群集。

"use strict";

const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
var http = require('http');
const PORT = 8080;

var total = 0;

//numCPUs = 6;
//numCPUs = 4

console.log("Number of CPUs" + numCPUs);

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
}
else {
  var server = http.createServer(function(request, response) {
    total++;

    if ((total % 1000) === 0) {
      console.log("Completed:" + total);
    }
    response.end('It Works!! Path Hit: ' + request.url);
  });

  server.listen(PORT, function() {
    console.log("Server listening on: http://localhost:%s", PORT);
  });
}

答案 1 :(得分:0)

我不确定这个问题的重点,而是对MacBook Pro进行快速测试,配备16GB RAM和Node 5.0.0

Requests per second:    6839.72 [#/sec] (mean)
Time per request:       14.620 [ms] (mean)

Percentage of the requests served within a certain time (ms)
50%     14