2021-nolto
2021-nolto copied to clipboard
[BE] k6를 사용한 성능 테스트를 수행
기능 요구 사항
성능 테스트 도구 비교
여러 성능 테스트가 있지만 이 중에서는 Java 플랫폼 응용 프로그램인 JMeter와 K6 사이에서 어떤 장점이 있는 지 알아보자.
JMeter 장점
- Jmeter는 GUI를 제공
- 코딩 경험이 많지 않으면 Jmeter
- Jmeter는 1988년에출시, 많은 프로토콜을 제공한다.
- k6는 2017년 출시하였다. 지원되는 프로토콜은 아래와 같다.
- Jmeter는 출시한 지 오래되어 k6에 비해 문서가 많다.
- Jmeter는 테스트에 대한 리포트를 기본적으로 제공한다.
- 램프업 패턴(초기 서비스의 사용율이 비주기적으로 등락하는 현상)에 대한 시뮬레이션이 가능하다
K6의 장점
- 어려운 설정 없이 바로 설치하여 사용할 수 있다.
- Jmeter는 java의 sdk, jdk 등의 버전을 확인하며 설치해야하고 복잡
- k6는 플러그인을 따로 설치할 필요 없이 내장되어 있다.
- 성능이 향상되어있기 때문에 인프라에 대한 비용이 절감
- J는 1스레드 1Vuser ⇒ 굉장히 구식 효율적 X
- k는 이것에 대한 옵티마이저를 함. (스케쥴링을 하면서)
- k는 10만명 가까이 vUser를 생성할 수 있음
- 협업에 k6가 좋음.
- jmeter는 기본적으로 UI를 통한 테스트 프로그램의 작성이 가능. 따라서 수정을 하려면 jmx파일을 복사본으로 가져와 수정해야하는데, 코드 자체도 굉장히 구식이고 파일을 여는 데도 시간이 오래 걸림
- 반면 k6는 js를 작성해서 사용하기 때문에 굉장히 쉽게 접근이 가능하고 수정할 수 있다.
- k6는 목표 지향적이다.
- threshold를 설정해 테스트의 레벨을 정할 수 있음
출처 : https://youtu.be/noZppBruOSY
Jmeter는 이럴 때 사용한다.
- 여러 다양한 프로토콜을 사용하는 경우
- 시나리오를 기록할 필요가 있는 경우
- 모든 테스트에 대한 전체적인 시나리오가 요구되는 경우
- UI를 선호하거나 자스/yml/json을 잘 모르는 경우
K6는 이럴 때 사용한다.
- 개발친화적인 CLI를 사용하는 경우
- 세션을 기록하기 위해 har 파일을 사용하는 경우
- 임계점을 설정하고 확인하는 경우 (목표 기반, 편하게 자동화하는 로드 테스트)
- 좋은 문서화 제공 (https://k6.io/docs/javascript-api/)
- 자바스크립트를 통한 경량화된 사용
- nodejs, 브라우저를 실행하지 않음
출처 : https://azevedorafaela.com/2020/07/06/load-tests-jmeter-vs-k6/
cloud watch 적용기
- was ec2에 역할 추가
- cloud watch agent 패키지 설치
wget https://s3.amazonaws.com/amazoncloudwatch-agent/debian/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i amazon-cloudwatch-agent.deb
-
/opt/aws/amazon-cloudwatch-agent/etc/statsd.json
생성
{
"metrics": {
"namespace": "k6",
"metrics_collected": {
"statsd": {
"service_address": ":8125",
"metrics_collection_interval": 5,
"metrics_aggregation_interval": 0
}
}
}
}
- cloudwatch agent 실행
sudo amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/etc/statsd.json
- cloudwatch agent 상태 확인
amazon-cloudwatch-agent-ctl -a status
- k6 실행
K6_STATSD_ENABLE_TAGS=true k6 run --out statsd script.js
-
checks
— 성공적인 검사 비율 -
data_received
— 수신 된 데이터의 양 -
data_sent
— 전송 된 데이터 양 -
http_req_blocked
— 요청을 시작하기 전에 사용 가능한 TCP 연결을 기다리는 데 소요 된 시간 -
http_req_connecting
— TCP 연결 설정에 소요 된 시간 -
http_req_duration
— 요청에 대한 총 시간.http_req_sending
+http_req_waiting
+를 기준으로 계산됩니다.http_req_receiving.
-
http_req_failed
- 데이터 수신에 실패한 정도인듯? -
http_req_receiving
— 데이터 수신에 소요 된 시간 -
http_req_sending
— 데이터 전송에 소요 된 시간 -
http_req_tls_handshaking
— TLS 핸드 쉐이킹에 소요 된 시간 -
http_req_waiting
— 원격 호스트의 응답을 기다리는 데 소요 된 시간 -
http_reqs
— k6에 의해 생성 된 총 요청 -
iteration_duration
—default
함수 를 실행하는 데 걸린 총 시간 -
iterations
—default
함수가 호출 된 총 횟수 -
vus
— 활성 가상 사용자 수 -
vus_max
— 테스트에 할당 된 최대 가상 사용자 - https://ichi.pro/ko/k6-sogae-api-buha-teseuteu-dogu-21071336538749
부하테스트와 스트레스 테스트
성능 테스트
- 실제 트래픽 상황에서의 정상 동작
- 기존 시스템 대비 BenchMarking
부하 테스트
- 리소스 병목 탐색, 어플리케이션 버그 탐색
- 이벤트 상황과 같은 순간 트래픽 최대치, 한계치를 탐색
- 신규 스펙 장비에서 MYSQL 설정 최적화 탐색
스트레스 테스트
- 장기간 부하 발생에 대한 한계치를 탐색, 예외 동작 상황 확인
- Graceful Shutdown 정상 동작 확인
- 데이터베이스 failover 상황, 자동 복구, 예외 동작 상황 확인
- 외부 요인(PG사)의 밀릴, 예외 상황 동작 확인