Download - practical perf testing - d2startup
![Page 1: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/1.jpg)
Practical Performance Testing
윤준호
![Page 2: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/2.jpg)
WHO AM I
nGrinder 프로젝트 리드
윤준호
![Page 3: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/3.jpg)
3
성능 테스트?
스트레스 테스트 로드 테스트
로드 상황에서크래시 등의 문제점 확인
로드 상황에서성능 특성 파악
성능 테스트 정의
![Page 4: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/4.jpg)
0
500
1000
1500
2000
2500
1 2 5 10 50 100 200
Apache
Nginx
Nginx-caching
동시사용자 #(Think Time 없을 때)
초당처리량
로드 테스트
성능 테스트 정의
![Page 5: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/5.jpg)
부적절한 커넥션 풀?
불충분한 쓰레드 풀?
메모리 릭?
리소스 릭?
비효율적인 코드?
스트레스 테스트
성능 테스트 정의
![Page 6: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/6.jpg)
성능 테스트 수행 시점
목표 성능 달성 위한 설계예) Non-Blocking? NoSQL? 캐시?
개별 프레임워크 테스트
중요 성능 키 팩터만부분적 테스트
실제 성능 확인및
병목/오류 제거
성능 목표 설정
예산 평가?
![Page 7: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/7.jpg)
성능 테스트 범위
리소스( js,css)
API
DB
미디어(동영상/음악)
서버 렌더링된웹페이지 기타
(MsgQueue/
Cache)
일반적으로는 제외
주요 테스트 대상
가끔 테스트
초기 선정시 테스트
일반적으로는 제외
가끔 테스트
![Page 8: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/8.jpg)
서버 용량 산정
Response Time(응답시간)
![Page 9: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/9.jpg)
서버 용량 산정
Concurrent User(동시 사용자)
![Page 10: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/10.jpg)
서버 용량 산정
Active User(활성 사용자)
<= 서버 쓰레드 또는 프로세스 개수(Blocking 서버 일 경우)
<= DB 커넥션 풀 개수
![Page 11: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/11.jpg)
서버 용량 산정
Transaction(트랜잭션)
• 작업 단위 - 정의하기 나름
• 개별 호출만? 로그인+개별호출? • 어떻게 정의하느냐에 따라
Response Time 도 재정의 필요
![Page 12: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/12.jpg)
서버 용량 산정
TPS(Transaction Per Second / 초당처리량)
• 초당처리량(TPS)= 활성 사용자(Active User) / 평균 응답 시간(Average Response Time)
• 초당처리량(TPS)= 동시 사용자(Concurrent User) / 요청 주기(Request Interval)
• 활성 사용자(Active User) = TPS * 평균 응답 시간(Average Response Time)
• 활성 사용자(Active User) = 동시 사용자(Concurrent User) * 평균 응답 시간(Average Response Time)
/ 요청 주기 (Request Interval)
• 활성 사용자(Active User) = 동시 사용자(Concurrent User) * 평균 응답 시간(Average Response Time) / [ 평균 응답 시간(Average Response Time) + 평균 Think 타임(Average Think Time) ]
![Page 13: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/13.jpg)
서버 용량 산정
• 활성 사용자 : 96.77 • 3000 * 0.5 / (0.5 + 15)• 동시 사용자 * 평균 응답 시간 / [ 평균 응답 시간 + 평균 Think 타임 ]
• 필요 TPS : 193.56• 50 / 0.5• 초당처리량(TPS)= 활성 사용자 / 평균 응답 시간
동시 사용자 3000명, 목표 응답 시간 0.5초, Think Time 15초 일 경우
![Page 14: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/14.jpg)
서버 용량 산정
그런데.. 구식…
Cloud 환경에서는 의미가 퇴색
On-Demand / AWS T2 instance / Scaling Group
![Page 15: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/15.jpg)
서버 용량 산정
일단 만들고
성능을 측정해본 다음
투입 서버 사양 / 개수 결정
이후 비용을 줄이기 위해 서버 최적화
![Page 16: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/16.jpg)
로드를 주는 방법?
스크립트 방식/폼 채워넣는 방식
ApacheBench? JMeter? Gatling? nGrinder?
테스트는 어떻게?
![Page 17: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/17.jpg)
무제한 로드 부여 가능 / 대규모 테스트에 적합
컨트롤러 테스트 대상 서버
로드 생성기
부하제어
스크립트
분산 테스트
테스트는 어떻게?
![Page 18: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/18.jpg)
nGrinder since 2010
nGrinder is NOT Grinder. It’s 3 times bigger with a lot of fixes.
![Page 19: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/19.jpg)
nGrinder 직접 실행방법
[ec2-user ~]$ wget --content-dispositionhttp://downloads.sourceforge.net/project/ngrinder/ngrinder-3.3/ngrinder-controller-3.3.war?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Fngrinder%2Ffiles%2Fngrinder-3.3%2F&ts=1460820117&use_mirror=tenet
[ec2-user ~]$ sudo java -XX:MaxPermSize=200m -jar ngrinder-controller-3.3.war -p 80 &
컨트롤러
컨트롤러 - 1Core, 2GRAM 권장 / 에이전트 - 2Core, 4GRAM 이상 권장
[ec2-user ~]$ wget --content-disposition 링크주소
[ec2-user ~]$ tar xvf 에이전트파일명.tar
[ec2-user ~]$ cd ngrinder-agent && run-agent-bg.sh
에이전트
JDK1.7필요JDK1.8지원 3.4부터
![Page 20: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/20.jpg)
nGrinder docker 실행방법
[ec2-user ~]$ docker run -d -v ~/.ngrinder:/root/.ngrinder \-p 80:80 -p 16001:16001 -p 12000-12009:12000-12009 \ngrinder/controller:3.3
컨트롤러
[ec2-user ~]$ docker run -d \-e CONTROLLER_ADDR=controller_ip:80 \ngrinder/agent:3.3
에이전트
![Page 21: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/21.jpg)
테스트 진행결과 리포트
테스트 설정스크립트 작성
상세 결과 보기
![Page 22: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/22.jpg)
내장 SVN
자이썬 그루비그루비
+메이븐
스크립팅 - 지원언어
![Page 23: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/23.jpg)
컨트롤러
에이전트1
에이전트2
컨트롤러+에이전트
스크립트스크립트
![Page 24: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/24.jpg)
에이전트
프로세스1
프로세스2
프로세스+쓰레드
쓰레드 1
쓰레드 2
쓰레드 3
쓰레드 4
쓰레드 1
쓰레드 2
쓰레드 3
쓰레드 4
가상유저
스크립트스크립트
![Page 25: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/25.jpg)
스크립팅 - 그루비
프로세스당 한번
쓰레드당 한번
지정한 만큼 반복
Request의 메소드가 호출될 때마다트랜잭션 1증가
![Page 26: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/26.jpg)
스크립팅 - 실행 순서
![Page 27: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/27.jpg)
스크립팅 - 자이선
Once per process
Once per process
Repeating
![Page 28: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/28.jpg)
스크립팅 - 실행 순서
![Page 29: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/29.jpg)
그루비 + 메이븐 + 서브버전 + 이클립스/IntelliJ
스크립트 디버깅 / 자동완성 / 의존성 관리
스크립팅 – IDE 지원
![Page 30: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/30.jpg)
스크립팅 – 트랜잭션
testMyTransaction 메소드 정상 호출시트랜잭션 1증가
![Page 31: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/31.jpg)
스크립팅 – 트랜잭션
Gtest test = new Gtest(1, “통계1”)MyTest object = new MyTest();test.record(object, “sendMessageToGoogle”)
class MyTest {
public void sendMessageToGoogle() {
구글에 HTTP를 보내고, 결과 검증
}….
}
통계 1을 준비하라
여기까지 왔으면 테스트가 성공한거다. 통계1에 트랜잭션을 하나 올려라
![Page 32: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/32.jpg)
실패 – Transaction 증가 없음
스크립팅 – 트랜잭션
![Page 33: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/33.jpg)
스크립팅 – 트랜잭션
성공 – Transaction 1 증가
![Page 34: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/34.jpg)
테스트 준비시 고려사항
비용(트래픽/스토리지)
외부 의존성(블록킹 당할 수 있음)
캐시 효과(주로 같은 유저 ID에 대한 지속적 호출시)
네트웍 딜레이 포함 여부(에이전트를 타겟 네트웍과 같은 네트웍에 배치?)
Think Time 포함 여부(제거시 동시사용자=활성사용자)
![Page 35: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/35.jpg)
테스트 준비시 고려사항
스트레스 테스트
• 주로 장기간 수행그러나 초기에는 오류때문에장기간 수행할 수 없을 것
• 개발서버 대상• 외부 API는 Mock으로 대체• 캐시 효과 크게 고려하지 않음• 네트웍 딜레이 제거함• Think Time 제거함
로드 테스트
• 주로 단기간 수행• 개발서버+스테이징서버+
실서버 대상• 외부 API 그대로 유지• 캐시 효과 제거• 네트웍 딜레이 제거는 유동적• Think Time 제거함
![Page 36: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/36.jpg)
서버 인터렉션 알아내기 - 웹
크롬 개발자 도구 사용
![Page 37: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/37.jpg)
서버 인터렉션 알아내기 - 앱
Chales Proxy 사용
Phone ServerChalesProxy
![Page 38: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/38.jpg)
스크립트 작성하기
![Page 39: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/39.jpg)
스크립트 작성하기
로그인후 네이버 접근
XXXXXXX
![Page 40: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/40.jpg)
스크립트 작성하기 – 외부 라이브러리 사용
Jython / Groovy
Maven Groovy
![Page 41: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/41.jpg)
데이터베이스 성능 측정
스크립트 작성하기
![Page 42: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/42.jpg)
큰 응답 스트림 제어
스크립트 작성하기
![Page 43: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/43.jpg)
스크립트 작성하기
동시에 여러 가중치 부여한 테스트 실행
![Page 44: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/44.jpg)
스크립트 작성하기
리소스 읽기 ( jython/groovy)
![Page 45: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/45.jpg)
리소스 읽기 / Groovy Maven
스크립트 작성하기
![Page 46: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/46.jpg)
스크립트 작성하기
쓰레드 마다 다른 일 시키기
![Page 47: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/47.jpg)
JSON 파싱하기
스크립트 작성하기
![Page 48: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/48.jpg)
XML 파싱하기
스크립트 작성하기
![Page 49: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/49.jpg)
테스트 실행
Ramp Up
![Page 50: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/50.jpg)
테스트 실행
Target Host
/etc/hosts 조작Load Balancing까지..
![Page 51: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/51.jpg)
성능 테스트에서 주로 발견되는 문제
부적절한 Pool 개수(작은 커넥션 풀 또는 WAS커넥션풀<DB커넥션풀)
락킹(synchronized 구문)
Non-Tread Safe 코드에 의한 비정상 동작(HashMap, ArrayList)
DB 인덱스 설정 오류 / 불필요한 DB 호출
지나친 로깅 또는 부적절 로거 설정
Full GC(메모리 Leak / 리소스 Leak)
단순 로직 오류
![Page 52: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/52.jpg)
테스트 결과 분석 - Rule of Thumbs
테스트 도구를 의심하지 말것!
문제는 스크립트를 잘못 짰거나
서버가 잘못 동작하는 것임
![Page 53: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/53.jpg)
테스트 모니터링
ngrinder monitor – CPU/메모리/네트웍
[ec2-user ~]$ wget --content-disposition 링크주소
[ec2-user ~]$ tar xvf 모니터파일명.tar
[ec2-user ~]$ cd ngrinder-monitor && run-monitor-bg.sh
![Page 54: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/54.jpg)
테스트 모니터링
https://github.com/firehol/netdata/wiki/Installation
netdata - 단일 인스턴스 상세 모니터링
![Page 55: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/55.jpg)
테스트 모니터링
pinpont – 대규모 시스템 성능 모니터링
XX XX
https://github.com/naver/pinpoint
![Page 56: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/56.jpg)
사례1 – JVM 메모리 부족
• 부하를 생성하는 타겟으로커넥션을 맺지 못함
• 서버의 CPU/MEM은 여유가있는 상황
• 서버측에 CLOSE_WAIT된 소켓이 존재할 거라 생각했지만 원인이 아님
• JVM 모니터를 통해 Full GC발생이 잦고 발생 시점에TPS가 떨어지는 것을 확인
• JVM 메모리 증가후 증가시켜 원하는 부하에서 응답을줄 수 있도록 튜닝
![Page 57: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/57.jpg)
사례2 – ulimit
• 생각보다 성능이 않나오고,vuser 를 증가시키더라도추가된 vuser 는접속 오류 발생
• CPU/메모리/네트웍은놀고 있는 상황.
• Ulimit을 늘린후 성능 개선
![Page 58: practical perf testing - d2startup](https://reader033.vdocuments.pub/reader033/viewer/2022050614/5a66a0ab7f8b9a5e648b4b97/html5/thumbnails/58.jpg)
감사합니다