티스토리 뷰

728x90
반응형

 포스팅은 Client의 연결 Timeout 값 설정이 WebtoB 버전에 따라 다르게 적용되는 부분에 대해 테스트를 통해 동작 원리를 알아보겠습니다.



WebtoB 버전 별 Timeout 동작 방식
1. 기능설명
1.1. WebtoB Timeout
사용자가 연결한 소켓에서 데이터를 읽거나 쓸 때 적용하는 타임아웃을 설정한다. 사용자 요청을 처리하고 있을 때 적용되는 설정이며, 해당 시간 동안 사용자가 소켓에 데이터를 쓰지 않거나 소켓으로부터 데이터를 읽지 않는 경우 해당 소켓을 닫는다.


1.2. JEUS request-prefetch
WebtoB request prefetch 기능이 true면 현재 처리하는 WebtoB request외에 1개의 다음 WebtoB request를 미리 받아 request queue에 저장하여 처리 속도를 향상시킬 수 있다.

설정법 (WEBMain.xml)

<web-container>

<context-group>

<webserver-connection>

<webtob-listener>

<request-prefetch>

JEUS 6.0.0.5 이하 <request-prefetch> 기본값 - true

JEUS 6.0.0.6 이상 <request-prefetch> 기본값 - false

 

2. WebtoB 4.1.2.0 이전 Timeout 동작 방식

2.1. JSV 서버 연결을 끊는 경우

WebtoB와 JEUS (Server-Side-Queuing 기능 사용)가 연결된 상태에서 WebtoB에 설정한 Timeout 시간이 지나게 되면 Client 에게 적용 되어야 할 Timeout이 Server(jsv) 연결에 적용되어 Client와 WebtoB 간의 연결뿐만 아니라 WebtoB-JEUS 간의 연결이 버그로 인해 끊어지는 현상이 있습니다.
테스트 시나리오

WebtoB 4.1.2.0

JEUS 6.0.0.5

Timeout(to) = 10 WebtoB

request prefetch : true

test2.jsp : sleep 60초


wsadmin의 st -p에서 수행중인 Thread가 연결이 종료 되는 것을 확인한다.

$$373 tmaxi7 (wsadm): st -p

HTH 0(54657634): RDY

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

svr_name svgname spr_no(pid) status count avg(rt) clid svc

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

html htmlg 0(8913052) RDY 0 0.0000( 0) -1 -

html htmlg 1(23724032) RDY 0 0.0000( 0) -1 -

MyGroup jsvg 10( 0) RUN 0 0.0000( 9) 2 uri1

0 jengineid(ibmtest_servlet_engine1)

MyGroup jsvg 11( 1) RUN 0 0.0000( 5) 3 uri1

0 jengineid(ibmtest_servlet_engine1)

HTH 0(54657634): RDY

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

svr_name svgname spr_no(pid) status count avg(rt) clid svc

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

html htmlg 0(8913052) RDY 0 0.0000( 0) -1 -

html htmlg 1(23724032) RDY 0 0.0000( 0) -1 -


JEUS netstat 결과는 다음과 같다.

tcp4 0 0 192.168.1.221.41501 192.168.1.87.19990 ESTABLISHED

tcp4 0 0 192.168.1.221.41502 192.168.1.87.19990 ESTABLISHED

tcp4 0 0 192.168.1.221.41501 192.168.1.87.19990 CLOSE_WAIT

tcp4 523 0 192.168.1.221.41502 192.168.1.87.19990 CLOSE_WAIT


WebtoB netstat 결과는 다음과 같다.

tcp4 0 0 192.168.1.87.19990 192.168.1.221.41501 ESTABLISHED

tcp4 0 0 192.168.1.87.19990 192.168.1.221.41502 ESTABLISHED

tcp4 0 0 *.19990 *.* LISTEN

tcp4 0 0 192.168.1.87.19990 192.168.1.221.41501 FIN_WAIT_2

tcp4 0 0 192.168.1.87.19990 192.168.1.221.41502 FIN_WAIT_2

tcp4 0 0 *.19990 *.* LISTEN


st –v 의 서버 상태가 NRDY로 변경 된다.

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

hth svrname (svri) status count cqcnt aqcnt qpcnt emcnt rscnt rbcnt

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

0 html ( 0) RDY 0 0 0 0 0 0 0

0 MyGroup ( 1) NRDY 0 0 0 0 0 0 0


WebtoB의 Error 로그에 10초가 지난 후 연결이 끊어 지면서 아래 로그가 기록 된다.

[11/Oct/2012:21:32:40 +0900] [error] [..] Client timeout has expired while the server is processing the request
[11/Oct/2012:21:32:44 +0900] [error] [..] Client timeout has expired while the server is processing the request


JEUS의 ti 정보를 보면 sleep된 시간 동안 active 상태로 처리
-- Thread State [webtob1-hth0(192.168.1.87_19990)] --
[webtob1-hth0(192.168.1.87:19990)-w00][active , rt=59489 ms, uri=/exploded/test2.jsp]
[webtob1-hth0(192.168.1.87:19990)-w01][active , rt=41370 ms, uri=/exploded/test2.jsp]


2.2. JSV 서버 연결을 끊지 않는 경우
JEUS 6.0.0.6 버전 이상 에서는 request-prefetch 기본 값이 false이기 때문에 명시적으로 값을 true로 지정해 주지 않는 이상 Timeout이 발생하더라도 JSV 서버 연결은 끊어 지지 않습니다.

 

3. WebtoB 4.1.3.0 이후 동작 방식

WebtoB 4.1.3.0 이전 버전에서 hidden 옵션으로 node,vhost절의 Timeout설정의 영향을 받았었던 Server절의 Timeout 옵션이 삭제되었습니다.

WebtoB 4.1.3.0 버전 이후에는 JEUS의 설정에 상관없이 WebtoB에서 JEUS로 큐잉을 넘기지 않도록 변경되었습니다.
테스트 시나리오

WebtoB 4.1.3.0 JEUS 6.0.0.6

Timeout(to) = 10

WebtoB request prefetch : false

test2.jsp : sleep 60초


wsadmin의 st -p에서 수행중인 Thread가 Timeout 시간이 지나도 서버간의 연결은 끊어 지지 않는다.

$$373 tmaxi7 (wsadm): st -p

HTH 0(54657634): RDY

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

svr_name svgname spr_no(pid) status count avg(rt) clid svc

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

html htmlg 0(8913052) RDY 0 0.0000( 0) -1 -

html htmlg 1(23724032) RDY 0 0.0000( 0) -1 -

MyGroup jsvg 10( 0) RUN 0 0.0000( 9) 2 uri1

0 jengineid(ibmtest_servlet_engine1)

MyGroup jsvg 11( 1) RUN 0 0.0000( 5) 3 uri1

0 jengineid(ibmtest_servlet_engine1)

 

JEUS netstat 결과는 다음과 같다.

tcp4 0 0 192.168.1.221.41894 192.168.1.87.19990 ESTABLISHED

tcp4 0 0 192.168.1.221.41895 192.168.1.87.19990 ESTABLISHED

tcp4 0 0 192.168.1.221.41894 192.168.1.87.19990 ESTABLISHED

tcp4 0 0 192.168.1.221.41895 192.168.1.87.19990 ESTABLISHED

 

WebtoB netstat 결과는 다음과 같다.

tcp4 0 0 192.168.1.87.19990 192.168.1.221.41894 ESTABLISHED

tcp4 0 0 192.168.1.87.19990 192.168.1.221.41895 ESTABLISHED

tcp4 0 0 *.19990 *.* LISTEN

tcp4 0 0 192.168.1.87.19990 192.168.1.221.41894 ESTABLISHED

tcp4 0 0 192.168.1.87.19990 192.168.1.221.41895 ESTABLISHED

tcp4 0 0 *.19990 *.* LISTEN

 

st –v 의 서버 상태가 RDY로 JEUS와 연결이 유지된다.

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

hth svrname (svri) status count cqcnt aqcnt qpcnt emcnt rscnt rbcnt

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

0 html ( 0) RDY 0 0 0 0 0 0 0

0 MyGroup ( 1) RDY 2 0 0 0 0 0 0

 

WebtoB의 Error 로그에 10초가 지난 후 Timeout이 발생한 내용 기록

[11/Oct/2012:21:32:40 +0900] [error] [..] Client timeout has expired while the server is processing the request
[11/Oct/2012:21:32:44 +0900] [error] [..] Client timeout has expired while the server is processing the request


JEUS의 ti 정보를 보면 sleep된 시간 동안 active 상태로 처리
-- Thread State [webtob1-hth0(192.168.1.87_19990)] --
[webtob1-hth0(192.168.1.87:19990)-w00][active , rt=59489 ms, uri=/exploded/test2.jsp]
[webtob1-hth0(192.168.1.87:19990)-w01][active , rt=41370 ms, uri=/exploded/test2.jsp]

 

3.1 Timeout이 발생할 경우 JSV연결 끊기
WebtoB 4.1.3.0 이상 버전을 사용할 때 이전 버전처럼 Client와의 연결이 종료되면 WebtoB와 JEUS의 연결을 끊기를 원한다면 NotifyClientClose 설정으로 대체가 가능 합니다.
* 설정 예

MyGroup SVGNAME = jsvg, MinProc = 10, MaxProc = 30, Options="NotifyClientClose"

NotifyClientClose 설정을 하게 되면 해당 서버가 Timeout 발행해 연결이 끊어질 경우 WebtoB Error 로그에 붉은색 하이라이트 부분이 추가적으로 기록됩니다.


* WebtoB error 로그

[20/Dec/2012:20:34:05 +0900] [error] [client 192.168.15.150] Client timeout has expired while the server is processing the request

[20/Dec/2012:20:34:05 +0900] [error] [client 192.168.15.150] jsv: premature client close.

GET /session/sleep.jsp HTTP/1.1

JEUS Container에서는 Socket 연결이 끊어진 것을 감지하고 재 연결 합니다.


* JEUS Container 로그

[2012.12.20 20:34:55][1][b242] [container2-62] [WEB-3338] worker(webtob1-hth0(localhost:6699)-w01:Socket[localhost:6699]) : read request error

<<__Exception__>>

java.io.EOFException

at jeus.servlet.engine.ServletInputStreamImpl.readFully(…..)

at jeus.servlet.engine.WebtobServletRequest.parseWebtobHeader(….)

at jeus.servlet.engine.WebtobServletRequest.readRequest(…..)

at jeus.servlet.engine.WebtobRequestProcessor.run(…..)

<<__!Exception__>>

[2012.12.20 20:34:55][2][b242] [container2-62] [WEB-3384] Socket[localhost:6699] established

[2012.12.20 20:34:55][0][b242] [container2-62] [WEB-3347] worker(webtob1-hth0(localhost:6699)-w01:Socket[localhost:6699]) : reconnect successful

4. WebtoB 버전에 따른 Timeout 동작 결과



JEUS 6.0.0.5 이하 <request-prefetch> 기본값 - true

JEUS 6.0.0.6 이상 <request-prefetch> 기본값 - false

 

5. 결론
위의 테스트 결과를 보면 모두 2가지 조건을 만족 시킨 경우에만 WebtoB의 Timeout이 발생했을 때 WebtoB와 JEUS간의 연결을 끊게 됩니다.


조건
- WebtoB 4.1.2.0 이하
- JEUS 6.0.0.5 이하 (request-prefetch를 false 로 설정해 끊어지지 않도록 설정 가능)


고맙습니다.

728x90
반응형