节点JS应用程序使用100%CPU

时间:2014-12-09 11:11:23

标签: javascript node.js amazon-ec2

我们正在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或更多用户的应用程序?

如果您需要别的东西,请告诉我。

此致 克尚

0 个答案:

没有答案