CH04 성능 테스트
부하테스트
부하테스트를 처음 할 때에는 k6 라는 툴을 사용 했었는데, Jmeter가 인지도(?) 가 훨씬 높은 것 같고 나는 안 써봤지만 nGrinder 도 많이 쓰는 것 같다.
Jmeter 사용하면서 부하 테스트 진행했다. Jmeter 를 최초로 접했을 때, 실무에서 많이 쓸 줄 알았는데 나의 경험상 실무에서는 거의 안썼었다.
회사에서 인스턴스 스펙을 넉넉하게 사용했었어서 그랬던거 같기도 하고, 팀장님을 비롯하여 기존에 프로젝트를 구축하신 분들께서 모니터링 툴이나 구조 같은걸 잘 잡아두셔서 그랬던거 같기도 하다.
어찌 되었든 내가 개발하는 건에 대해서 만이라도 많은 양의 부하가 들어온다고 가정하고(그렇든 그렇지 않든) 가용성에 민감하게 생각하면서 개발해야겠다는 생각이 든다.
Jmeter 구성요소
Jmeter 는 부하테스트 툴이다. 아래는 Jmeter 구성요소이다.
Thread Group: "Thread Group"은 테스트 시나리오의 사용자 그룹을 정의하는 데 사용됩니다. 이 그룹은 동시에 실행되는 가상 사용자의 수, 램프업 및 램프다운 시간, 반복 횟수 등을 설정할 수 있습니다.
Sampler: "Sampler"는 테스트 시나리오에서 수행할 작업을 정의하는 데 사용됩니다. HTTP 요청을 보내거나 데이터베이스 쿼리를 실행하는 등의 작업을 수행할 수 있습니다. JMeter는 다양한 유형의 샘플러를 제공하며, 웹 애플리케이션, SOAP/XML-RPC 웹 서비스, FTP 서버, 데이터베이스 등 다양한 프로토콜을 지원합니다.
Listener: "Listener"는 테스트 실행 중에 결과를 수집하고 표시하는 데 사용됩니다. 예를 들어, "View Results Tree" 리스너는 각 샘플의 요청 및 응답 세부 정보를 표시하고, "Summary Report" 리스너는 테스트 결과 요약 정보를 보여줍니다. JMeter에는 다양한 유형의 리스너가 제공되며, 결과를 CSV 파일로 저장하거나 그래프로 표시하는 등의 다양한 형식으로 결과를 분석할 수 있습니다.
Assertion: "Assertion"은 테스트 결과를 검증하는 데 사용됩니다. 샘플 응답의 내용, 응답 시간, 상태 코드 등을 확인하여 테스트 결과의 유효성을 검사할 수 있습니다. 예를 들어, "Response Assertion"은 응답 데이터의 특정 패턴을 확인하고, "Duration Assertion"은 응답 시간이 특정 범위 내에 있는지 확인할 수 있습니다.
Timer: "Timer"는 각 샘플 간의 지연 시간을 설정하는 데 사용됩니다. 특정 동작 간의 딜레이를 추가하여 테스트 시나리오를 조정하거나 부하를 시뮬레이션할 수 있습니다. 예를 들어, "Constant Timer"는 각 샘플 사이에 고정된 시간 간격을 추가합니다.
실습
간단한 핸들러를 만들어서 Jmeter 를 통해서 부하테스트를 진행했다. 자주 쓰는 구성 요소들만 살펴본다.
Thread Group
Number of Threads : 총 요청을 얼마나 할 것인가(총 호출 횟수)
Ramp-up period(seconds) : Number of Threads 를 몇 초에 걸쳐서 요청 할 것인가
Loop Count : 설정한 Number of Threads 와 Ramp-up period(seconds) 의 조합으로 몇 번 반복시킬지 반복 횟수(infinite 설정할 경우 무한히 반복시킨다)
Sampler > HTTP Request
설정한 Thread Group 으로 수행할 테스트 작업. 위 설정 정보로 테스트를 진행한다. 실습은 간단한 예제이지만 인터페이스에서 볼 수 있듯이 파라미터나 바디 등에 정보를 설정할 수 있다. Configuration 을 이용하면 헤더 값 등을 설정할 수 있다.
Listener > View Results in Table, View Results Tree
각 요청에 대한 결과들을 알 수 있다. 사실 부하테스트에서 이런 건당 결과는 크게 의미가 없는 것 같긴 하다.
Listener > Aggregate Report
Label: 요청에 대한 레이블 또는 이름입니다. 해당 요청을 식별할 수 있도록 설정한 값입니다.
Samples: 요청이 실행된 샘플의 총 수입니다. 각 요청은 하나의 샘플로 계산됩니다.
Average: 모든 샘플의 응답 시간의 평균입니다. 샘플의 응답 시간을 모두 합산한 후, 요청 수로 나눈 값입니다.
Median: 모든 샘플의 응답 시간 중 중간값입니다. 응답 시간을 오름차순으로 정렬한 후, 중간에 위치한 값입니다.
90% Line: 모든 샘플의 응답 시간 중 90%에 해당하는 값입니다. 응답 시간을 오름차순으로 정렬한 후, 상위 90%에 해당하는 값입니다.
Min: 모든 샘플의 최소 응답 시간입니다.
Max: 모든 샘플의 최대 응답 시간입니다.
Error%: 발생한 오류 응답의 백분율입니다. 오류 응답은 HTTP 응답 코드가 400 이상인 경우를 의미합니다.
Throughput: 초당 요청 수입니다. 샘플의 수를 테스트 실행 시간(초)으로 나눈 값입니다.
KB/sec: 초당 전송된 데이터 양(KB)입니다. 요청 및 응답 데이터의 크기를 테스트 실행 시간(초)으로 나눈 값입니다.
Received KB/sec: 초당 수신된 데이터 양(KB)입니다. 응답으로 수신된 데이터의 크기를 테스트 실행 시간(초)으로 나눈 값입니다.
% Line 이 높게 나올 수 밖에 없는 이유는 N %이내의 요청들에 대해서 처리된 응답시간이기 때문이다. 100개의 요청중 응답시간을 기준으로 오름차순 정렬하고 90번째 요청의 응답시간이 곧 90% Line 이라고 이해하면 된다.
내가 실습 코드에서 0, 1, 2, 3, 4 초가 랜덤하게 sleep 되도록 처리해둬서 Average 가 약2초가 나온 것을 볼 수 있다.
Listener > Response Time Graph
Graph settings 의 interval 을 설정해서 응답 시간에 대한 그래프를 확인한다.
Listener > Aggregate Graph
Column settings 에서 보고 싶은 종류들을 체크하고 막대 그래프를 볼 수 있다.
Assertions
위에 이미 Assertions 에 가 무엇인지는 적어두었고, 종류들은 위와 같다.
Last updated