我们正在Node.JS中为iPhone应用程序制作后端应用程序。 我们在EC2实例(t2.medium)上部署了我们的后端应用程序(Node),该实例使用安装在另一个EC2实例(t2.small)上的MySQL服务器。在进行负载测试时,我们看到CPU正在使用100%。我们试图找出原因,但到目前为止还没找到。
我们在server.js中使用以下模块。
var express = require('express');
var session = require('express-session');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var log = require('./utils/logger');
var userRequestHandler = require("./requestHandlers/userRequestHandler");
var authenticationHandler = require("./requestHandlers/authenticationHandler");
var verificationHandler = require("./twilioVerification/verificationHandler");
var eventRequestHandler = require("./requestHandlers/eventRequestHandler");
var urls = require('config').get('urls');
var sessionParameters = require('config').get('sessionParameters');
var app = express();
我们正在使用JMeter进行负载测试。使用JMeter,我们只能运行450个请求(使用单个实例的450个请求或3个实例的150个请求)。如果我们尝试超过450,我们在JMeter中遇到了以下错误。
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:281)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:92)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:61)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
如果请求数量为450或更少,我们的CPU使用率就达到了100%。我们是Node JS的新手,但根据我们的理解,我们的代码是非阻塞的但不确定。下面给出了主要方法代码,如果是阻塞代码,请告诉我们如何使其无阻塞。
当我们调用第一个方法时,正在执行以下代码。
exports.authenticate = function(req, res) {
log.debug(req.headers['deviceID'] + messages.enterMethod + new Date());
var deviceId = req.headers['deviceID'];
if(deviceId != undefined){
log.debug(deviceId + messages.fetchFromDB + new Date());
authentication.find({where: {deviceID: deviceId}}).success(function(authObj){
log.debug(deviceId + messages.fetchedFromDB + new Date());
var validationString = "<customData>";
if(authObj != null){
if(timeStamp > authObj.timeStamp){
log.debug(deviceId + messages.validateUser + new Date());
if(isValidUser(validationString, deviceId)){
log.debug(deviceId + messages.updateUserTime + new Date());
authObj.updateAttributes({timeStamp: timeStamp}).success(function() {
log.debug(deviceId + messages.updatedUserTime + new Date());
generateSession(deviceId, req, res);
}).error(function(err){
res.status(500).json({status: err});
});
}else{
log.debug(deviceId + messages.InvalidUser + new Date());
res.status(401).json(messages.authenticationFailed);
}
}else{
log.debug(deviceId + messages.wrongTime + new Date());
res.status(401).json(messages.authenticationFailed);
}
}else{
log.debug(deviceId + messages.validateUser + new Date());
if(isValidUser(validationString, deviceId)){
log.debug(deviceId + messages.createUserTime + new Date());
authentication.create({deviceID: deviceId, timeStamp: timeStamp}).success(function(authentication){
log.debug(deviceId + messages.createdUserTime + new Date());
generateSession(deviceId, req, res);
}).error(function(err){
res.status(500).json({status: err});
});;
}else{
log.debug(deviceId + messages.InvalidUser + new Date());
res.status(401).json(messages.authenticationFailed);
}
}
});
}else{
res.status(401).json(messages.authenticationFailed);
}
};
请帮助我们找出CPU 100%使用率的原因以及如何测试2000或更多用户的应用程序?
如果您需要别的东西,请告诉我。
此致 克尚