【发布时间】:2016-03-22 07:26:25
【问题描述】:
我正在将我的应用程序转换为 node.js 集群,我希望它可以提高我的应用程序的性能。
目前,我正在将应用程序部署到 2 个 EC2 t2.medium 实例。我有 Nginx 作为代理和 ELB。
这是我的快速集群应用程序,它在文档中非常标准。
var bodyParser = require('body-parser');
var cors = require('cors');
var cluster = require('cluster');
var debug = require('debug')('expressapp');
if(cluster.isMaster) {
var numWorkers = require('os').cpus().length;
debug('Master cluster setting up ' + numWorkers + ' workers');
for(var i = 0; i < numWorkers; i++) {
cluster.fork();
}
cluster.on('online', function(worker) {
debug('Worker ' + worker.process.pid + ' is online');
});
cluster.on('exit', function(worker, code, signal) {
debug('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal);
debug('Starting a new worker');
cluster.fork();
});
} else {
// Express stuff
}
这是我的 Nginx 配置。
nginx::worker_processes: "%{::processorcount}"
nginx::worker_connections: '1024'
nginx::keepalive_timeout: '65'
我在 Nginx 服务器上有 2 个 CPU。
这是我之前的表演。
我得到 1,500 个请求/秒,这非常好。现在我想我会增加 Nginx 上的连接数,以便我可以接受更多请求。我这样做。
nginx::worker_processes: "%{::processorcount}"
nginx::worker_connections: '2048'
nginx::keepalive_timeout: '65'
这是我的表演后。
我认为这比以前更糟。
我使用 gatling 进行性能测试,代码如下。
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class LoadTestSparrowCapture extends Simulation {
val httpConf = http
.baseURL("http://ELB")
.acceptHeader("application/json")
.doNotTrackHeader("1")
.acceptLanguageHeader("en-US,en;q=0.5")
.acceptEncodingHeader("gzip, defalt")
.userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0")
val headers_10 = Map("Content-Type" -> "application/json")
val scn = scenario("Load Test")
.exec(http("request_1")
.get("/track"))
setUp(
scn.inject(
atOnceUsers(15000)
).protocols(httpConf))
}
我将它部署到我的 gatling 集群。因此,我有 3 个 EC2 实例在 30 秒内向我的应用程序发出 15,000 个请求。
问题是,我可以做些什么来提高我的应用程序的性能,或者我只需要添加更多机器?
我正在测试的路由非常简单,我收到请求并将其发送到 RabbitMQ,以便进一步处理它。因此,该路线的响应非常快。
【问题讨论】:
-
您的失败请求较少。怎么可能更糟?你有多少并发连接?我的猜测是,在第一种情况下你用完了 worker_connections,而在第二种情况下你用完了节点的应用程序功能。
-
我查看了每秒的请求数,我认为这是因为我的应用程序速度较慢,因此无法接受很多连接?
-
性能是一件复杂的事情。假设您的应用程序可以在 10 毫秒内响应。这意味着它每秒可以处理大约 100 个请求。但是如果你一次发送 200 个请求,其中一些将不得不等待将近 2 秒,这意味着他们将使用更多的连接等等......
标签: javascript node.js performance nginx gatling