Nodejs 每秒请求数和并发调用数

Pau*_*aul 4 performance benchmarking node.js

我在 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");
Run Code Online (Sandbox Code Playgroud)

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

node server.js
Run Code Online (Sandbox Code Playgroud)

此时节点正在一个核心上运行。然后我使用 ab 通过以下命令测试其性能:

ab -n 10000 -c 100 -k http://127.0.0.1/
Run Code Online (Sandbox Code Playgroud)

...并得到这些结果:

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

我想知道你们中是否有人做过类似的测试,并且您是否:

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

我必须提到的是,在具有 15 个核心的集群模式下使用 pm2 运行它使我达到每秒 4500 个请求,这让我认为在某个地方还有另一个我错过的瓶颈。

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

Raj*_*vam 5

发布我的结果(希望对其他人有用):

在 MacBook Pro 2.2 GHz、酷睿 I7、16 GB 上。测试是使用JMeter完成的。ab 在处理 15K 请求后冻结并抛出一些错误。

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

结果:没有节点集群

Total Samples Processed: 1000000
Throughput: 22419 req/sec
Total Time: 44 seconds
Run Code Online (Sandbox Code Playgroud)

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

Total Samples Processed: 1000000
Throughput: 36091 req/sec
Total Time: 27 seconds
Run Code Online (Sandbox Code Playgroud)

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

Total Samples Processed: 1000000
Throughput: 36685 req/sec
Total Time: 27 seconds
Run Code Online (Sandbox Code Playgroud)

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

Total Samples Processed: 1000000
Throughput: 35604 req/sec
Total Time: 28 seconds
Run Code Online (Sandbox Code Playgroud)

真的很棒。对于 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);
});
Run Code Online (Sandbox Code Playgroud)

以下代码用于聚类。

"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);
  });
}
Run Code Online (Sandbox Code Playgroud)