Skip to content

부하 테스트 일대

SeoKyung Lim edited this page Dec 14, 2023 · 1 revision

1. nGrinder로 시도해봄 (fail 🥲)

일대기 | 누군가 nGrinder로 성공한다면 귀띔해주세요 🤦‍♂️

부하 테스트 ✅

Web UI를 통해 스크립트와 테스트를 간편히 작성하고 실행할 수 있고, 테스트 문법으로 groovy (JUnit과 비슷)를 제공해주는 장점을 바탕으로 Ngrinder를 활용해 부하 테스트를 해보고자 하였다.

(TMI. 네이버의 오픈 소스라서 한국말도 지원해줌 bb)

컨트롤러 → 테스트가 돌아가게끔 만드는 서버

에이전트 → 부하를 발생시키는 주체

nGrinder를 활용한 성능 테스트

(사실 컨트롤러와 에이전트는 다른 서버에 두는 것이 정확한 성능 측정에 good)

참고한 페이지들

https://velog.io/@jhyun223/ubuntu-20.04-docker-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-64o0sc5w
(ubuntu 20.04 환경에서 도커 설치)

https://velog.io/@flaehdan/nGrinder-%EC%9E%90%EB%8F%99%ED%99%94
(나중에 보면 좋을 ngrinder 자동화)

https://peachytree.tistory.com/31
(docker 버전 낮추는 명령어)

https://imjeongwoo.tistory.com/111
(도커 옵션들)

controller, agent 실행에 사용한 명령어들

(원래 agent는 직접 사이트에서 파일을 다운받아서 쓰라고 하던데, 이렇게 pull 해와도 잘 돌아간다!)

$ docker pull ngrinder/controller:3.5.5
$ docker run -d -v ~/ngrinder-controller:/opt/ngrinder-controller --name controller5
-p 80:80 -p 16001:16001 -p 12000-12009:12000-12009 ngrinder/controller:3.5.5

$ docker pull ngrinder/agent:3.5.5
$ docker run -d --name agent6 --link controller5:controller ngrinder/agent:3.5.5

발생한 문제들 💣

  1. 테스트 자체가 돌아가지 않던 에러

    버전을 가장 최신 버전 3.5.8로 해두고 있었는데, 찾아보니 안정성 문제가 꽤 있다고 하여 버전을 3.5.5로 낮추었다.

    Untitled

  2. ERROR java.util.concurrent.ExecutionException: javax.net.ssl.SSLException: Received fatal alert: handshake_failure 에러

    java.lang.System.setProperty("https.protocols", "TLSv1.2")
    
    (뺀 거)
    import org.ngrinder.http.HTTPRequest
    (넣은 거 / 구 버전일 때 문제 없이 잘 돌아간다는 글을 읽었다)
    import net.grinder.plugin.http.HTTPRequest
    
    (또 도전해본거)
    System.setProperty("https.protocols", "TLSv1.1,TLSv1.2,TLSv1.3");
    
    grep -r 'tls'로 적힐 만한 곳을 찾았으나 fail... 
    

    ngrinder-user-kr - SSLHandshakeException오류에 대해 질문드립니다.

    Untitled

    버전이 1.3이라 그런가???

  3. (문제는 아니지만) 파일 업로드 테스트 할 때 파일 어떻게 업로드 하지?

    테스트 스크립트와 동일한 위치에 resources 디렉토리 생성해서 파일 업로드 해주면 됨!!

임시 방편 해결 🫠 이 아니었다 🤦‍♂️

일단은 임시 방편으로 우리 서버 주소를 http 로 바꿔서 요청 넣었다.

(어차피 https로 redirect 하게끔 cloudflare에서 설정해줘서…)

저 https의 tls 1.3 버전을 테스트 서버에서 맞출 방도를 아직 못찾겠다 🥲

Untitled

  • TPS (Test Per Seconds) = 초당 테스트가 몇 번 일어났는지

이게 테스트는 성공으로 나왔는데 http로 요청을 넣어도 cloudflare 자체에서 https로 redirect 된다. 근데 문제는 우리 서버의 포트가 3000으로 되어 있어 포트를 옮겨야 하는데, 이 과정에서 응답 코드가 301(Moved Permanently)로 뜨면서 테스트 자체는 해보지도 못하고 종료되는 것 같다. 그래서 본 서버 IP 주소로 테스트를 해보고자 하는데 … 테스트가 안돌아간다. 본 서버의 ACG 설정이 아무래도 덜 되어있어서 그런 것 같다(고 추측을 해본다). 근데 아니었고…

nGrinder 설치 (부하 테스트)

(혹시나해서 java와 agent를 다운 받았는데도 잘 안돌아간다.. ㅠㅜㅠㅜ)

AWS - nGrinder 구축하기

이 테스트를 통해 나타난 결과(인 줄 알았던 것)에서 유의할 점 🤔

우리는 한 서버에서 controller와 agent를 사용하기 때문에 서버 자체에서 지연이 발생해 나타난 테스트 결과보다 실제 성능이 아주 조금(?) 더 좋을 것이다.

2. k6로 시도해봄 (success 😎)

일대기

k6를 선택하게 된 이유 ✏️

nGrinder에 지친 심신을 위해, 간단한 부하 테스트 툴을 찾고 있던 중에 k6를 발견했다!

테스트 코드가 js로 작성되어 있어 ts와 js에 절여진 우리에게 좋았고, 이전에 고민했던 JMeter보다 스크립트가 5배 이상 짧다고 한다. 또한 k6는 Go언어로 작성되어 있는데, Java보다 더 적은 메모리와 CPU를 사용하므로 리소스 사용 면에서도 유리하다.

(참고 링크: https://velog.io/@hooni_/K6-성능-테스트#작성해야하는-스크립트-형식

다만, nGrinder는 웹 UI라서 테스트 코드나 리소스, 결과를 한눈에 보고 작성하고 관리하는 것이 편했는데 k6는 gui가 제공되지 않아 결과를 직접 확인해야 한다는 점은 아쉬웠다. 하지만 부하 테스트를 실시하는 과정이 매우매우매우 수월하기 때문에 모든 단점을 감당할 만 하다 !!

⇒ 시각적으로 확인하려면 Grafana를 연동하면 된다!

테스트 코드 작성 과정 ✅

Installation

window 로컬에 설치하는 방법도 있다고는 하던데, 우리 서버 안에서 직접 테스트 해보고 싶어서 위 링크의 ‘ubuntu 환경 설치 명령어’를 따라 작성했다.

그리고 서버에 script.js 파일을 넣고 로컬에서 작성한 테스트 코드 파일을 넣어서 돌려봤다.

(우리 서버 IP 빼고는 일단 기본적인 코드를 참고하였다)

import http from 'k6/http';
import { sleep } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 10 }, //rampup
    { duration: '1m', target: 10 }, //load
    { duration: '30s', target: 0 }, //rampbackdown
  ],
};

export default function () {
  let res = http.get('http://서버IP:3000/musics/genres');
  sleep(0.5);
}
  • stages
    • 테스트 부하가 주입되는 단계 설정
    • 테스트는 보통 RampUp → Load → RampBackDown의 순서로 수행

k6 run script.js 명령어를 작성하여 결과를 확인하였다.

(—out 옵션을 사용하면 결과 내용을 어떤 파일?에 옮겨준다고 하여 json 파일에 담아봤는데, 가독성이 별로라 아래 결과를 그냥 확인하기로 했다.)

** 파일 전송은 scp C:윈도우/파일/경로 우분투계정@ip 주소: /home/우분투계정를 통해!

Clone this wiki locally