58
Practical Performance Testing 윤준호

practical perf testing - d2startup

Embed Size (px)

Citation preview

Page 1: practical perf testing - d2startup

Practical Performance Testing

윤준호

Page 2: practical perf testing - d2startup

WHO AM I

nGrinder 프로젝트 리드

윤준호

Page 3: practical perf testing - d2startup

3

성능 테스트?

스트레스 테스트 로드 테스트

로드 상황에서크래시 등의 문제점 확인

로드 상황에서성능 특성 파악

성능 테스트 정의

Page 4: practical perf testing - d2startup

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

부적절한 커넥션 풀?

불충분한 쓰레드 풀?

메모리 릭?

리소스 릭?

비효율적인 코드?

스트레스 테스트

성능 테스트 정의

Page 6: practical perf testing - d2startup

성능 테스트 수행 시점

목표 성능 달성 위한 설계예) Non-Blocking? NoSQL? 캐시?

개별 프레임워크 테스트

중요 성능 키 팩터만부분적 테스트

실제 성능 확인및

병목/오류 제거

성능 목표 설정

예산 평가?

Page 7: practical perf testing - d2startup

성능 테스트 범위

리소스( js,css)

API

DB

미디어(동영상/음악)

서버 렌더링된웹페이지 기타

(MsgQueue/

Cache)

일반적으로는 제외

주요 테스트 대상

가끔 테스트

초기 선정시 테스트

일반적으로는 제외

가끔 테스트

Page 8: practical perf testing - d2startup

서버 용량 산정

Response Time(응답시간)

Page 9: practical perf testing - d2startup

서버 용량 산정

Concurrent User(동시 사용자)

Page 10: practical perf testing - d2startup

서버 용량 산정

Active User(활성 사용자)

<= 서버 쓰레드 또는 프로세스 개수(Blocking 서버 일 경우)

<= DB 커넥션 풀 개수

Page 11: practical perf testing - d2startup

서버 용량 산정

Transaction(트랜잭션)

• 작업 단위 - 정의하기 나름

• 개별 호출만? 로그인+개별호출? • 어떻게 정의하느냐에 따라

Response Time 도 재정의 필요

Page 12: practical perf testing - d2startup

서버 용량 산정

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

서버 용량 산정

• 활성 사용자 : 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

서버 용량 산정

그런데.. 구식…

Cloud 환경에서는 의미가 퇴색

On-Demand / AWS T2 instance / Scaling Group

Page 15: practical perf testing - d2startup

서버 용량 산정

일단 만들고

성능을 측정해본 다음

투입 서버 사양 / 개수 결정

이후 비용을 줄이기 위해 서버 최적화

Page 16: practical perf testing - d2startup

로드를 주는 방법?

스크립트 방식/폼 채워넣는 방식

ApacheBench? JMeter? Gatling? nGrinder?

테스트는 어떻게?

Page 17: practical perf testing - d2startup

무제한 로드 부여 가능 / 대규모 테스트에 적합

컨트롤러 테스트 대상 서버

로드 생성기

부하제어

스크립트

분산 테스트

테스트는 어떻게?

Page 18: practical perf testing - d2startup

nGrinder since 2010

nGrinder is NOT Grinder. It’s 3 times bigger with a lot of fixes.

Page 19: practical perf testing - d2startup

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

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

테스트 진행결과 리포트

테스트 설정스크립트 작성

상세 결과 보기

Page 22: practical perf testing - d2startup

내장 SVN

자이썬 그루비그루비

+메이븐

스크립팅 - 지원언어

Page 23: practical perf testing - d2startup

컨트롤러

에이전트1

에이전트2

컨트롤러+에이전트

스크립트스크립트

Page 24: practical perf testing - d2startup

에이전트

프로세스1

프로세스2

프로세스+쓰레드

쓰레드 1

쓰레드 2

쓰레드 3

쓰레드 4

쓰레드 1

쓰레드 2

쓰레드 3

쓰레드 4

가상유저

스크립트스크립트

Page 25: practical perf testing - d2startup

스크립팅 - 그루비

프로세스당 한번

쓰레드당 한번

지정한 만큼 반복

Request의 메소드가 호출될 때마다트랜잭션 1증가

Page 26: practical perf testing - d2startup

스크립팅 - 실행 순서

Page 27: practical perf testing - d2startup

스크립팅 - 자이선

Once per process

Once per process

Repeating

Page 28: practical perf testing - d2startup

스크립팅 - 실행 순서

Page 29: practical perf testing - d2startup

그루비 + 메이븐 + 서브버전 + 이클립스/IntelliJ

스크립트 디버깅 / 자동완성 / 의존성 관리

스크립팅 – IDE 지원

Page 30: practical perf testing - d2startup

스크립팅 – 트랜잭션

testMyTransaction 메소드 정상 호출시트랜잭션 1증가

Page 31: practical perf testing - d2startup

스크립팅 – 트랜잭션

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

실패 – Transaction 증가 없음

스크립팅 – 트랜잭션

Page 33: practical perf testing - d2startup

스크립팅 – 트랜잭션

성공 – Transaction 1 증가

Page 34: practical perf testing - d2startup

테스트 준비시 고려사항

비용(트래픽/스토리지)

외부 의존성(블록킹 당할 수 있음)

캐시 효과(주로 같은 유저 ID에 대한 지속적 호출시)

네트웍 딜레이 포함 여부(에이전트를 타겟 네트웍과 같은 네트웍에 배치?)

Think Time 포함 여부(제거시 동시사용자=활성사용자)

Page 35: practical perf testing - d2startup

테스트 준비시 고려사항

스트레스 테스트

• 주로 장기간 수행그러나 초기에는 오류때문에장기간 수행할 수 없을 것

• 개발서버 대상• 외부 API는 Mock으로 대체• 캐시 효과 크게 고려하지 않음• 네트웍 딜레이 제거함• Think Time 제거함

로드 테스트

• 주로 단기간 수행• 개발서버+스테이징서버+

실서버 대상• 외부 API 그대로 유지• 캐시 효과 제거• 네트웍 딜레이 제거는 유동적• Think Time 제거함

Page 36: practical perf testing - d2startup

서버 인터렉션 알아내기 - 웹

크롬 개발자 도구 사용

Page 37: practical perf testing - d2startup

서버 인터렉션 알아내기 - 앱

Chales Proxy 사용

Phone ServerChalesProxy

Page 38: practical perf testing - d2startup

스크립트 작성하기

Page 39: practical perf testing - d2startup

스크립트 작성하기

로그인후 네이버 접근

XXXXXXX

Page 40: practical perf testing - d2startup

스크립트 작성하기 – 외부 라이브러리 사용

Jython / Groovy

Maven Groovy

Page 41: practical perf testing - d2startup

데이터베이스 성능 측정

스크립트 작성하기

Page 42: practical perf testing - d2startup

큰 응답 스트림 제어

스크립트 작성하기

Page 43: practical perf testing - d2startup

스크립트 작성하기

동시에 여러 가중치 부여한 테스트 실행

Page 44: practical perf testing - d2startup

스크립트 작성하기

리소스 읽기 ( jython/groovy)

Page 45: practical perf testing - d2startup

리소스 읽기 / Groovy Maven

스크립트 작성하기

Page 46: practical perf testing - d2startup

스크립트 작성하기

쓰레드 마다 다른 일 시키기

Page 47: practical perf testing - d2startup

JSON 파싱하기

스크립트 작성하기

Page 48: practical perf testing - d2startup

XML 파싱하기

스크립트 작성하기

Page 49: practical perf testing - d2startup

테스트 실행

Ramp Up

Page 50: practical perf testing - d2startup

테스트 실행

Target Host

/etc/hosts 조작Load Balancing까지..

Page 51: practical perf testing - d2startup

성능 테스트에서 주로 발견되는 문제

부적절한 Pool 개수(작은 커넥션 풀 또는 WAS커넥션풀<DB커넥션풀)

락킹(synchronized 구문)

Non-Tread Safe 코드에 의한 비정상 동작(HashMap, ArrayList)

DB 인덱스 설정 오류 / 불필요한 DB 호출

지나친 로깅 또는 부적절 로거 설정

Full GC(메모리 Leak / 리소스 Leak)

단순 로직 오류

Page 52: practical perf testing - d2startup

테스트 결과 분석 - Rule of Thumbs

테스트 도구를 의심하지 말것!

문제는 스크립트를 잘못 짰거나

서버가 잘못 동작하는 것임

Page 53: practical perf testing - d2startup

테스트 모니터링

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://github.com/firehol/netdata/wiki/Installation

netdata - 단일 인스턴스 상세 모니터링

Page 55: practical perf testing - d2startup

테스트 모니터링

pinpont – 대규모 시스템 성능 모니터링

XX XX

https://github.com/naver/pinpoint

Page 56: practical perf testing - d2startup

사례1 – JVM 메모리 부족

• 부하를 생성하는 타겟으로커넥션을 맺지 못함

• 서버의 CPU/MEM은 여유가있는 상황

• 서버측에 CLOSE_WAIT된 소켓이 존재할 거라 생각했지만 원인이 아님

• JVM 모니터를 통해 Full GC발생이 잦고 발생 시점에TPS가 떨어지는 것을 확인

• JVM 메모리 증가후 증가시켜 원하는 부하에서 응답을줄 수 있도록 튜닝

Page 57: practical perf testing - d2startup

사례2 – ulimit

• 생각보다 성능이 않나오고,vuser 를 증가시키더라도추가된 vuser 는접속 오류 발생

• CPU/메모리/네트웍은놀고 있는 상황.

• Ulimit을 늘린후 성능 개선

Page 58: practical perf testing - d2startup

감사합니다