오늘 오랜 시간 성능 테스트를 해오신 분과 이야기를 하면서 많은 것을 깨달았다.



성능 테스트란 걸 태어나서 알게 된 건 창피하게도 회사에 입사하고 나서부터다.

업무가 성능테스트만 있는 게 아니라 완벽히 배우지는 못했지만 그동안 봐오면서, 성능 테스트는 단순히 우리의 서비스 아키텍처(시스템)가 얼마나 많은 사람들을 얼마의 시간 안에 안정적으로 처리할 수 있는지, 시스템 자원은 얼마나 사용했느지 등등 단순하게 생각했다.

하지만 잘못된 생각이였다.

가령 제공하는 서비스가 웹,앱이라고 생각해보자.
간단하게 딱 6개의 페이지가 있고 이런 페이지들에 여러 기능들이 붙어있다고 생각해보자.


1. 메인페이지
2. 로그인 페이지
3. 상품 페이지
4. 상품 상세 페이지
5. 주문페이지
6. 주문완료 페이지

1번 메인페이지에는 회사 로고, 검색할 수 있는 검색창, 로그인, 고객센터, 각종 상품 이미지 등 굉장히 많은 것들이 연결되어 있다. 당연히 메인 페이지는 서비스의 첫 시작에 보이기 때문에 회사의 입장에서 매출에 가장 영향력이 있을만한 상품들의 사진과 로그인 기능 등 많은 기능들이 있을 것이다.

2번 로그인 페이지에는 ID,PW를 입력하게 되어있고 로그인 버튼, 아이디 찾기, 비밀번호 찾기 등이 있을 거고 버튼을 누르면 DB를 찌르는 API가 연결되어 있을 것이다.

3번 상품 페이지는 고객이 특정 상품(바지,니트, 카디건 등)을 검색하고 그에 맞는 상품들이 나오는 페이지라고 생각해보자. 이 페이지 역시 여러 상품들의 이미지, 설명, 버튼들이 있을 것이다.

4번 상품 상페 페이지에는 고객이 특정 상품을 눌러서 그 상품에 대한 각종 정보들, 구매 버튼, 장바구니 버튼들이 있을 것이다.

5번 주문페이지는 아마도 고객이 특정 상품의 구매버튼을 누르고 들어간 화면이다. 배송 예정일, 수량, 사이즈, 상품명, 결제방법, 배송 주소, 결제 버튼 등 꽤 많은 정보들이 들어가 있고, 결정적으로 고객의 최종 결정이 이루어지는 페이지이다.

6번 주문완료 페이지는 고객이 주문을 완료했으니 감사합니다. 등의 문구와 주문번호 등이 나올 것이다.


자, 이제 시나리오를 생각해보자.

고객은 메인페이지에 들어와 둘러보다가 로그인을 한다. 그리고 관심 있는 상품을 검색한 뒤 상품의 상세 페이지를 들어가 색상과 사이즈 수량을 누른 후 구매하기 버튼을 누른다. 최종 결제 페이지에서 배송지 등 각종 정보를 확인하고 결제 버튼을 누른다. 고객은 주문 완료 페이지가 뜸과 동시에 다시 메인으로 가거나 쇼핑몰을 빠져나간다.

 

맨 위에 나열한 1~6번 url을 기반으로 실제 스크립트를 작성했다고 하자. 각 페이지 번호마다 트랜잭션을 설정하여 각 url페이지마다의 응답속도를 측정해본다고 하자.

첫 번째로 중요한 건, 부하의 비율이다. 회사에서 이벤트를 해서 평소보다 많은 사람들이 물건을 구경하거나 사러 들어왔다고 해보자. 대부분의 쇼핑몰들은 메인 페이지를 구경하는 사람이 특정 상품을 검색해서 보는 페이지보다 월등히 많다.

특정 상품을 검색해서 보는 페이지가 실제 물건을 결제하는 페이지에 머무르는 사람보다 월등히 높다.

즉, 크게 보면 하나의 웹사이트 일지 몰라도 실제 부하를 더 많이 주어야 하는 페이지와 덜 주어야 하는 페이지를 구분해야 한다. ( 물론, 회사마다 다를 것이다. 평소에 GA툴을 이용해 PV를 수집했을 것이다. 이 기록을 통해 결정해야 한다.)


두 번째로 중요한 건, 응답속도의 기준이다. 2가지 케이스를 생각해보자.
( case 1,2 두 case모두 총 60 tps 부하를 주며 페이지 순서대로 50%, 10%, 20%, 15%, 5% 비율로 tps를 나누었다고 가정한다. )
case 1. 6개 페이지 모두 3초가 나와서 평균 응답속도는 3초가 되었다.
case 2. 6개 페이지 평균 응답속도가 3초로 case 1과 똑같다.
하지만  1번 페이지: 1초
          2번 페이지: 3초
          3번 페이지: 2초
          4번 페이지: 3초
          5번 페이지: 3초
          6번 페이지: 6초
가 나왔다고 해보자 얼핏 보면 모든 페이지가 일관성 있게 3초가 나온 case 1이 잘 짜인 아키텍처라고 할 수 있다. 하지만 이것은 비즈니스 관점에 따라 case 2가 훨씬 영리하게 설계했다고 볼 수 있다.

앞서 말했듯이 우리의 웹이나 모바일 서비스를 이용하고 가는 사람들의 대부분은 메인 페이지에 머무른다. 

1번 메인 페이지에 대하여 case 1은 3초, case 2는 1초가 나왔다. 즉, 같은 사람들이 들어왔을 때 case 2는 더 빠른 속도로 자신들의 정보를 웹에 뿌린다. ( 흔히 로딩 시간이 2~3초가 넘어가면 고객은 쇼핑몰을 닫거나 새로고침을 계속 누른다...)

자, 그럼 case 1과 case 2가 제일 많이 차이나는 6번을 보자. 6번은 주문서 페이지에서 결제하기를 누른 순간부터 주문번호가 화면에 나타날 때까지의 응답속도를 나타낼 것이다.

case 1은 3초, case 6은 6초가 나왔다. 쇼핑몰의 경우 비즈니스를 잘 이해해야 한다. 고객은 메인에 들어오고, 상품을 검색하는 2가지 임무가 중요할 것이고 이 2가지 임무에 참을성이란 없다. 하지만 이미 물건을 사기로 마음먹고 카드번호를 입력하고 결제를 누르는 순간 고객의 임무는 끝이다. 또한 쇼핑몰의 입장에서도 이미 주문은 들어갔으며 매출도 올라갔다. 즉, 1번 메인 페이지만큼 6번 주문 완료 페이지는 고객의 구매에 큰 영향을 미치지 않는다는 것이다.

 

이렇게 자기 회사의 비지니스를 이해하고 좀 더 살펴봐야할 부분, 개선이 필요한 부분들을 찾아내야 한다.

 

물론 전체적으로 다 빠른 응답 시간이 나오면 좋겠지만, 매우 힘들고 수많은 이슈를 개선해야 하니깐....

오늘, 비록 다른 회사지만 나보다 훨씬 많은 경력을 가지신 분과 대화를 하면서 단순히 성능을 테스트하는 게 아니라, 우리의 비즈니스를 이해하고, 좀 더 전략적으로 성능 테스트를 한다면 개발팀에 더 좋은 피드백과 결과적으로 우리의 서비스 향상까지 이어질 수 있다는 생각을 가지게 되었다.

'성능테스트' 카테고리의 다른 글

성능테스트 종류  (0) 2019.10.03
Thread Dump는 무엇이고 언제 하는가?  (0) 2019.10.02
다시 시작  (0) 2019.10.02

( 모든 글은 내가 이해하고, 메모장 개념으로 작성하는 것이라 틀린 부분도 많고, 뒤죽박죽입니다. )

 

Performance Testing에는 대략 6가지의테스트로 나눌 수 있다.

 

1. Load Testing

2. Endurance Testing

3. Volume Testing

4. Scalability Tesing

5. Spike Testing

6. Stress Testing

 

좋은 사진이 있어서 가지고 왔다 ( 출처 : https://abstracta.us/blog/performance-testing/how-to-make-a-performance-test-plan/ ) 

 

먼저 Performance Testing 이란 무엇일까 " 시스템 구성 요소가 특정 상황에서 어떻게 수행되는지 확인하기 위해 수행되는 테스트" 이다. 

 

테스트를 통해서 제품의 자원 사용률, 확장성, 안정성 등 많은 것들을 검증할 수 있다.  또한 제품의 설계 및 아키텍처의 성능 문제를 해결하는데 중점을 둔다.

 

< Load testing > 

 

목적 :  극한의 상황까지 부하를 주어서 시스템의 내구성을 테스트하고 결과를 모니터링하기 위함 

목표 : 버퍼 오버플로우, 메모리 누수 및 메모리의 잘못된 관리와 관련 응용 프로그램들의 결함을 노출시킨다. 이러한 이슈들은 Load Testing의 결과를 산출하는데 load balancing problems, bandwidth issues, 시스템의 Capacity 등이 포함된다.

 

즉, 시스템이 한계에 도달 할 때까지 부하를 지속적으로 증가시켜 테스트하는 방법이다.

Volume Testing과 비슷하지만 Volume Testing은 주로 데이터베이스의 성능에 중점을 둔다는 점에서 차이가 있다.

 

일이 생겨서 밤에 다시 하기로

'성능테스트' 카테고리의 다른 글

성능테스트와 비지니스  (0) 2019.10.04
Thread Dump는 무엇이고 언제 하는가?  (0) 2019.10.02
다시 시작  (0) 2019.10.02

( 모든 글은 내가 이해하고, 메모장 개념으로 작성하는 것이라 틀린 부분도 많고, 뒤죽박죽입니다. )

 

규모가 큰 회사들의 앱과 웹은 수많은 사람들의 동시 사용자를 받아야 하는데 이를 장애없이 받기위해서 셀 수 없을만큼 많은 스레드를 사용한다. 

 

가끔 성능 테스트를 하다 보면 예상했던 응답속도, TPS에 못 미치는 결과가 나온다. 그럴 때 나는 AA담당자에게 WAS서버  Thread Dump를 요청한다.  AA담당자가 Dump를 떠주시면 성능 테스트 결과와 함께 분석 리포트를 테스트 요청팀에 전달한다. 

 

궁금한점이 생겼다. 과연 Thread Dump는 무엇이고 언제 하는 것인가? 

 

들어가기 앞서 프로세스가 무엇인지 먼저 보자

 

< 프로세스란? >

 

프로세스란 현재 실행중인 프로그램을 말한다. Task라고도 불린다.

프로세스는 사용 중인 파일과 데이터, 스레드의 정보, 전역 데이터 등등 많은 자원을 포함하고 있다.

 

이런 내용은 추후 OS를 다시 공부하면서 더 자세히  정리해보도록 하자. 다시 본론으로 들어간다.

 

 

< Thread 란 무엇인가 >

 

스레드는 프로그램 내에서, 더 자세히는 프로세스 내에서 실행되는 흐름의 단위이다.

보통 프로그램은 하나의 스레드를 가지고 있는데 프로그램에 따라 두개 이상의 스레드, 즉, 멀티스레드 방식을 실행하기도 한다. 

 

스레드에는 여러 상태가 있다.

 

NEW : 처음 스레드가 생성된 상태이며 아직 start가 되지 않은 상태이다.

RUNNABLE : 실행 대기 상태 , start가 호출이 된 상태이며 run이 호출되면 Running상태가 된다.

WAITING : 일시 정지 상태, 다른 스레드가 통지할 때까지 기다리는 상태이다.

TIMED_WAITING : 일시 정지 상태, 영어 그대로 주어진 시간동안 기다리는 상태이다.

BLOCKED : 일시 정지 상태, 사용하려고 하는 객체의 Lock이 풀릴 때까지 기다리고 있는 상태이다.

TERMINATED : 종료 상태, 실행을 마친 상태이다.

 

 

< Thread Dump란? - JAVA >

 

Java 스레드는 데몬 스레드와 비데몬 스레드(일반적인 스레드) 2가지로 나눌 수 있다.

 

데몬 스레드 : main 스레드(자신에게 요청을 주는 스레드)를 돕는 서포트 역할을 하는 스레드이다. 즉, main 스레드가 종료되면 데몬 스레드도 강제 종료된다. 마스터-슬레이브 느낌이랄까...

 

비데몬 스레드 : 데몬 스레드가 아닌 것들이다. 즉, 자신의 작업을 다른 스레드가 종료되었다고 해서 종료하는게 아닌 끝까지 수행하도록 되어있는 스레드

 

이런 스레드들을 말그대로 Dump 퍼온다는 뜻이다. 서버 프로세스에 속한 모든 스레드들의 상태를 분석할 수 있도록 추출한다는 것이다.

 

그럼 이제 또 궁금증이 생긴다. 이 메모를 하게된 원인중 하나인 " 언제 Thread Dump를 하나? " 이다. 회사에서는 막연히 성능테스트 후 기대 이하의 결과가 나올 때 했지만, 이번 기회에 메모해 보려고 한다.

 

 

< Thread dump는 언제 작업하는 것인가? >

 

1. WAS서버( 자바 어플리케이션 )의 처리(응답속도)가 늦을 경우

2. WAS서버의 자원 사용률이 높을 경우

3. 서버 Heap Memory가 GC가 일어남에도 불구하고 지속적으로 증가하는 경우

등 많은 이유가 있지만, 모두 성능과 연관되어 있다. 

 

자 그러면 어떻게 Dump를 할까?

 

 

< Thread Dump를 하는 방법 >

 

1. jstack을 이용

2. Java VisualVM을 이용

3. PID를 확인하여 Kill 방법을 이용

더 자세한 내용은 현재 읽고있는 책을 다 읽고 이어서 써보겠다....(지식부족)

 

 

자 이제 Dump를 했다고 가정해보자. 목적은 성능적인 이슈가 왜 발생했는지 분석하는 것이다. 그럼 이렇게 Dump를 뜬 정보들에서는 무엇을 볼 수 있을까?

 

1. 스레드 이름: 스레드의 고유 이름. java.lang.Thread 클래스를 이용해 스레드를 생성하면 Thread-(Number) 형식으로

                    스레드 이름이 생성된다. java.util.concurrent.ThreadFactory 클래스를 이용했으면 pool-(number)-

                    thread-(number) 형식으로 스레드 이름이 생성된다.

2. 우선순위: 스레드의 우선순위

3. 스레드 ID: 스레드의 ID. 해당 정보를 이용해 스레드의 CPU 사용, 메모리 사용 등 유용한 정보를 얻을 수 있다.

4. 스레드 상태: 스레드의 상태.

5. 스레드 콜스택: 스레드의 콜스택(Call Stack) 정보.

이렇게 4가지를 볼 수 있다. ( 출처 : https://d2.naver.com/helloworld/10963 )

 

 

또한 많은 정보들을 볼수 있다. 스레드들이 각가 Block상태인지. 데드락상태인지, 무한정 waiting중인지 등등...

이 부분도 책을 읽고 써봐야지

'성능테스트' 카테고리의 다른 글

성능테스트와 비지니스  (0) 2019.10.04
성능테스트 종류  (0) 2019.10.03
다시 시작  (0) 2019.10.02

메모를 하지 않으면 발전이 없을거 같아서 다시 시작. 2019.10.02

'성능테스트' 카테고리의 다른 글

성능테스트와 비지니스  (0) 2019.10.04
성능테스트 종류  (0) 2019.10.03
Thread Dump는 무엇이고 언제 하는가?  (0) 2019.10.02

+ Recent posts