티스토리 뷰

질문 & 답변

성능테스트 (feat. Elastic APM)

나죽나강 2021. 10. 10. 03:41

성능테스트 : Elastic APM 사용 부터 AWS까지! (1)


# 개요

프로젝트를 진행하면 구현한 API의 성능을 테스트 해보고자 합니다. 단순히 API의 성능을 테스트하기 보다는 Redis를 적용하기 전,후의 성능과 Redis 캐시를 적용하기 전,후의 성능을 테스트 해보고 싶었습니다. Redis 적용은 다음 게시글에서 자세히 다룰 것이며 이번 게시글에서는 Elastic 사용법에 대해 간단하게 다뤄볼 것입니다.

 

# 기술스택

기본적으로 Elastic APM을 사용하기 위해서는 Elastic Search, Elastic APM Server, Kibana가 사용됩니다. 또한 docker를 사용하여 서버를 실행시킬 것입니다. 그후 Jmeter로 초당 10번의 트래픽을 주어 성능과 트레이싱을 확인해볼 예정입니다.

 

# Notion 


간단한 실행법

로컬환경에서 간단하게 실행하는 법에 대해 적어 보겠습니다.

 

Reference.

https://cheese10yun.github.io/elk-apm-1/ 

https://www.elastic.co/guide/en/apm/get-started/current/quick-start-overview.html (Quick Start)

 

 

1. Quick Start 사이트로 이동하여 docker-compose 코드를 복사한다.

2. docker-compose.yml에 붙여넣는다.

(* 개인적으로 프로젝트를 하나 만들어 Elastic 서버를 따로 프로젝트를 만드는것이 좋다고 생각한다. 깃허브 기록때문에 같이 적용)

version: "3.7"
services:
  app:
    network_mode: host
    build: .
    restart: always
    ports:
      - "6000:6000"

  apm-server:
    image: docker.elastic.co/apm/apm-server:7.15.0
    depends_on:
      elasticsearch:
        condition: service_healthy
      kibana:
        condition: service_healthy
    cap_add: ["CHOWN", "DAC_OVERRIDE", "SETGID", "SETUID"]
    cap_drop: ["ALL"]
    ports:
      - 8200:8200
    networks:
      - elastic
    command: >
      apm-server -e
        -E apm-server.rum.enabled=true
        -E setup.kibana.host=kibana:5601
        -E setup.template.settings.index.number_of_replicas=0
        -E apm-server.kibana.enabled=true
        -E apm-server.kibana.host=kibana:5601
        -E output.elasticsearch.hosts=["elasticsearch:9200"]
    healthcheck:
      interval: 10s
      retries: 12
      test: curl --write-out 'HTTP %{http_code}' --fail --silent --output /dev/null http://3.38.23.41:8200/

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0
    environment:
      - bootstrap.memory_lock=true
      - cluster.name=docker-cluster
      - cluster.routing.allocation.disk.threshold_enabled=false
      - discovery.type=single-node
      - ES_JAVA_OPTS=-XX:UseAVX=2 -Xms1g -Xmx1g
    ulimits:
      memlock:
        hard: -1
        soft: -1
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic
    healthcheck:
      interval: 20s
      retries: 10
      test: curl -s http://3.38.23.41:9200/_cluster/health | grep -vq '"status":"red"'

  kibana:
    image: docker.elastic.co/kibana/kibana:7.15.0
    depends_on:
      elasticsearch:
        condition: service_healthy
    environment:
      ELASTICSEARCH_URL: http://elasticsearch:9200
      ELASTICSEARCH_HOSTS: http://elasticsearch:9200
    ports:
      - 5601:5601
    networks:
      - elastic
    healthcheck:
      interval: 10s
      retries: 20
      test: curl --write-out 'HTTP %{http_code}' --fail --silent --output /dev/null http://3.38.23.41:5601/api/status

volumes:
  esdata:
    driver: local

networks:
  elastic:
    driver: bridge

 

3. Intellij 터미널에서 아래 명령어를 입력한다.

.\gradlew clean build
docker compose build
docker compose up

docker compose up을 하면 elasticsearch, kibana, apm-server가 실행되는 것을 확인할 수 있다.

이런 로그가 찍히게 된다면 성공적인 것이다.

4. "http://localhost:5601/app/home#/tutorial/apm"에 접속한다.

Check APM Server status를 눌러 정상 작동을 확인한다.

APM agent를 다운로드 하여 C:\아래에 넣어준다.

순서대로 눌러준다.

Launch APM을 누르면 다음과 같이 대시보드가 나온다.

 

5. Intellij로 돌아가서 vm options에 설정값을 입력해 준다.

-javaagent:C:\bithumb/elastic-apm-agent-1.26.0.jar
-Delastic.apm.service_name=order-service
-Delastic.apm.server_url=http://localhost:8200
-Delastic.apm.application_packages=com.service.order

5-1. -javaagent:C:\bithumb/elastic-apm-agent-1.26.0.jar 

> 아까 다운 받은 jar파일의 절대경로 위치적 적용해 준다.

5-2. -Delastic.apm.service_name=order-service

> 서비스네임 등록하고 싶을걸 적으면 된다.

5-3. -Delastic.apm.server_url=http://localhost:8200

> APM서버의 IP주소를 등록한다.

5-4. -Delastic.apm.application_packages=com.service.order

> 자신의 패키지 구조를 지정해 준다.

 

실행시켜 주면 된다.

약 4분간 설치가 이어진다.

 

6. 끝! Kibana 대시보드 확인 &  Jmeter 부하 주기!

 Jmeter로 1초당 3번씩 3000번 api 호출: 로그인 적용

호출된 API의 종류를 확인할 수 있고 에러여부도 확인이 가능하다

JPA에서 실행된 쿼리문을 중요하게 보자

# SELECT FROM user가 2번이나 호출된 것을 확인할 수 있다.

# 어디서, 2번 호출되었고, 의도된 동작인지 확인하여 원인에 대해 추가로 작성하겠습니다.

 


마무리

지금까지는 로컬에서 Elastic APM을 사용하고 JPA 트레이싱까지 확인해 보았습니다. 

다음 게시물에서는 AWS에서 Elastic APM을 사용하는 방법과 

Redis 적용여부와 Redis 캐시 적용여부에 따른 성능차이를  확인해 보도록 하겠습니다!

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함