본문 바로가기
관리자

Programming-[Backend]/Performance, Monitoring

성능 테스트: K6, influxDB, grafana, RPS, 지연율과 DB Connection pool

728x90
반응형

 

지난 jmeter와 chaos monkey를 이용한 성능 테스트에 이은 글이다. 이번에는 K6, influxDB, grafana를 통해 성능 테스트를 하는 글이다.

 

지난글:

https://whitepro.tistory.com/1065

 

성능 테스트: jmeter, @Profile, chaos monkey

배경로컬에서 잘 만든 애플리케이션을 클라우드 환경 등에 배포하기 위해서는 컴퓨팅 자원을 얼마나 쓸 것인지 결정하는 것이 필요하다. 실제 애플리케이션의 요구사항에 따른 적절한 자원 임

whitepro.tistory.com

 

 


 

 

1. K6

개요 및 설치

ref.) https://velog.io/@prismy/%EC%84%B1%EB%8A%A5-%ED%85%8C%EC%8A%A4%ED%8A%B8-k6grafanainfluxDB-%EC%8D%A8%EB%B3%B4%EA%B8%B0

 

Go 언어로 만들어진 성능 테스트용 도구로, Jmeter에 대비하여 높은 성능과 낮은 리소스 사용량을 자랑한다. 다만 GUI는 제공하지 않지만 테스트 스크립트도 javascript로 작성할 수 있고, CI/CD 파이프라인에 쉽게 통합이 가능하기 때문에 많이 사용하는 추세이다.

 

컴퓨터에 설치하고 실행해도 좋고, 컨테이너 형태로 실행할 수도 있다. grafana/k6 통합 이미지는 위 참조 블로그에서 docker-compose 파일을 확인할 수 있다. 그냥 실행하면 된다.

 

$ brew install k6

 

 

스크립트 작성

 

스크립트라고 해봐야 별 거 없다. 위에서 설명했듯 javascript로 작성하면 되고, GPT에게 맡기면 된다. 알아야할 개념은 scenario 정도다. 아래 예시 코드에서는 constant-arrival-rate를 사용하는데, 이를 이용하면 충분한 Vu가 확보되고, 서버에서 충분히 받아들일 수 있는 사양이 된다면 rate 값을 timeUnit 당으로 일정하게 하여 요청을 보낸다. 아래 예시에서는 30 RPS(Request Per Second)가 된다.

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

// 환경 변수로부터 VUs, maxDuration, host 값을 가져옴
const host = __ENV.HOST || 'http://localhost:8080'; // 기본 호스트 설정
const url = `${host}/${path}`;

export const options = {
  scenarios: {
    constant_rps: {
      executor: 'constant-arrival-rate',
      rate: 30, // 초당 요청 수
      timeUnit: '1s', // 요청 속도 단위
      duration: '30s', // 테스트 지속 시간
      preAllocatedVUs: 300, // 미리 할당된 VU
      maxVUs: 500, // 최대 VU
    },
  },
  thresholds: {
    http_req_duration: ['p(95)<5000', 'avg<2500'], // 응답 시간 조건
  },
  noConnectionReuse: false, // Keep-Alive 비활성화
};

export default function () {
  // 요청 바디 데이터
  const body = {
    ${body에 들어갈 데이터 key}: ${바디에 들어갈 데이터를 설정하면 됨}
  };


  const headers = {
    'Content-Type': `application/json`,
  };

  const res = http.post(url, multipartBody, {headers});

  // 응답 상태 확인
  check(res, {
    'status is 200': (r) => r.status === 200,
  });
}

 

 

다음으로 k6를 실행하는 아래 스크립트를 실행할 것이다. 그전에 시각화를 위해 grafana와 influxDB를 컨테이너로 실행시켜두어야 한다.

 k6 run \
  --out influxdb=http://localhost:8086/k6 \
  --env BASE_URL=http://localhost:8080 \
  --env API_ENDPOINT=${path} \
  --vus 1 \
  --duration 1s \
  ./script.js

 

 

이 스크립트에서 influxdb의 주소를 설정한다. 이는 k6의 결과 -> influx db -> grafana에서 표시 하는 방식이므로 이렇게 지정하는 것이라고 이해하면 된다.

 

 

2. InfluxDB, Grafana

 

아래의 컴포즈 파일을 실행한다.

version: '3.4'

networks:
  grafana:

services:
  influxdb:
    image: influxdb:1.8
    ports:
      - "8086:8086"
    environment:
      - INFLUXDB_DB=k6
      - INFLUXDB_ADMIN_USER_PASSWORD=admin
      - INFLUXDB_ADMIN_USER_TOKEN=admin
    networks:
      - grafana

  grafana:
    image: grafana/grafana:9.3.8
    ports:
      - "3000:3000"
    environment:
      - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin
      - GF_AUTH_ANONYMOUS_ENABLED=true
      - GF_AUTH_BASIC_ENABLED=false
    volumes:
      - ./grafana:/etc/grafana/provisioning/
    networks:
      - grafana

 

 

그리고 localhost:3000으로 접속하여 그라파나 화면에서 DB를 연결해준다. 

 

그리고 influxDB를 선택한 후 아래와 같이 입력해준다. http://host.docker.internal로 입력해야한다. 

 

 

대시보드는 그라파나 홈페이지의 k6용 대시보드들을 탐색 후, ID 값을 알아내어 Import 화면에서 import 해주면 된다.

https://grafana.com/grafana/dashboards/?search=k6

 

그리고나서 k6로 스크립트를 실행하면 아래와 같은 대시보드를 확인할 수 있다.

 

 

 

 

3. 테스트 목표, 성능 확인하기

 

대략적인 테스트 목표는 아래와 같이 잡을 수 있다. 실제 성능 테스트에 걸리는 지연율이나 에러 등은 위에 링크로 걸어두었던 앞선 글에서 chaos monkey로 진행했었다.

 

1. 요청이 몰렸을 때 각 인스턴스의 heap memory size 및 cpu가 충분히 버텨낸다.

2. RPS가 요구사항에 맞게 충분하다. 또는 RPS의 최대치를 알아내어 프로젝트의 최대 RPS를 사용자에게 공유한다.

3. DB Connection Pool 대비 hikari pool, thread pool이 충분하게 설정되어 원하는 RPS를 달성할 수 있고, DB에도 부하가 적당하다.

 

 

성능 테스트의 대략적인 다이어그램

hikari pool은 jvm내에 속하기 때문에, max 값을 잡고 인스턴스를 2대 띄우면 2배의 커넥션을 물 수 있다.

 

 

기타 진행했던 모니터링

 

DB monitoring

: MYSQL의 default connection pool max 값은 151이다.

 

datadog monitoring 일부

 

 

728x90
반응형