www.bea.co.kr 23
Bea Enterprise Solution Technical News
ChunkUtil에 의한 WLS 응답 속도 지연
1.제품 : WLS
2.사용 OS : 모든 플랫폼(platform)
3.작성일 : 2002/11/16
4.이슈사항 : 서버로부터 응답 속도가 느려지고, CPU 소모량이 많은 경우에는 먼저 해당 WLS 서버의 thread 들이 수행하는 일을
확인해 보는 것이 좋다. 이를 위해서‘kill -3’을 해당 프로세스에 보내서, 해당 JVM의 thread dump를 확인을
하게 된다.
그런데, 그 dump의 내용에서 다음과 같이
"ExecuteThread: '49' for queue: 'default'" daemon prio=5 tid=0x32de7818 nid=0xf18 runnable
[0x345bf000..0x345bfdbc]
at java.net.SocketOutputStream.socketWrite(Native Method)
at java.net.SocketOutputStream.write(SocketOutputStream.java:91)
at weblogic.servlet.internal.ChunkUtils.writeChunkTransfer(ChunkUtils.java:224)
at weblogic.servlet.internal.ChunkUtils.writeChunks(ChunkUtils.java:200)
at weblogic.servlet.internal.ChunkOutput.flush(ChunkOutput.java:274)
at weblogic.servlet.internal.ChunkOutput.checkForFlush(ChunkOutput.java:347)
at weblogic.servlet.internal.MultibyteOutput.write(ChunkOutput.java:467)
at weblogic.servlet.internal.ChunkOutputWrapper.write(ChunkOutputWrapper.java:95)
at weblogic.servlet.internal.ChunkWriter.write(ChunkWriter.java:37)
at java.io.Writer.write(Writer.java:148)
at java.io.PrintWriter.write(PrintWriter.java:208)
at java.io.PrintWriter.write(PrintWriter.java:224)
at java.io.PrintWriter.print(PrintWriter.java:355)
at java.io.PrintWriter.println(PrintWriter.java:492)
at xxx.yy.com.jsp.UvJspBase.popUpErrorPage(UvJspBase.java:1104)
at xxx.yy.com.jsp.ScreenJspBase.service(ScreenJspBase.java:169)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:265)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:200)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:2546)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2260)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:139)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:120)
ChunkUtil 클래스의 writeChunkTransfer( ) 혹은 writeChunkNoTransfer( ) 메소드 호출을 수행하는 thread
가 많은 경우가 종종 있다.
Technical Tip WEBLOGIC
5.해결안 :JSP는 수행을 할 경우에 브라우저로 보내기 위한 화면을 내부 버퍼에 구성을 하고, 완성이 되면 이를 내려보내게 된다.
그런데, 그 버퍼의 크기가 default로는 8KB에 해당한다. 따라서, 이보다 큰 화면을 내려보내야 할 경우에는 중간에
해당 버퍼를 flush하는 작업이 일어나게 된다. 이런 flushing 작업은 클라이언트 브라우저로부터 ack를 받아야
되므로, IO wait 상태가 발생하게 된다. 이런 과정은 thread로 하여금 많은 시간을 대기하게 한다. 이런 대기는 화면
의 크기가 30KB라면 7번 발생하게 되어서 상당한 부하를 줄 수 있다.
이와 같은 지연 현상을 줄이기 위해서는 큰 화면을 보내는 JSP에 대해서는 충분한 버퍼를 사용할 수 있도록 함으로써
반복적인 flushing 작업을 줄이고, 가능하면 1회의 데이터 전송으로 작업이 끝날 수 있도록 해야 한다.
먼저 thread dump 내용을 살피시면 해당 JSP페이지를 확인할 수 있다.
위의 경우는 xxx.yy.com.jsp.ScreenJspBase.service()가 호출되고 있으므로, xxx.yy.com.jsp 팩키지의
ScreenJspBase를 확인하시면 된다. 그리고, 해당하는 페이지의 크기를 확인하여 충분한 크기의 버퍼를 아래와 같이
설정하면 된다.
<%@ page buffer=”64kb”%>
'WEB' 카테고리의 다른 글
소스보기 (0) | 2006.03.04 |
---|---|
WLS : 데이터 전송시 성능저하(AIX플랫폼) (0) | 2006.02.17 |
MS, 오는 4월까지 IE 브라우저 설계변경 (0) | 2006.01.25 |
html태그사전 (0) | 2005.10.14 |
아파치 httpd.conf 환경설정 (1) | 2004.12.01 |