실전 프로젝트도 이제 추석을 제외하면 7일 가량 남은 것 같다. 생각보다 쿼리 성능 개선에서 시간을 많이 잡아 먹었고 남은 7일 동안은 부하테스트를 진행해보고자 한다. 살면서 처음으로 부하테스트를 진행하기 때문에 아무것도 모른다. 그래서 멘토님이 추천해주신 책 "아마존 웹 서비스 부하 테스트 입문"으로 공부하면서 진행해보려고 한다.
해당 글은 책을 읽으면서 정리한 내용들인데 더 자세한 내용을 알고싶다면 책을 구매해서 공부하시는 것을 추천한다!
가용성(Availability) : 시스템이 서비스를 정상적으로 제공할 수 있는 상태를 말한다.
📌 서비스 다운의 원인
- 광역 네트워크 장애
- 광역 전원 장애
- 하드웨어 장애
- 네트워크 기기 장애
- 서버 물리 장애(전원, CPU, 메모리, 디스크, 메인보드 등...)
- 소프트웨어 장애
- 보안에 문제가 있어 시스템을 이용할 수 없는 경우
- 그 외의 소프트웨어의 버그
- 점검 기간
- 하드웨어 교체
- 소프트웨어 업데이트
- 미들웨어 업데이트
- 고부하에 따른 요청 타임아웃
가용성이 높고 낮음은 가동률의 퍼센티지(%)로 표시된다. 가용성이 99.99%라는 경우 99.99% 시간을 정상적으로 이용 가능한 시스템을 말함. => 1년에 53분 정도는 서비스가 다운된다는 의미.
모놀리식이 아닌 만약 마이크로 서비스의 경우라면?
부하 테스트 도구 : 웹 시스템뿐만 아니라 특정 시스템을 사용하는 입장에서 시뮬레이션하여 대상 시스템의 상태를 고부하로 만들어준다. 시스템에 많은 요청을 일이크기 DoS 공격이나 DDoS 공격이 들어온 것과 같은 상태를 만든다. 부하 테스트 도구를 가동한 서버를 부하 테스트 서버라고 한다.
📌 부하 테스트 도구 공통 개념
용어 | 설명 |
---|---|
클라이언트 | HTTP 요청을 동시에 1개만 줄 수 있는 요청 생성기 |
클라이언트 동시 가동 수 | 테스트 시작 후에 테스트 도구에서 사용할 수 있는 클라이언트 수 |
Ramp-up 기간 | 테스트 시작 후 모든 클라이언트를 기동하기까지의 준비 기간 |
시나리오 | 클라이언트별로 설정된 HTTP 요청 생성 패턴 |
시나리오 실행 횟수 | 클라이언트가 시나리오에 따라 요청을 보내는 횟수 |
Throughput | 시스템이 시간당 처리할 수 있는 요청 수 |
Latency | 테스트 도구가 요청을 보내고 응답을 받을 때까지의 시간 |
📌 클라이언트가 실제 부하 테스트를 하는 이미지
이미지1 클라이언트별 HTTP 요청 라이프 사이클
(1) 부하 테스트 서버에서 HTTP 요청 생성
(2) HTTP 요청이 네트워크로 이동
(3) 로드 밸런서가 요청을 서버에 전달
(4) HTTP 요청을 웹 서버가 받음
(5) HTTP 응답을 웹 서버가 보냄
(6) 로드 밸런서를 통해 외부로 나감
(7) HTTP 응답이 네트워크로 이동
(8) 부하 테스트 서버가 HTTP 응답 받음. 그 이후로 다시 (1)로 돌아감
⚠ 주의점 3가지
📌 부하 테스트 도구상의 부하와 실 운영환경의 차이
이름 | 특징 |
---|---|
Apache Bench | - 단일 URL 부하 테스트는 간단히 가능 |
- POST/PUT 부하 테스트 가능(DELETE 불가능) | |
- 요청별로 파라미터 변경 불가 | |
- 시나리오 테스트 불가 | |
부하 테스트 서버의 CPU 코어 1개만 사용 | |
Apache JMeter | - Apache Bench에서 할 수 없는 DELETE 테스트 가능 |
- 요청 별로 동적 파라미터 변경 가능 | |
- 복수의 URL에 시나리오 기반의 복잡한 부하 테스트 가능 | |
- 시나리오는 XML을 사용하지만, GUI로 사용할 수 있고 비교적 직관적인 시나리오 작성 가능 | |
- Proxy Recorder를 사용한 시나리오 작성도 가능 | |
- 부하 테스트 결과 출력 기능이 다양 | |
- 복수의 서버를 연계하여 비교적 고부하 테스트 가능 | |
- HTML 콘텐츠는 콘텐츠 내에서 필요한 여러 가지 정적 리소스를 동시에 확인할 수 있는 테스트 가능 | |
Locust | - 시나리오를 파이썬 스크립트로 작성할 수 있어 유연한 시나리오를 만들 수 있다. |
- 테스트 시나리오가 스크립트로 되어 있어 소스 코드로 관리할 수 있다. | |
- 필요한 서버 리소스가 작으므로 작은 크기의 부하 테스트 서버로 테스트할 수 있다. | |
- 테스트 결과 리포트가 간단하다. | |
Tsung | - 시나리오를 XML로 작성하는 것은 JMeter와 같지만, 작성 방식이 JMeter보다 비교적 간단하고 이해하기 쉽다. |
- 그러나 GUI로 시나리오를 작성하거나 볼 수 없어 복잡한 시나리오에는 조금 맞지 않는다. | |
- JMeter와 같이 Proxy Recorder를 사용하고 시나리오 생성이 가능하다. | |
- 적은 부하 테스트 서버로 고부하 테스트에 적합하다. | |
- 결과는 JSON으로 표시되고 결과를 보기 위한 웹 화면이 준비되어 있다. |
📌 각 하위 시스템의 상세 모니터링과 시스템 프로파일링을 하기 위한 도구
하위 시스템 | WATCH 해야 하거나, 방법을 알아야 하는 항목 |
---|---|
네트워크 | 전송량 |
하드웨어 및 OS | CPU, 메모리, 프로세스 수, SWAP, Load Average |
TCP | 외부 커넥션 상태(ESTABLISH나 FIN WAIT 등) |
디스크 | IOPS, R/W 전송 데이터 양 |
미들웨어 | 커넥션 수(<->Max Connection) |
애플리케이션 | 프로파일러로 모니터링 |
MySQL | Slow Query, Process List |