본문 바로가기

Programming/TOMCAT

웹사이트 성능분석 분석 방법

웹기반시스템하에서의 성능에 관한 이론적 고찰 
http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=1008701211

먼저, 아파치 access_log 분석을 통해, 사용자에 의한 부하량을 조사하는 것이
우선입니다. access_log 를 이용하시면 다음과 같은 정보를 얻을 수 있습니다.

1) 일중 서로 다른 IP어드레스의 누적치 그래프
   시간당/분당 다녀간 서로 다른 IP어드레스 그래프
   (필요시, Proxy Server 보정치 조정)
2) 일일 동시단말사용자 그래프
3) 동적컨텐츠(Servlet/JSP)에 대한 분당 HIT건수의 일중 그래프

위의 것을 통해, 동시단말사용자에 의한 분당 혹은 초당 요청건수와 그에 따른
한 사용자당 평균 몇 초 간격으로 호출을 하는지를 확인할 수 있습니다.

또한, 과거의 몇 달 동안의 로그가 있다면, 간단히, access_log 의 사이즈
비교만으로도, 사이트의 증가량 및 증가패턴을 이해할 수 있을 것입니다.

4) httpd.conf 파일의 common 로그패턴에 "%T"옵션을 추가하여 해당 요청의
응답시간도 access_log 에 기록토록 하시고 최소한 하루치의 로그를 받으세요.

5) HIT량을 기준으로 한 각 어플리케이션(Servlet/JSP) HIT량 점유 파이 그래프

6) 개별 어플리케이션의 응답시간의 합을 기준으로한 파이그래프

그리고, 이를 통해 가장 응답이 느린 Servlet/JSP와, 또 각 Servlet/JSP별로
그 응답시간의 합을 계산하고 그 비율을 보면, 서버측에서 가장 오랫동안
점유한 서비스의 우선순위를 매길 수 있을 것입니다.

위의 과정을 통해, 어떤 응용어플리케이션이 가장 이 시스템에 어플리케이션적인
부하를 주고 있는지를 리스팅 할 수 있습니다.
경험적으로 볼때, 수백/수천개의 어플리케이션이 있다면 이 중 30-40%만이 사용되며
그 30-40%  중에서도 상위 20%의 어플리케이션이 전체 부하의 80%를 점유하고 있을
것입니다.

7) requestmon 이라는 모듈을 통해, 현재 수행되고 있는 Servlet/JSP 리스트 확인 및
응답이 느린 서비스 추적
관련모듈: 
현재실행중인 서비스 모니터링 - requestmon - 
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=982131370
Orion 서버에 requestmon 적용하기
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=orion&c=r_p&n=1009556331
Resin2.0.4 서버에 requestmon 적용하기
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=engine&c=r_p&n=1009768606



8) 위의 과정을 통해 상위 몇몇 개의 서비스를 선택하여 웹스트레스 테스트 툴을 이용,
강의시간에도 말씀드렸듯, 단위시간당 최대 처리건수인 TPS를 구하세요. 그리고, 각종
Tuning작업(DB튜닝, SQL튜닝, 파라메터튜닝, OS 튜닝, N/W 용량확인)을 통해
최대TPS를 끌어올리는 작업을 하세요.

9) 그러나, Tuning을 아무리 하여도 한계는 있겠지요... 그 최대 TPS에 따른 실제
발생한 hit량(access_log)을 비교하고, 동시단말사용자 증가에 따른 필요 전체 TPS를
가늠 해 보세요...


10) 특히 일중 동시단말사용자수 변화에 따른 해당 시점의 서비스 상태를 같이
비교하시면,한 머신에서 최대로 처리할 수 있는 동시단말사용자가 몇명 쯤이겠거니를
판단할 수 있을 것입니다. 
이젠 L4/L7나 IBM eND를 통해 여러대의 머신을 클러스트링하여 로드발란싱을 시켜야
할 시점이 되는 것입니다. DB서버의 증설은 당연히 필요할 것으로 보이며,
웹어플리케이션서버(현재는 tomcat으로 운영되고 있군요)의 개수 및 서버용량을
산정해 보세요...

웹기반 시스템하에서의 용량산정은 아직 경험이 없다보니 경험치가 많지 않습니다.
저의 경험치는 다음과 같습니다. 웹어플리케이션서버를 위한 머신의 tpmC 요구량은,

필요서버용량(tpmC) = (동적컨텐츠에의한 분당최대처리건수) x 10tpmC + 여유분50%

입니다. 예를 들어, 초당 100건(100TPS)라면 분당 6,000 TPM 이고, 이는
6,000TPM x 10 tpmC = 60,000 tpmC 이며, 여기에 50%의 Buffer를 첨가하면
90,000 tpmC 가 필요하게 됩니다.

NOTE: 결코 절대적이지 않습니다. 어플리케이션의 특성에 따라 달라지는 것은 당연
하잖습니까. 제가 알기로는, 국내 굴지의 프로젝트에서도 웹서버에 대한 용량산정에
있어서, 만약, 특정한 공식이 있다면, 그 공식은 과거 경험치를 토대로 역산하거나
비즈니스적인 요건에 맞게 미리 서버를 대충 선정하고, 그것에 맞게 그럴싸하게 만든
가라데이타(?, 거짓부렁)입니다. 신뢰하지 마세요 ;-)

작성하신 문구의 어투와, 웹사이트의 구성으로 보건데, 1초당 10건도 처리하지
못하고 있을 듯 합니다. 1초당 10건이라함은(10 TPS), 평균적으로 사용자의
호출패턴이 20초간격으로 한번씩의 호출을 발생시킨다고 가정했을 때,

최대동시단말사용자(x명)/20초 = 10 TPS, 

즉, 최대 동시단말사용자는 200 명이 max가 된다는 얘깁니다.

과거 및 현재 부하량을 분석하고, 어플리케이션의 중요도가 높은 것을 선택하여 
웹스트레스테스트 시행을 통한 개별 최대TPS를 구하고, 향후 증가 예상을 통해
필요한 용량산정을 수치로 제시하여 고객과 협의하세요.

이러한 패턴으로 작업한 각종 문서들이 본 게시판을 찾아 보시면 다수 있습니다.
참고가 될 겁니다.

PS:  첫화면의 모든 데이타 사이즈가 303KB이네요. 임대받은 IDC센타의 N/W 용량은
어떻게 되는지요? 만약 10 Mbps dedicated 라면, 실전송 속도는 대략 이것은 60%로
가정하고, 10 Mbps x 60% x 1024 / 8 = 768 (KB/sec)가 되네요. 만약, 전송해야할
데이타의 평균량이 300KB라고 가정하면,768(kb/sec) / 300(kb) = 2.56 (건/sec)이
됩니다. 즉, 1초당 2.56 개만 서비스할 수 있다는 얘기가 됩니다. 2.56 TPS라는
얘기는 20초마다 한번씩 클릭하는 사용자 51명(2.56 x 20 = 51.2)이 최대 동시단말
사용자수가 될 것입니다.(예를 든 것 뿐입니다. 이미지는 "return code 304" cache가
되니, 얘기가 다르겠지요)

PS: DB Connection Pool을 사용하고 하지 않고는 해당 어플리케이션의 환경과
부하량 규모에 따라 다릅니다. 얼마나 차이나 나느냐 라는 질문은 우문입니다.
경우에 따라 다른 것이지요. 분명한 것은 성능 차이가 있다는 것입니다.

PS: access_log를 DB에 넣고, 이를 분석하는 아기자기한 저만의 프로그램들을
이 곳에 공개합니다. 시간상, 사용법은 향후 다시 문서화 하겠습니다. 엔지니어라면
소스를 보면 뭘 하자는 것인지 이해 하겠지요...

자바서비스넷(http://www.javaservice.net) --> Etc --> 기타자료실

웹로그 분석 프로그램 version 1.0
http://www.javaservice.net/~java/bbs/read.cgi?m=etc&b=etc&c=r_p&n=1015965476


----------------------------------------------------
웹기반 시스템하에서의 용량산정은 아직 경험이 없다보니 경험치가 많지 않습니다.
저의 경험치는 다음과 같습니다. 웹어플리케이션서버를 위한 머신의 tpmC 요구량은,
필요서버용량(tpmC) = (동적컨텐츠에의한 분당최대처리건수) x 10tpmC + 여유분50%
입니다. 예를 들어, 초당 100건(100TPS)라면 분당 6,000 TPM 이고, 이는
6,000TPM x 10 tpmC = 60,000 tpmC 이며, 여기에 50%의 Buffer를 첨가하면
90,000 tpmC 가 필요하게 됩니다.
 

'Programming > TOMCAT' 카테고리의 다른 글

Log4J 를 이용한 대용량 Logging 방법  (0) 2009.01.09
Tomcat Keystore 파일 설정 및 기타  (0) 2009.01.08