[JavaScript] 부하테스트편

최예닮·2022년 12월 5일
0
post-thumbnail

자 어제 DDos 를 방어하기위해 express-rate-limit 작성했고, 오늘은 부하테스트를 위해 팀원들과 시나리오를 작성해보았다.

우선 부하테스트를 하기 위해서는 artillery를 설치하고, 서버를 실행해보면 된다.

1. npm i -D artillery
2. npm start

그 다음 서버가 켜진 상태에서, 새로운 콘솔을 하나 더 켜고 다음 명령어를 입력해보자.

npx artillery quick --count 100 -n 50 http://localhost:3000

이렇게 입력하게 되면 밑에 값을 얻을 수 있다.

와우 너무 신기해... 너무 신기하잖아....!!!

내가 입력한 명령어 중에서 --count는 가상의 사용자 수를 말하고 -n 은 요청 횟수를 의미한다고 한다.

위에는 실제 서버 로그이다. 이런것들이 많아지고 악용하면 디도스 공격을 할 수 있는거라고 한다... 무서버.... 서버 터트린다....

http.codes.404: ....... 30	// 이거는 ip제한 30번으로 제한둔거
http.codes.429: ....... 4970	// ip제한 코드 오류
http.request_rate: .... 3081/sec	// 요청 처리 3.081초 걸림
http.requests: ........ 5000	// 5000번 요청
http.response_time:
  min: ................ 0	// 응답 제일 빠른거 0초
  max: ................ 67	// 제일 느린게 0.067
  median: ............. 13.9	//응답 중간값 0.0139초
  p95: ................ 30.9	//	100명중에서 뒤에서 6번째(95번째)로 느린게 0.0309초
  p99: ................ 47	// 100명중에서 뒤에서 2번째 (99번째)로 느린게 0.047초
vusers.completed: ..... 100	// 100명 가상유저
vusers.created: ....... 100
vusers.created_by_name.0: 100	// 100번 수행함
vusers.failed: ........ 0
vusers.session_length:
  min: ................ 149.9
  max: ................ 1010.9
  median: ............. 804.5
  p95: ................ 982.6
  p99: ................ 1002.4

로 해석할 수 있다.

median과 p95, p99의 차이가 크지 않으면 성능이 좋다고 보면된다.

자 이번에는 시나리오 테스트를 해봅시다.

부하 테스트를 할 때 단순히 한페이지에만 보내는게 아니고 실제 사용자의 행동을 모방하여 시나리오를 작성할 수 있다.

JSON 또는 YAML 형식의 설정 파일을 작성해야한다.

{
  "config": {
    "name": "members 부하테스트",
    "target": "http://localhost:3000",
    "phases": [
      {
        "duration": 60,
        "arrivalRate": 50
      }
    ]
  },
  "scenarios": [
    {
      "flow": [
        {
          "post": {
            "url": "/members/login",
            "json": {
              "memberEmail": "이메일",
              "password": "비밀번호"
            }
          }
        },
        {
          "get": {
            "url": "/members/me",
            "headers": {
              "authorization": "{{token}}"
            }
          }
        },
        {
          "patch": {
            "url": "/members/me",
            "headers": {
              "authorization": "{{token}}"
            },
            "json": {
              "memberName": ""
            }
          }
        }
      ]
    }
  ]
}

Config section

  • target : 테스트할 앱의 url을 의미. 서버 주소
  • phases : 테스트 요청 시간과 비율을 정한다.
    { "duration": 60, "arrivalRate": 30 } : 60초 동안 매초 30개의 요청을 보낸다.
  • defaults : 뒤에서 테스트할 시나리오의 기본값을 설정할 수 있다.
  • payload : 임의의 데이터를 보내기 위해서 사용. 실제 사용자 시나리오처럼 테스트하려면 테스트마다 보내는 데이터가 달라져야 하는데, 이런 테스트를 위해서 CSV 파일을 사용할 수 있다.
  • socketio : 소켓을 테스트 할 수 있다.
  • query : socket 들이 들어오는 주소 끝에 roomID로 쿼리를 달고 있어서 쿼리 부분을 작성해줘야한다. 방 만들때마다 roomID가 매번 달라져서 테스트할때마다 이 부분을 바꿔주는게 번거로울수 있다
  • plugins : 플로그인 설정- tls: configure how Artillery handles self-signed certificates
  • ensure : 에러나 지연시간에 대해 성공 조건을 셋팅
  • processor : 커스텀 js 코드를 load한다.
  • Secnarios Section

  • name : 시나리오 이름
  • flow : 시나리오에서 진행하는 테스트 동작을 순서대로 적으면 된다.
    ex) GET, POST, GET 요청을 순서대로 보낸다.
    각 요청에서는 url로 호스트 명을 제외한 path를 지정하면 되고, json 필드에서 보낼 데이터를 지정할 수 있다. 여기서 값에 {{ }} 문법을 통해서 앞에서 payload로 불러온 값을 지정할 수 있다.
  • capture : 응답으로 받은 데이터에서 다시 변수로 지정해서 뒤에 보내는 요청에 사용할 수 있다.
  • match : 응답 데이터가 원하는 값이 오는지를 확인할 수 있다.
  • weight : 시나리오에 대한 가중치이다. 이 값이 높으면 해당 시나리오는 더 많이 발생한다.
  • 자 이렇게 시나리오를 작성하게 되면 그래프로 분석할 수 있다.

    npx artillery run -o myReport loadtest.json

    이렇게 되면 결과 데이터를 담은 파일인 myReprot가 생성되게 되고 이 파일을 웹으로 변환하는 작업을 해주면 된다.

    npx artillery report myReport

    이렇게 나오고 html를 실행하게되면


    이렇게 나오게 된다.

    시나리오 진행시켜

    이제 이런식으로 부하테스트를 해본다면 몇명의 사용자가 몇번의 요청을 보내면 서버가 못버티는지를 테스트를 해볼 수 있게 된다. 너무 신기한 기능이었고 생각보다 막 엄청 어렵지 않아서 팀원들과 재미있게 부하테스트를 해본거 같다!

    다른팀들에게도 부하테스트 해보라고 해야겠어... 재미있잖아... 터트리는거.....후후후...💣

    profile
    산을 오르려고 하는데 이제 주차장에 막 주차한 초보개발자

    0개의 댓글