How to test my server framework’s performance?
갓 만들어진 서버 프레임워크의 성능을 제대로 테스트하기란 쉽지 않다. 대체로 (서비스 예정인) 표준 하드웨어 사양 하에서 가상 클라이언트를 1000-2000 개 정도 붙이고 적절한 트래픽을 주었을 때 반응 속도라든지 CPU 점유율, 메모리 사용량 등을 측정하는 것이 일반적인데, 문제는 서버 프레임워크에서 채택한 내부 구조에 따라서, 특히 동기화, 쓰레드 같은 민감한 요소들에 따라 결과가 천차만별이 된다는 것이다.
예를 들면 이런 구조에서는 트래픽이 늘어날수록 CPU 사용량이 폭주할 수도 있고, 저런 구조에서는 접속자가 늘어날수록 반응속도가 느려질 수도 있다는 것인데, 이번 마이그레이션에서도 비슷한 현상을 경험했다. 사실 어제 아침까지만 해도 테스트 결과가 좋아서 안심하고 있었는데, 혹시나 해서 트래픽을 2배로 늘린 후 성능 모니터링을 해보니 CPU 점유율이 130%까지 급증하는게 아닌가... 반면 예전에 만들어둔 코드는 동일 조건에서도 CPU 점유율은 40%를 넘지 않았다. 흑흑.
오늘 Visual Studio .NET 2005 에 내장된 프로파일러로 을사오적(?)들을 찾아내서 모두 제거하고, 최종적으로 6배 트래픽으로 테스트한 결과 debug에서는 120%, release에서는 150% 정도 빨라진 놈을 완성할 수 있었다. 아직 idle 체크를 위한 타이머 처리라든지, 메시지 핸들러 같은 구태의연한 작업이 남아있긴 하지만, 웬지 성공적으로 끝이 날 것 같다는 희망에 차 있는 상태다. :)
아무튼 이번 삽질을 통해, 가상 클라이언트를 이용한 서버 프레임워크의 테스트 방법론에 대해서 좀 더 체계화를 해야 할 필요성을 느꼈다. 이번 주에 한 일이라고는 고작, 2개의 머신에서 파라미터를 적절히 바꿔가면서 서버와 클라이언트를 수동으로 실행하고, 성능 모니터링 도구를 이용해서 CPU 및 메모리 사용량을 눈으로 살펴보고, 최종적으로 클라이언트측에 남겨진 통계 로그 파일을 위키 페이지로 복사한 후, 성능의 변동을 살펴보는 단순 작업들을 반복해왔기 때문이다. 물론 밀린 일정 덕에 자동화에 투자할 시간은 더이상 없겠지만 대략 다음과 같은 테스트 프레임워크를 구성해 볼 기회가 있었으면 좋겠다.
준비물
- 커맨드라인 명령으로 내부 구조를 실시간으로 변경할 수 있는 서버 프레임워크
- 클라이언트 개수, 초당 트래픽 등을 손쉽게 제어할 수 있는 가상 클라이언트
- CPU 점유율, 메모리 사용량 등의 통계 데이터를 XML 이나 CSV 형식으로 저장
- 다른 머신으로 원클릭 자동 배포를 지원하는 도구
- 다른 머신에서 특정 실행 파일을 실행해주는 도구
- 다른 머신에서 통계 데이터 파일을 읽어와서 적절히 merge 해주는 도구
- 테스트 케이스의 리스트에 등록된 테스트를 위 도구를 이용해서 잘 실행해주는 통합 도구
- 다른 머신의 특정 프로세스의 다양한 성능 카운터들을 실시간 그래프로 보여주는 도구
테스트 도구 디자인
유닛 테스트의 개념과 형식을 빌어오면 좋을 듯하다.
- TestSuite : 트리 방식으로 실행할 테스트 슈트 및 케이스를 지정할 수 있어야 한다. NUnit 를 상상하면 가장 좋을 듯.
- TestCase : 테스트하고자 하는 서버와 클라이언트 실행 파일을 선택하고 각각의 커맨드라인 옵션을 설정한다.
- Setup, TearDown : 관련 파일을 특정 머신으로 복사하거나 덮어쓴다. 테스트가 끝이 나면 결과를 받아온다.
- TestTools : 각 머신에서 살펴보고자 하는 성능 카운터를 선택하고, 예상하는 한계치를 설정한다.
- TestRunner : 특정 머신에 복사된 파일을 지정된 파라미터로 실행한다. 만약을 위해서 adplus 도 붙여주는 센스!
테스트 리포트
(내부 구조, 클라이언트 개수, 트래픽)에 따른 (반응 속도, CPU 점유율, 메모리 사용량)의 변화를 한눈에 알아볼 수 있어야 한다.
-
테스트 개요
-
테스트 아이디
- 테스트 설명
- 테스트 시각
- 빌드
- 서버 환경
-
클라이언트 환경
-
서버/클라이언트 성능 카운터 및 통계 데이터
-
CPU 통계
- 메모리 통계
- 트래픽 통계
- 각종 서버 성능 카운터
- 서버의 반응 속도
웬지 마이크로소프트나 ant 같은 것들이 이런 기능을 제공할 법도 한데 말이다. 혹시나 비슷한 기능을 가진 도구를 아시는 분은 꼭 코멘트 부탁드린다.