성능 분석이란?
성능 테스트
- 실제 트래픽 상황에서의 정상 동작 하는지를 파악.
부하 테스트
- 리소스 병목 탐색, 어플리케이션 버그 탐색
- 이벤트 상황과 같은 순간 트래픽 최대치, 한계치를 탐색
- 신규 스펙 장비에서 MYSQL 설정 최적화 탐색
스트레스 테스트
- 장기간 부하 발생에 대한 한계치를 탐색, 예외 동작 상황 확인
- Graceful Shutdown 정상 동작 확인
- 데이터베이스 failover 상황, 자동 복구, 예외 동작 상황 확인
- 외부 요인(PG사)의 밀릴, 예외 상황 동작 확인
성능 분석을 하는 이유
- 서비스 및 서비스 시스템의 성능을 확인하기 위해 실사용 환경과 비슷한 환경에서 테스트를 진행하는 것
- 어느 정도의 부하를 견딜 수 있는지
- 한계치에서 병목이 생기는 지점 찾기
- 자원을 효율적으로 사용할 수 있다.
- 메모리 누수, 오류, 오버플로우 발생하는지 확인 가능
- 최악의 상황에서 어떤 동작을 하는지 확인 가능
- 장애 조치와 복구의 동작을 확인 가능
- 구글 리서치 자료에 따르면 3초 이상 걸리면 53%의 사용자가 떠나며, 표시 속도가 1초에서 7초로 늘어난다면 이탈률은 113%가 된다고 함
→ 웹 성능테스트를 통해 사용자에게 빠른 서비스를 제공할 수 있어야 한다.
성능 테스트의 기대 효과
- 시스템 측면 : 주요 성능 결함 및 구조적 위험 우선 식별, 운영시스템 성능 최적화, 유지보수 비용 및 시
스템 비용 최소화 등 - 사용자 측면 : 서비스의 품질 개선, 응답시간 향상을 통한 업무 효율 증대, 사용자 만족도 향상 등
nGrinder
- nGrinder는 네이버에서 성능 측정 목적으로 jython(JVM위에서 파이썬이 동작)으로 개발 된 오픈소
스 프로젝트이며,2011년에 공개 됨. - 실제 서비스에 투입 되기 전, 실제와 같은 환경을 만들어 놓고 서버가 사용자를
얼마 만큼 수용할 수 있는지를 실험 할 때 사용 - 언어로는 jython (java + python)과 Groovy(자바 호환)를 지원.
Controller
- 퍼포먼스 테스팅(부하테스트)를 위해 웹 인터페이스를 제공
- 테스트 프로세스를 체계화
- 테스트 결과를 수집해 통계로 보여줌
Agent
- Controller의 명령을 받아 실행.
- target이 된 머신에 프로세스와 스레드를 실행시켜 부하를 발생.
- 대상 시스템의 CPU와 Memory를 모니터링.
Target
- 부하 테스트를 받는 머신
설치 방법
- controller와 agent를 둘다 설치해야 한다.
docker를 사용하는 방법
- 운영 체제별 도커 데스크탑 설치
- 우분투 도커 설치
- controller 설치 및 실행
# docker hub에서 이미지 가져오기
docker pull ngrinder/controller
# 가져온 이미지로 실행하기
docker run -d -v ~/ngrinder-controller:/opt/ngrinder-controller --name controller -p 80:80 -p 16001:16001 -p 12000-12009:12000-12009 ngrinder/controller
- agent 설치 및 실행
# docker hub에서 이미지 가져오기
docker pull ngrinder/agent
# 가져온 이미지로 실행하기
# 위에서 생성했던 controller와 연결
docker run -d --name agent1 --link controller:controller ngrinder/agent
직접 파일을 다운로드해서 실행시키는 방법
이 경우에 자바를 사용해야한다.
- 자바 다운로드
- nGrinder 다운로드
- 받고싶은 버전(보통은 최신버전)을 선택하여 .war 파일을 다운 받는다.
- 다음 받은 후 해당 명령어를 실행한다.
# java -Djava.io.tmpdir=[임시파일을 저장할 경로] -jar [다운받은 war 파일 이름] --port=[열고싶은 포트번호]
# 예시
java -Djava.io.tmpdir=/Users/choi/Desktop/test/ -jar ngrinder-controller-3.5.8.war --port=8301
- 정상적으로 실행 되었다면
localhost:[지정한 포트]
로 접속할 시 nGrinder 메인 화면이 뜬다
- 초기 관리자 ID와 password는 둘다 admin이다.
- 접속 후 오른쪽 상단의
admin
클릭 후에이전트 다운로드 클릭
해서 압축 파일 다운로드
- 다운받은 압축 파일을 압축해제 해제
# tar -xvf [다운받은 압축파일]
tar -xvf ngrinder-agent-3.5.8-localhost.tar
- 압축 해제 후 run_agent.sh 실행 (윈도우는 .bat)
./run_agent.sh
- 이렇게 실행할 경우 agent도 틀어짐
사용 방법
에이전트 | 테스트에 사용할 에이전트의 개수 |
---|---|
스크립트 | 사용자가 해당 주소로 부하를 걸 스크립트를 보여줌 |
RHEAD | 선택된 스크립트의 내용을 보여주는 페이지로 이동 |
테스트 대상 서버 | 테스트를 진행할 서버의 리스트를 보여주며, 추가버튼 클릭 시 테스트 받을 서버를 늘릴 수 있다. |
테스트 기간 | 해당 테스트를 얼마만큼 실행할 지 설정하는 항목 |
실행 횟수 | 사용자가 설정한 쓰레드당 몇 번의 테스트를 실행할 것인지를 지정 |
Ramp-Up | 점차 부하를 가할 수 있는 기능. 부하를 가할 때, 가상 사용자 수를 늘리는 것 이 아닌 process나 thread를 늘린다 |
초기 개수 | 처음 시작 시 가상사용자의 수를 설정 |
초기 대기 시간 | 테스트를 언제부터 실행시킬 지 설정 |
증가 단위 | 해당 process/thread를 몇 개씩 증가시킬지를 설정 |
Ramp_Up 주기 | 상승 시간을 설정 |
- 여러가지 스크립트를 작성해서 각 기능에 대해 얼마나 부하가 걸리는지 확인할 수 있다.
// 로그인 페이지 예시 스크립트
@Test
public void testLogin() {
// 메인 페이지 요청
HTTPResponse mainPageResponse = request.GET("http://example.com/main")
// 로그인 요청
Map<String, Object> loginParams = [username: "user", password: "pass"]
HTTPResponse loginResponse = request.POST("http://example.com/login", loginParams)
// 로그인 응답 확인
assertThat(loginResponse.statusCode, is(200))
}