ngrinder(리눅스) -> 윈도우 WebServer(IIS,tomat) POST호출시 응답속도 지연 발생 문의

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

ngrinder(리눅스) -> 윈도우 WebServer(IIS,tomat) POST호출시 응답속도 지연 발생 문의

greenslime
안녕하세요.
ngrinder 사용중 이슈가 발생하여 문의드립니다.

--------------------

:: 이슈
- ngrinder에서 윈도우 웹서버로 POST파라미터를 하나라도 보내면 GET호출에 비해 심각한 응답지연이 발생함.


: 테스트시 사용된 버전들
- ngringer시스템: CentOS 5.x, jdk 1.6+tomcat6, jdk1.7+tomcat7 (jdk1.8은 ngrinder 에러발생), ngrinder-3.3, ngrinder-3.2.3,
- 웹서버시스템: Windows Server 2008, jdk1.7+tomcat7, IIS7


: 테스트한 스크립트 방식
- jython (GET, POST)
- groovy (GET, POST)


: 테스트 jsp페이지 (IIS페이지는 상용소스라 생략)
test.jsp
<%@ page language="java" contentType="text/html; charset=euc-kr" %>
<%
request.setCharacterEncoding("euc-kr");
String id=request.getParameter("id");
out.println(id);
%>


: 테스트결과 (각 패키지(jdk, ngrinder, tomcat) 버전을 불문하고 결과는 동일하게 나왔음)
1) ngrinder(리눅스) ----> 톰캣(리눅스)
 GET호출과 POST호출의 응답속도 동일

2) ngrinder(리눅스) ----> 톰캣(윈도우)
 GET호출에 비해 POST호출이 매우 느림(약 20배정도의 응답지연) (GET:17ms, POST: 200ms)
  (부하검증을 하면 POST호출은 성능저하가 더욱 심해진다)

3) ngrinder(리눅스) ----> IIS(윈도우)
 GET호출에 비해 POST호출이 매우 느림(약 20배정도의 응답지연)
(부하검증을 하면 GET에 비해 POST호출은 TPS성능 저하가 더욱 심해짐)

4) curl(리눅스) ----> 톰캣(윈도우), IIS(윈도우)
 GET호출과 POST호출의 응답속도 동일

-------------------
<> 예상결론
- ngrinder(리눅스)에서 윈도우 웹서버 접속시 지연이 발생함.
- curl로 접속 시 지연이 없기 때문에 리눅스와 윈도우간 문제라기보다는 ngrinder의 문제

<> 대응책
- ngrinder,jdk,tomcat의 버전변경으로는 해결 불가
 로컬에 nginx proxy를 구현하여 임시해결

===========================================================

* ngrinder스크립트 작성(POST)
----------------------------------------------------------------------------------------
# -*- coding:utf-8 -*-

# A simple example using the HTTP plugin that shows the retrieval of a
# single page via HTTP.
#
# This script is automatically 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, HTTPPluginControl
from HTTPClient import Cookie, CookieModule
from java.util import Date
from HTTPClient import NVPair

control = HTTPPluginControl.getConnectionDefaults()

control.timeout = 6000

test1 = Test(1, "post_test")
requestPost = HTTPRequest()
test1.record(requestPost)

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

        # test method
        def __call__(self):
                #url = "http:// xxxxx.xxxxxx.xxxxx:8080/test.jsp"
                url = "http://127.0.0.1:81/test.jsp"   #로컬nginx를 호출

                params = [NVPair("id", "ttt")]
                result = requestPost.POST(url, params)
                rs = result.getText()
                grinder.logger.info(rs)

                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

 위 방법으로 테스트시 GET과 POST호출의 응답속도 차이가 거의 발생하지 않음!
  (POST 부하검증도 잘 진행됨)

============================================================

(문의> 제가 뭔가 잘못한 부분이 있는것인지, 아니면 ngrinder의 버그인지 명확한 원인 확인과 문제 해결방법이 궁금합니다. (nginx proxy 등 임시해결책이 아닌)