我正在将我的应用程序转换为 Node.js 集群,我希望它能够提高我的应用程序的性能。
目前,我正在将该应用程序部署到 2 个 EC2 t2.medium 实例。我有 Nginx 作为代理和 ELB。
这是我的 Express 集群应用程序,从文档来看它是相当标准的。
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'
这是我的表演后的表现。
我认为这比以前更糟糕。
我使用加特林进行性能测试,这是代码。
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))
}
我将其部署到我的加特林集群中。因此,我有 3 个 EC2 实例在 30 秒内向我的应用程序发出了 15,000 个请求。
问题是,我可以做些什么来提高应用程序的性能,还是我只需要添加更多机器?
我正在测试的路线非常简单,我收到请求并将其发送到 RabbitMQ,以便可以进一步处理。所以,该路线的响应速度相当快。