Javascript 使用100%CPU的Node JS应用程序
我们正在Node.JS中为iPhone应用程序制作一个后端应用程序。 我们在EC2实例t2.medium上部署了后端应用程序节点,该实例使用安装在另一个EC2实例t2.small上的MySQL服务器。在进行负载测试时,我们看到CPU使用率为100%。我们试图找出原因,但到目前为止还没有找到 我们在server.js中使用以下模块Javascript 使用100%CPU的Node JS应用程序,javascript,node.js,amazon-ec2,Javascript,Node.js,Amazon Ec2,我们正在Node.JS中为iPhone应用程序制作一个后端应用程序。 我们在EC2实例t2.medium上部署了后端应用程序节点,该实例使用安装在另一个EC2实例t2.small上的MySQL服务器。在进行负载测试时,我们看到CPU使用率为100%。我们试图找出原因,但到目前为止还没有找到 我们在server.js中使用以下模块 var express = require('express'); var session = require('express-session');
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个请求,或者使用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%。我们对NodeJS还不熟悉,但根据我们的理解,我们的代码是非阻塞的,但不确定。下面给出了主要方法的代码,如果是阻塞代码,请告诉我们如何使其成为非阻塞
当我们调用第一个方法时,将执行以下代码
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或更多用户测试我们的应用程序
如果你还需要别的东西,请告诉我
问候,,
Krishan您收到连接重置错误,因为您的服务器无法并行处理450个用户的负载。这里没有Jmeter的问题。不确定,但这可能与:嗨,请让我知道,如果你仍然有问题,我可能会提供帮助。请通过回复此评论让我知道。