2009년 1월 13일 화요일

Capacity Planning

출처 :http://blog.paran.com/isdev8587/5809148

1. Capacity Planning 이란?
웹서버 1대가 처리할 수 있는 request는 한계가 있습니다. 웹서버의 하드웨어 즉 프로세서, 메모리, 하드디스크, 네트워크 장비 등 뿐만 아니라 설치된 소프트웨어의 종류에 따라 그 한계는 달라지게 됩니다. 웹서비스 오픈 직후에는 이용자가 많지 않아 별다른 문제가 없던 서비스가, 점차 이용자가 많아지고 접속수가 많아지면서 웹서비스가 제대로 이루어지지 않는 사례가 빈번합니다. 서버에 접속이 잘 안된다든지, 응답속도가 늦다든지, 심지어는 웹서버가 다운되어 버린다든지..
만약 어떤 웹서버(또는 서비스)가 어느 정도까지의 request를 처리할 수 있는지 미리 알아낼 수 있다면 그에 따른 적절한 대비책을 마련하여 적용시킬 수가 있겠지요. 모의 실험을 통해 이러한 한계를 알아내고 대비책을 강구해내는 것을 Capacity Planning이라고 합니다.

2. Capacity Planning을 해야하는 이유
- 인터넷(그리고 웹서비스)에 대한 접속은 나날이 증가되어 간다.
- 다양한 서버에 대한 capacity 한계를 분석하고 예측하는 것은 필수적이다.
- 성능과 안정성의 확보가 선행되어야 정상적인 웹서비스가 가능하다.

3. Capacity Planning 방법
- Stress Tool
만약 웹서버에 동시 100명의 이용자가 접속을 시도하는 상황을 만든다고 가정해봅시다. 머리속에 가장 먼저 떠오르는 방법은? PC 100대를 놓고 100명의 테스트가 붙어서 "시~작!!" 소리와 함께 동시에 접속한다. 그리고 이것을 원하는 시간동안(1시간이나 하루 정도) 되풀이한다. - 맘에 드십니까? 하하.. 사람과 장소를 물색하려면 만만치 않겠군요. 돈도 엄청 들겠고.. ^^
이러한 상황을 손쉽게 재현할 수 있도록 해주는 tool이 있습니다. 일반적으로 stress tool 이라고 부릅니다.

- Monitoring Tool
웹서버의 현재 상태를 모니터링할 수 있는 어플리케이션입니다. 여기에서는 NT에 기본적으로 제공되는 성능모니터(Performance Monitor - 줄여서 PerfMon이라고 부릅니다)에 대해 설명드리겠습니다.


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수를 설정해줄 필요가 있습니다. 무리한 수치를 부여하면 클라이언트쪽에서 뻗어버리는 사태가 발생하지요. 점진적으로 수치를 늘려가면서 적합한 값을 찾아야 합니다.

PerfMon - Windows2000
[시작] | [관리 도구] | [성능]을 실행합니다.

성능 카운터에 어떤 것들이 있나 살펴보겠습니다. 화면 우측 상단의 "+" 버튼을 누르세요.

리모트 호스트를 모니터링할 경우에는 [다음 컴퓨터에서 카운터 선택] 항목을 선택하고 호스트명 혹은 IP 주소를 "" 다음에 입력합니다.
[성능 개체] 항목은 카테고리라고 볼 수 있으며, 시스템에 어떤 모듈들이 깔려있느냐에 따라 다른 항목이 나옵니다. .NET이 설치되어 있는 제 컴퓨터에서는 프로세서, 메모리, 웹 서비스를 비롯한 많은 카테고리들은 물론 ASP.NET 관련 항목들도 나오네요. "Web Service" 성능 개체를 선택합니다.

어떤 성능 개체를 선택하느냐에 따라 카운터의 종류가 바뀝니다. [다음 목록에서 카운터 선택] 항목을 선택하고 "Anonymous Users/sec" 카운터를 선택합니다. 호스트에 여러 개의 웹 사이트가 존재하는 경우에는 상단 그림 우편과 같이 웹 사이트가 모두 목록에 나오며 모니터링의 대상을 특정 웹 사이트로 한정시킬 수도 있습니다. [추가] 버튼을 눌러 카운터를 성능 모니터에 추가합니다. 같은 방법을 사용하여 원하는 카운터를 성능 모니터에 추가시킬 수 있습니다.
여러 개의 카운터를 추가하면 그래프에서 내가 어떤 카운터를 보고 있는 것인지 구분하기가 쉽지 않습니다. 툴바의 전구 모양 버튼을 누르거나 Ctrl+H 키를 눌러 내가 보고 있는 카운터를 하이라이트시킬 수 있습니다.

특정 카운터의 수치가 너무 높거나 낮아 모니터링에 어려움이 있을 때에는 카운터의 배율을 조정해줌으로써 해결할 수 있습니다. 위 화면 오른쪽 패널을 마우스 오른쪽 버튼으로 클릭하고 [등록 정보...] 메뉴를 선택합니다. 등록 정보 창이 뜨면 [데이터] 탭을 누릅니다.

배율을 조정할 카운터를 목록에서 선택하고 [배율] 항목에서 적절한 배율을 선택한 후 [확인] 버튼을 누릅니다.
다음으로, 성능 로그를 저장해두었다가 필요시에 다시 로드하는 방법을 알아보겠습니다. 할 일 없는(?) 개발자나 운영자라면 모르지만 대부분의 경우 모니터링 화면을 하루 종일 보고 있을 수는 없는 노릇입니다. 로그를 저장해두었다가 필요시에 꺼내어 본다면 업무시간을 효율적으로 사용할 수 있을 것입니다. 성능 모니터의 왼쪽 패널에서 "성능 로그 및 경고" 트리를 펼치세요.

"카운터 로그" 항목을 마우스 오른쪽 버튼으로 클릭하고 [새 로그 설정...] 메뉴를 선택합니다.

새 로그 설정창이 뜨면 위와 같이 임의의 이름을 주고 [확인] 버튼을 누릅니다.

위와 같은 일반 속성창이 뜨면 [추가] 버튼을 누르고 모니터링할 카운터를 추가합니다.

카운터를 추가하면 위와 같이 데이터 샘플 간격을 지정할 수 있습니다. 위의 예에서는 30초로 설정한 경우입니다.

[그림 B-9] 화면에서 [로그 파일] 탭을 누른다.

[로그 파일] 탭에서는 로그 파일의 저장 위치, 파일명 등을 지정할 수 있습니다. 위 화면에서는 파일명 형식을 "mmddhh" (월/일/시)로 지정하였습니다. [로그 파일 크기]는 디폴트가 "최대 제한"이며 이것은 해당 드라이브가 꽉 찰 때가지 로그를 계속 쌓으라는 의미입니다. 만약 로그 파일의 최대 크기를 제한하고 싶으면 "다음으로 제한" 항목을 선택하고 최대 크기를 지정합니다.

위 화면에서 [일정] 탭을 누르세요.


로그의 시작과 중지와 관련된 속성을 설정할 수 있습니다. 위의 화면은 로그 시작과 중지 시간을 지정한 예제입니다.

[확인] 버튼을 눌러 로그 설정창을 닫습니다.


우리가 추가 설정한 "dizzi_log" 항목이 나타납니다. 빨간 색 아이콘은 로그 작업이 수행되지 않고 있음을 나타내며, 로그가 시작되면 녹색 아이콘으로 바뀝니다.
로그가 시작되면 로그 파일 속성에서 지정한 디렉터리에 지정된 파일명으로 로그가 쌓이기 시작합니다. 작업 도중에 로그 저장 작업을 중지하고 싶으면 위 화면에서 "dizzi_log" 항목을 마우스 오른쪽 버튼으로 클릭하고 [중지] 메뉴를 선택합니다. 중지 상태가 되면 해당 항목이 다시 빨간 색 아이콘으로 바뀝니다.

이번에는 저장된 로그를 불러들여서 당시의 상태를 재현하는 방법을 알아보겠습니다. 성능 모니터 상단 툴바에서 "로그 파일 데이터 보기" 버튼을 누릅니다. 로그 파일을 지정하는 창이 뜨면 재현할 로그 파일을 지정하고, 성능 모니터의 "+" 툴바 버튼을 눌러 카운터를 선택합니다. 카운터 목록에는 로그 파일 속성을 설정할 당시에 추가했던 카운터들만 보입니다. 카운터 추가창을 닫으면 다음과 같이 모니터링 당시의 상태를 볼 수 있습니다.

PerfMon에서 체크해야 할 것
- MS에서는 peak time일 때 프로세서 평균 사용량이 75%를 넘지 않아야 정상적인 웹서비스가 가능하다고 권고합니다. 만약 이 수치를 넘어간다면 웹서버를 증설하든가 하드웨어 스펙을 올리던가 하여 대처를 해야 되겠지요.
- Stress 테스트를 하면서 Memory leak가 발생하지 않는가 그러한 것들도 PerfMon을 통해 점검할 수 있습니다.
- ISAPI Extension이나 기타 웹서버 모듈을 stress test할 때, Current connections 등의 수치가 폭주하지는 않는지 점검합니다.

이미지가 없어질수 있어서 복사해놓는다.

댓글 없음:

댓글 쓰기