node.js 서버 측정에 잇어 질문드립니다.

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

node.js 서버 측정에 잇어 질문드립니다.

TuNa
안녕하세요
node.js 서버를 ngrinder를 활용하여 성능측정을 해보고 있는데요.
node.js 서버는 단순 http server구요
-------
// Load the http module to create an http server.
var http = require('http');

// Configure our HTTP server to respond with Hello World to all requests.
var server = http.createServer(function (request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.end("Hello World\n");
});

// Listen on port 8000, IP defaults to 127.0.0.1
server.listen(8000);

// Put a friendly message on the terminal
console.log("Server running at http://127.0.0.1:8000/");
-------

ngrinder 스크립트 역시 단순하게 구현하였습니다.
------
# -*- coding:utf-8 -*-

# A simple example using the HTTP plugin that shows the retrieval of a
# single page via HTTP.
#
# This script is auto generated by ngrinder.
#
# @author admin
from net.grinder.script.Grinder import grinder
from net.grinder.script import Test
from net.grinder.plugin.http import HTTPRequest
from net.grinder.plugin.http import HTTPPluginControl


control = HTTPPluginControl.getConnectionDefaults()
# if you don't want that HTTPRequest follows the redirection, please modify the following option 0.
# control.followRedirects = 1
# if you want to increase the timeout, please modify the following option.
control.timeout = 600000

test1 = Test(1, "Test1")
request1 = HTTPRequest()

# Make any method call on request1 increase TPS
test1.record(request1)

class TestRunner:
        # initlialize a thread
        def __init__(self):
                grinder.statistics.delayReports=True
                pass

        # test method
        def __call__(self):
                result = request1.GET("http://1111111111:8000/")

                if result.getStatusCode() == 200 :
                        grinder.statistics.forLastTest.success = 1
                elif result.getStatusCode() in (301, 302) :
                        grinder.logger.warn("Warning. The response may not be correct. The response code was %d." %  result.getStatusCode())
                        grinder.statistics.forLastTest.success = 1
                else :
                        grinder.statistics.forLastTest.success = 0
------
ngrinder 컨트롤러와 에이전트 환경은 windows server 2012 이구요.(cpu는 i7입니다. Ram은 8gb)
프로세스는 4개, 프로세스당 스레드는 40개 줫습니다..

1. tps 결과를 보면 8초주기로 최고점 최저점을 계속 반복해서 찍고 있습니다.(원래 이렇게 나오는건지도 모르겟네요..)
2. 에이전트를 7개를 사용했는데 시간이 지날수록 1개씩 줄어들더니 나중에는 2-3개만 남는데 그 때는 튀지 않고
tps선이 어느정도 일정하게 나오고 있습니다..
어떤 점이 문제인지 궁금하네요.. 감사합니다.
(ngrinder 버젼은 3.2.1입니다.)




Reply | Threaded
Open this post in threaded view
|

Re: node.js 서버 측정에 잇어 질문드립니다.

TuNa
지금 로그를 보니 다음과 같은 에러가 남았네요..
----
2013-08-27 14:36:15,289 ERROR Aborted run: Java exception calling TestRunner
net.grinder.scriptengine.jython.JythonScriptExecutionException: Java exception calling TestRunner
        result = request1.GET("http://1111111:8000")
        File "C:\Users\Administrator\.ngrinder_agent\file-store\admin\current\http_echo.py", line 35, in __call__
java.net.ConnectException: Connection refused: connect
        at java.net.DualStackPlainSocketImpl.connect0(Native Method) ~[na:1.7.0_09]
        at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) ~[na:1.7.0_09]
        at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) ~[na:1.7.0_09]
        at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) ~[na:1.7.0_09]
        at java.net.AbstractPlainSocketImpl.connect(Unknown Source) ~[na:1.7.0_09]
        at java.net.PlainSocketImpl.connect(Unknown Source) ~[na:1.7.0_09]
        at java.net.SocksSocketImpl.connect(Unknown Source) ~[na:1.7.0_09]
        at java.net.Socket.connect(Unknown Source) ~[na:1.7.0_09]
        at java.net.Socket.connect(Unknown Source) ~[na:1.7.0_09]
        at java.net.Socket.<init>(Unknown Source) ~[na:1.7.0_09]
        at java.net.Socket.<init>(Unknown Source) ~[na:1.7.0_09]
        at HTTPClient.HTTPConnection$EstablishConnection.run(HTTPConnection.java:4082) ~[grinder-httpclient-3.9.1.jar:na]
Reply | Threaded
Open this post in threaded view
|

RE: Re: node.js 서버 측정에 잇어 질문드립니다.

junoyoon
Administrator
문제의 원인은 해당 타겟 서버가 동시 커넥션을 일정수이상 처리 하지 못하는 겁니다.   
 
지금 휴가중이라 내일 좀 더 자세한 원인을 설명해 드리도록 하겠습니다. 
 



Reply | Threaded
Open this post in threaded view
|

Re: node.js 서버 측정에 잇어 질문드립니다.

junoyoon
Administrator
In reply to this post by TuNa
이 문제는 해당 node.js 서버의 최대 동시 커넥션 개수를 넘어간 개수로 ngrinder vuser 를 잡을 때 생깁니다.

node.js 가 event 기반으로 처리하기 때문에, 최대 동시 커넥션 개수가 상당히 클 것으로 생각되었으나, 구글링해보니.
ulimit 같은 것을 제대로 않정해 주면 제한이 발생할 수도 있는 것 같군요.

앞서 스크립트를 보시면.. control.timeout = 600000 와 같이 600초 timeout 을 지정해 주시는데요. 늦게 활성화된 에이전트가 커넥션을 확보하지 못하여, 장기간 동안 대기하게 되고, 이 도중에 컨트롤러는 에이전트가 뭔가 이상이 있는게 아닌가 하고, 몇몇 에이전트를 중단 시켜 버린 케이스입니다.

8초마다 튀는 것은 타이밍 문제인듯 한데..

이 문제에 대해 다음과 같이 해결해 보세요.

1. Ramp Up을 사용하여 적절한 vuser 개수가 어느정도인지 확인해 보세요.
2. 스크립트 중간에 약 100 milli seconds 의 sleep time 을 주세요. (grinder.sleep(1000))