본문 바로가기

IT인생_스크랩/Windows

Capacity Planning (2) : Stress Tool

출처 islove8587님의 블로그 | islove8587
원문 http://blog.naver.com/islove8587/10012792108


Stress Tool의 종류
Stress Tool에는 여러 가지 어플리케이션이 나와있습니다. 일반적으로 많이 사용되는 것은 아래와 같습니다.
- Web Application Stress
- InetMonitor
- WCAT
- Orville


웹서비스의 형태, 인증방법 등에 따라 적절한 어플리케이션을 선택해야 합니다. 예를 들어 제가 만들고 있는 서비스들은 LDAP인증(DPA인증이라고 흔히 부르죠)을 사용하는데, 모의실험을 위해서는 이 인증을 뚫을 수 있는 어플리케이션이 필요하게 됩니다. 제가 사용해본 것 중에는 Web Application Stress와 InetMonitor가 DPA를 지원합니다. 저는 주로 InetMonitor를 사용하구요.
만약 아무나 접근할 수 있는, 인증이 걸리지 않는 웹서비스에 대해 테스트를 하고자 한다면, 위의 어플리케이션 중 어떠한 것을 사용해도 무방합니다.


Web Application Stress (이하 WAS)
Microsoft에서 권고하는 stress tool입니다. 그런데 제가 사용해보니 LDAP인증을 제대로 뚫지 못하는 경우가 빈번히 발생하더군요. 제가 잘못한건지..
WAS는 내부적으로 쓰레드를 생성하여 웹 서버에 다수의 request를 던지고 그 response를 받는 기능을 수행합니다. Windows2000, NT Server 4.0에서 사용할 수 있습니다. 아래는 설치 파일입니다.

WAS를 설치했으면 [시작] | [프로그램] | [Microsoft Web Application Stress Tool] | [Microsoft Web Application Stress Tool]을 실행합니다.

 

WAS는 여러 가지 방식으로 스트레스 시나리오를 작성할 수 있습니다. 위의 화면은 스트레스 시나리오 작성 방법을 선택하는 위저드 화면이며, 여기에서는 Manual 방식에 대해서만 다루겠습니다. 위저드 화면에서 [Manual] 버튼을 누릅니다.
WAS와 설치시 제공되는 샘플 스크립트를 통해 WAS의 사용 방법을 익혀보겠습니다. 샘플 스크립트는 WAS가 설치된 폴더 아래에 samples라는 폴더에 있습니다. 이 폴더를 통째로 웹 사이트의 홈 디렉터리 하위에 복사합니다. 다음 그림과 같이 왼쪽 패널에서 [Sample Script] 항목을 선택하고 오른쪽 패널에 보이는 스크립트 목록 중 "POST" Verb 항목의 가장 왼쪽 헤더를 더블 클릭합니다.

 
[Querystring] 탭 화면에서 "User"와 "Password"라는 이름의 매개변수가 쿼리 문자열로 넘어가고 있음을 알 수 있습니다. 또한 %Username%과 %Password%는 그 매개변수의 값으로 지정되어 있음도 알 수 있습니다. 이 문자열은 각각의 POST request시에 Users 목록으로부터 user와 password 값을 가져와 매개변수 값으로 넘겨줄 것을 WAS에게 지시합니다. Users 목록은 뒤에서 설명하겠습니다. 다른 탭 화면들을 둘러보면 HTTP 헤더 설정, SSL 사용을 비롯한 여러 가지 속성을 지정할 수 있음을 볼 수 있습니다. [Ok] 버튼을 눌러 스크립트 항목 속성 화면을 닫습니다.
Sample Script에서 마지막 두 개의 스크립트 항목은 Group 컬럼값이 "adGrp"으로 되어 있습니다. 이것은 페이지 그룹이라고 부르는 컬럼인데 스크립트를 생성했을 때 기본적으로 "Default"라고 설정된다. 페이지 그룹은 스크립트 항목이 불려지는 순서를 재구성할 때, 혹은 스크립트 수행 중에 각각의 스크립트가 불리는 회수를 바꿀 때에 사용합니다.
WAS 왼쪽 패널의 [Page Groups] 항목을 펼치면 모든 페이지 그룹을 볼 수 있습니다.

 

화면의 오른쪽 패널에서 Distribution 값을 변경하여 그룹별로 request를 던지는 빈도를 조절할 수 있습니다. 위 화면에서 "Keep Alive" 속성을 모두 체크 상태로 만듭니다.
WAS 왼쪽 패널에 [Perf Counters]라는 항목이 있는데 이것은 로컬 혹은 리모트 서버의 성능 객체를 모니터링할 수 있는 기능을 제공합니다. 우리는 성능 모니터를 사용하여 모니터링할 것이므로 WAS가 이러한 기능을 제공한다는 사실만 짚고 넘어가겠습니다.
[Settings] 항목을 보겠습니다.
 
간단한 테스트를 위해 [Test Run Time] 항목을 1분으로 고치겠습니다.
위 화면에서 다른 항목들을 잠깐 살펴보겠습니다.
- Concurrent Connections: 항목에 쓰레드 개수와 쓰레드당 소켓의 개수가 있습니다. 샘플에서는 2*1=2개의 동시 접속을 발생시키도록 설정하였습니다. 다수의 동시 접속을 발생시킬 때에는 쓰레드의 개수만을 늘리는 것을 권장하며, Stress multifier는 특별한 상황이 아니면 사용하지 않는 것이 좋습니다. 쓰레드의 개수는 일반적으로 10~100개 사이입니다. 쓰레드를 과도하게 생성하면 클라이언트 시스템이 버티지 못하고 다운되므로 클라이언트의 CPU 사용율이 80%를 넘지 않는 선에서 쓰레드의 개수를 조절하여야 합니다.
- Request Delay: request가 시간차를 두고 웹 서버로 전송되기 때문에 request가 한꺼번에 웹 서버로 몰리는 현상을 방지할 수 있습니다.
- Bandwith: 이용자의 접속 환경을 고려한 테스트가 가능합니다.
기타 항목은 도움말을 참고하시기 바랍니다.
WAS 왼쪽 패널에서 [Users]를 선택하고 오른쪽 패널에서 "Default" 항목을 더블 클릭합니다.
 

 

이 곳에서 일련의 이용자 ID와 암호를 추가/삭제할 수 있습니다. 각각의 user는 쿠키 정보와 인증 정보를 가지며, Users 항목 개수는 1000개를 넘지 않는 것이 좋습니다.
왼쪽 패널에서 [Client] 항목을 선택하고 오른쪽 패널에서 "Default" 항목을 더블 클릭합니다.

 


 

localhost가 클라이언트로 설정되어 있음을 볼 수 있습니다. 이 곳에서 클라이언트를 추가/삭제할 수 있습니다.

이제 테스트를 시작하겠습니다. 왼쪽 패널에서 [Sample Script] 항목을 선택하고 [Scripts] | [Run] 메뉴로 스크립트를 수행시킵니다. 다음과 같이 남은 시간을 표시하는 창이 뜹니다.

 

스트레스를 주고 있는 중에는 성능 모니터를 통해 서버에 무리한 부하가 가지 않는 지 확인하여야 합니다. 특히 Processor/Processor Time이 75%를 넘지 않는지, Memory/Available Bytes가 계속하여 감소하지 않는지, Web Service 성능 객체쪽의 카운터들 수치는 적당한지 등을 체크해야 합니다. 웹 서버 모듈에 대한 테스트를 하고 있다면 모듈 형태(ASP, ISAPI, …)에 따라 적당한 카운터를 함께 모니터링합니다.
실제 스트레스 테스트중에는 스트레스의 기준과 성능상의 기준을 정해두고 이에 부응하는 결과가 나오는지를 체크하여야 하며, 그 결과에 따라 웹 서버 모듈을 손보거나 웹 서버의 대수를 늘리는 등의 조치를 취해야 합니다.
스크립트 실행이 끝나면 [View] | [Reports] 메뉴를 선택하여 결과 리포트를 볼 수 있습니다. 스크립트를 수행한 일시를 기준으로 결과 리포트가 나열됩니다.

 


 
Reports 화면에서 중요한 것은 Result Codes, Page Data입니다. 웹 서버가 보내 준 response에 오류 코드가 돌아온 것이 있는지, 각 페이지에 대한 request는 적절한 시간내에 처리되고 있는지에 유의하여 리포트를 분석합니다.
 

InetMonitor
제가 주로 사용하는 stress tool 입니다. DPA를 확실하게 뚫어주기 때문에..

특징은 아래와 같습니다.
- 서버의 리소스 사용량을 모니터할 수 있는 기능도 내재하고 있습니다.
- 현재 가해지고 있는 stress와 response에 대한 분석결과를 보여줍니다.
- 결과를 토대로 한 서버 구성 recommendations을 제시하여 capacity planning에 도움을 줍니다.
- 대부분의 인터넷 프로토콜(HTTP, SMTP, NNTP, POP3, IRC, IMAP, MIC, LDAP)과 인증형식을 지원합니다.
- 테스트 URL을 순차적으로 또는 무작위로 선별하여 stress를 줄 수 있습니다.

InetMonitor 사용법
InetMonitor가 제공하는 Monitoring 기능

 

InetMonitor를 실행하면 위와 같은 화면이 나타납니다. InetMonitor에는 크게 두 가지의 기능이 있는데, 첫번째는 stress simulation이고 두번째는 monitoring 기능입니다. 위의 화면은 monitoring기능을 보여줍니다.
웹서버를 monitoring하는 기능은 기타 tool에 비해 상당히 미약합니다. 간단히 설명은 드리죠. 웹서버를 모니터링하기 위해서는 그 웹서버에 대한 administrator권한이 있어야 합니다.

"Monitoring" 하부의 "Monitor Server..." 메뉴를 선택합니다.
웹서버를 지정하라는 화면이 나타나면 웹서버의 이름(예를 들어
www.yahoo.com)을 입력합니다. 웹서버로부터 필요한 정보를 끌어오기 위해 시간이 약간 소요됩니다.
아래와 같이 웹서버의 현재 상태를 나타내는 그래프 화면이 나타납니다.


 

그래프에 프로세서 사용량, 메모리, 웹서비스에 관한 여러가지 항목들이 보입니다.
모 니터링을 중지하려면 웹서버를 선택하고 메뉴의 "Remove Server"를 선택합니다.

InetMonitor가 제공하는 Stress 기능
이제 InetMonitor의 stress 기능에 대해 본격적으로 살펴보겠습니다.
View 메뉴의 "Simulation View"를 선택합니다.


 

각각의 항목을 살펴보지요.
- Target Server : Port: 서버명과 port#를 지정합니다 (예:
www.yahoo.com:2000). 만약 디폴트 포트인 80번 포트를 쓰는 경우라면 port#은 생략가능합니다.
- Number of Users: Concurrent User 수를 지정합니다. 만약 30으로 지정하면 웹서버에 지속적으로 30개의 request가 동시에 몰리게 됩니다. 최대값이 50 이므로 그 이상 user수에 대한 테스트를 하고자 할 때에는 다른 클라이언트(PC)에서 동시에 수행합니다.
- User Start Delay: simulation 시작후 user수가 몇 ms 간격으로 하나씩 늘어갈 건지를 지정합니다. 만약 1000으로 지정하면 1초에 하나의 request가 증가하기 시작하여 Number of Users의 수치까지 올라갑니다.
- Test Duration (mins): 테스트를 수행할 시간을 분단위로 지정합니다. 0 으로 지정하면 simulation을 stop할 때까지 무한정 테스트를 계속합니다.
- Logging Active: response를 log 파일로 남길 것인지 여부를 결정합니다. log 파일은 InetMonitor가 설치된 폴더 하위의 log 폴더에 쌓입니다.
- Worker Threads: Number of Users와 동일한 값으로 지정합니다.
- Command Script: InetMonitor stress 환경 설정파일을 전체 경로 포함하여 지정합니다. 아래와 같은 방식으로 작성하면 됩니다.

USER username password
GET RANDLIST(d:inetmonitorsampleshttpfile.txt)

Authentication을 "None"으로 지정했다면 USER 라인은 생략합니다. 기타 인증이 걸리는 경우에는 웹서비스를 사용할 수 있는 계정정보를 써줍니다.
GET 방식 request인 경우 "GET"을, POST 방식 request인 경우 "POST"를 써주고 실제 URL이 기록되어 있는 파일을 지정해줍니다. URL 리스트에 써놓은 순서대로 stress를 줄 경우에는 "SEQULIST"를, 무작위로 할 경우에는 "RANDLIST"를 써줍니다.
URL 리스트 파일의 예제는 아래와 같습니다. "url:"을 앞에 붙이고 Target Server 다음부터 써준다고 생각하면 됩니다.
url:/isapi_ldap/mbbs.dll/list?cid=chitest40&bid=1
url:/isapi_ldap/mbbs.dll/viewitem?cid=chitest40&bid=1&itemID=6&refid=6&pLevel=0&pDepth=0
url:/isapi_ldap/mbbs.dll/Openwrite?cid=chitest40&bid=1&ItemID=6
url:/isapi_ldap/mbbs.dll/Openwrite?cid=chitest40&bid=1&pid=7&RefID=7&pLevel=0&pDepth=0
url:/isapi_ldap/mbbs.dll/viewcontent?cid=chitest40&bid=1&itemid=8
url:/isapi_ldap/mbbs.dll/viewoneword?cid=chitest40&bid=1&itemid=8
url:/isapi_ldap/mbbs.dll/list?cid=chitest40&bid=2

- Authentication: 인증방식을 설정합니다. 비인증 사이트인 경우에는 "None"을, 인증 사이트인 경우에는 적합한 인증방식을 선택하면 됩니다.
- Cookies File: 쿠키 파일을 사용하는 경우 그 파일에 대한 전체 경로/파일명을 써줍니다.
- Client Timeout (s): Timeout 시간을 몇 초로 할 것인지를 설정합니다.
- HTTP Version: HTTP 1.0과 1.1 중에서 웹서버와 일치하는 버젼을 선택합니다.
- Load Images: 웹페이지를 response로 끌어올 때 링크된 이미지파일까지 끌어올 것인지 여부를 설정합니다.

각각의 항목을 설정한 예제화면은 아래와 같습니다.


 

각각의 항목을 설정했으면 Simulation 메뉴의 "Run Simulation"을 선택합니다. 테스트 시작 후 아래의 항목을 점검합니다.
Connections가 지속적으로 증가하고 Connection Failures는 증가하지 않는다.
인증 사이트인 경우 Authentication Negotiates와 Authentication Response가 지속적으로 증가한다.
URL Redirection이 일어나지 않는다.
Page Gets가 지속적으로 증가한다.
Successful Returns가 지속적으로 증가한다.
Error Returns가 Successful Returns에 비해 미미하게 떨어진다.
기타 Error 항목이 눈에 띄게 증가하지 않는다.
위와 같은 정상적인 상태로 하루정도는 유지가 되어야 합니다.

 

주의사항
InetMonitor는 WinInet을 사용하기 때문에 IE의 동작에도 영향을 받습니다. stress simulation 중에는 IE를 통한 웹서핑 등을 하지 않는 것이 좋습니다.
클라이언트의 성능에 맞게 user수를 설정해줄 필요가 있습니다. 무리한 수치를 부여하면 클라이언트쪽에서 뻗어버리는 사태가 발생하지요. 점진적으로 수치를 늘려가면서 적합한 값을 찾아야 합니다.