linux/기타

nGrinder 설치 (부하 테스트)

배움엔 끝이없다 2022. 3. 25. 10:49
728x90
반응형

 

nGrinder란?


nGrinder 네이버에서 성능 측정 목적으로 jython(JVM위에서 파이썬이 동작)으로 개발 오픈소스 프로젝트이며, 2011년에 공개 하였습니다. 바닥부터 개발을 것이 아니라 The Grinder라는 오픈소스 기반에서 개발 하였습니다. nGrinder는서버에 대한 부하를 테스트 하는 것이므로 서버의 성능 측정이라고도 있습니다성능 측정이란 것은 실제 서비스에 투입 되기 , 실제와 같은 환경을 만들어 놓고 서버가 사용자를 얼마 만큼 수용할 있는지를 실험 사용합니다. 만약 이와 같은 테스트를 하지 않으면, 엔지니어가 동시 접속자를 1000명정도로 예상하고 이에 맞는 설정을 구성하는데 예상에 넘는 동시 접속자가 발생해 버리면 서버가 죽어버려 서비스를 없는 문제가 있습니다. 이를 방지하기 위해 서비스에 앞서 테스트를 서버의 성능을 테스트 하는 것입니다


 

출처: https://brownbears.tistory.com/25

 

nGrinder Architecture


nGrinder는 Controller, Agent, Targer 서버로 나눠져 있습니다.

Controller:

  • 퍼포먼스 테스팅(부하테스트)를 위해 웹 인터페이스를 제공
  • 테스트 프로세스를 체계화
  • 테스트 결과를 수집해 통계로 보여줌

Agent: Controller의 명령을 받아 실행합니다.

  • agent 모드가 실행될 때, target이 된 머신에 프로세스와 스레드를 실행시켜 부하를 발생
  • monitor 모드가 실행되면 대상 시스템의 CPU와 Memory를 모니터링

 

agent들이 실행될 때, agent들은 컨트롤러와의 연결을 시도합니다. 그것들은 AgentControllerServer 구성요소와 연결이 됩니다. AgentControllerServer는 현재 agent pool을 관리합니다. 유저가 performance test를 시작을 할 때마다, agent들을 조절하는 새로운 콘솔이 생성되고, 요구하는 agent의 수는 AgentControllerServer로부터 조절됩니다. 이 콘솔(SingleConsole이라는 이름의 콘솔은 그라인더 내의 콘솔과 차별화 됩니다.) test script와 test resources를 할당받은 다수의 agent들에게 전송하고 test가 끝날 때까지 test flow 통제를 시작합니다.  이 테스트가 끝난 이후에, 테스트에 사용된 agents들은 AgentControllerServer로 돌아갑니다. 이와 마찬가지로 SingleConsole 또한 ConsoleManager에게 돌아갑니다.

nGrinder와 Grinder사이의 가장 큰 차이점은 nGrinder는 컨트롤러에서 다수의 콘솔 인스턴스와 agents들을 유지하는 것입니다. 각각의 콘솔은 다른 콘솔로부터 독립적이고, 모든 콘솔들은 동시에 실행할 수 있습니다. 많은 agent들은 미리 연결이 될 수 있고, agent가 필요하여 요청을 받을 때마다 언제든지 할달 될 수 있습니다. grinder와 같지 않게, nGrinder는 agent 머신의 활용도를 극대화 하기 위해 개발되었습니다.

'Performance Center' 같이 잘 알려진 부하 테스트 툴은 사용자가 테스트를 시작할 때 agent의 가용성을 보장하기 위해 테스트 예약 기능을 갖습니다. 그러나 예약 기능은 agent 활용도 문제의 원인이 됩니다. 사람들은 실제로 테스트를 하지 않는 동안에도 예방 조치로 에이전트를 보유하는 경향이 있음을 나타냈습니다. 이러한 조사 결과로, 평균적으로 agent의 CPU 활용도는 10% 미만인 것으로 결과가 나왔습니다.

이러한 이유로, 예약 대신, nGrinder는 실제 테스트가 실행될 때, 테스트를 위해 동적으로 agents들을 할당하기 위해 다수의 test와 동적인 agent 할당이 가능하도록 하였습니다. 이러한 것은 nGrinder를 모든 부하 테스트 툴 가운데서, unique한 부하 테스트 툴로 만들었습니다.  agent들의 수가 상대적으로 적게 가지고 있으면, 다수의 사용자들은 다수의 테스트를 동시에 실행할 수 있습니다. 동시에 실행할 수 있는 테스트의 수는 free agent(동적으로 할달될 수 있는 agent)의 수에 의존합니다.


 

nGrinder 성능 향상


nGrinder는 최대한 OS설정과 독립적으로 운영되도록 구현되어 있습니다. 따라서 agent 성능을 최적화 하기 위한 OS 튜닝 포인트가 아래 리스트를 제외하고는 거의 없습니다.

  • ulimit 파일 오픈 가능 카운트를 1만 이상 유지
    • 성능 테스트시, 소켓을 많이 열 수 있기 때문
  • OS영역을 제외하고 3G정도의 Free 메모리를 유지할 것
  • socket linger option 설정을 조정하여, 소켓이 사용 후 바로 반납 되도록 할 것
    • 스크립트의 socket linger를 설정하지 않으면 OS TCP 설정을 따르기 때문에 둘 중 하나를 선택
    • jython socket 패키지를 사용할 경우 스크립트 상에 다음과 같이 설정하면 가능
      •  clientsock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', l_onoff, l_linger))

또한 controller의 성능 향상을 위해 db를 변경해도 개선이 되지 않습니다. (e.g, embedded db -> cubrid)


 

nGrinder 권장 사양


controlleragentmonitor
Core 1~2 Core 2 Core 1
RAM 2GB 4GB(free memory 3GB) 50MB

agent의 경우, Groovy로 sleep time 없이 단순 HTTP CALL 경우, 6000 vuser까지 15분 가냥 1개의 agent 동작 가능

실제 유저 행위를 시뮬레이션하여 10초 씩 thinktime을 준다면, agent당 1만 vuser(thread)를 견딜 수 있음.

agent는 메모리가 가장 중요한 이슈


 

nGrinder 사용 용어


Controller:

  • 퍼포먼스 테스팅(부하테스트)를 위해 웹 인터페이스를 제공
  • 테스트 프로세스를 체계화
  • 테스트 결과를 수집해 통계로 보여줌

Agent: Controller의 명령을 받아 실행합니다.

  • agent 모드가 실행될 때, target이 된 머신에 프로세스와 스레드를 실행시켜 부하를 발생
  • monitor 모드가 실행되면 대상 시스템의 CPU와 Memory를 모니터링

Target: 부하 테스트를 받는 머신입니다.

vuser: virtual user로 동시에 접속하는 유저의 수를 의미합니다. 

  • virtual user를 구하는 공식은 vuser=agent*process*thread

TPS: 초당 트랜젝션의 수 - 초당 처리 수  (Tranjaction Per Second)

  • 위 공식으로 에이전트 10개, 프로세스 10개, 각 스레드 300이라면 30,000개의 vuser(thread)가 지속적으로 요청하는 상황. 그래서 30,000번의 요청을 서버에서 1초 미만으로 처리한다면 TPS는 30,000이상이 될 것이고, 30,000번의 요청을 서버에서 2초 이상 으로 처리한다면 TPS는 15,000이하가 됩니다.

트랜잭션:  HTTP Request가 성공할 때마다, 트랜잭션의 수가 1씩 증가합니다.

Peak TPS: 초당 처리 수의 최대치

Response Time: 사용자가 request한 시점(클릭한 시점)에서 시스템이 Response를 할 때까지의 시간

Think Time: 사용자에게 전달된 정보는 사용자가 해당 내용을 인지하고 다음 동작을 취할 때까지의 생각하는 시간이 필요한 시간


 

nGrinder 설치


JAVA 설치

1. JDK 설치

# sudo yum install -y java-1.8.0-openjdk-devel

 

2. 환경 변수 설정

# readlink -f /usr/bin/javac

 

3. 환경 변수 설정

# vi /etc/profile

HISTFILESIZE=0       // 하단에

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.11.0.9-1.el7_9.x86_64          // 추가

 

4. 변경 내용 저장

# source /etc/profile

 


 

nGrinder controller 설치

https://github.com/naver/ngrinder/releases 여기서 최신 버전을 확인

 

1. ngrinder controller 설치

wget https://github.com/naver/ngrinder/releases/download/ngrinder-3.5.5-p1-20210531/ngrinder-controller-3.5.5-p1.war

 

2. 설치가 완료되면 아래 명령어로 ngrinder 실행

java -XX:MaxPermSize=200m -jar ngrinder-controller-3.5.5-p1.war

백그라운드 실행하려면 끝에 & 붙이기

 

3. 공인IP:8080 포트로 ngrinder 접속(초기 ID/PW : admin)

 


 

 

Agent Server 설정

 

1. Controller 서버의 nGrinder 접속 후 Agent 다운로드 ( ADMIN - Agent ManagentMent)

다운로드 링크를 복사 후 Agent 서버에 위 파일을 설치합니다.

# wget http://133.186.244.72:8080/agent/download/ngrinder-agent-3.5.5-p1.tar

 

2. 다운로드한 tar 파일 압축 해제

sudo tar xvf ngrinder-agent-*.tar

 

3. 압축 해제한 폴더로 이동

cd ngrinder-agent

 

4. 해당 폴더에 __agent.conf 파일 생성

Agent 파일을 UI에서 바로 다운로드하면 __agent.conf라는 파일이 함께 생성되는 반면에 위 예시처럼 링크를 통해 다운로드 진행시 해당 파일이 생성되지 않습니다. 따라서 직접 작성해줘야 합니다.

# vi __agent.conf

common.start_mode=agent
agent.controller_host= Controller IP주소
agent.controller_port=16001
agent.subregion=
agent.owner=

agent.controller_host에 controller가 설치된 IP주소를 입력하고 추가적으로 16001 포트 open (양쪽 다)

 

5. 설정이 완료되면 아래 명령어로 Agent를 실행합니다.

# ./run_agent.sh

정상적으로 실행됬다면,

위와 같은 화면을 보실 수 있습니다. 빨간색으로 칠한 부분은 공인 IP 입니다.

 

 

nGrinder에 다시 돌아가 admin - 에이전트 관리로 이동하면 방금 등록한 서버가 목록에 나타납니다.

 

 

728x90
반응형
LIST