spring / / 2024. 3. 28. 19:59

스프링 부트 시작 시간 분석 도구 (spring startup analyzer)

스프링 부트를 처음 개발할 때는 가볍기 때문에 애플리케이션이 금방 시작이 된다. 하지만 비즈니스가 복잡해지고 다양한 의존성 및 비즈니스 빈이 많이 생기면 어느 순간에 부트 시작 시간이 오래 걸리는 경우가 있다. 이런 경우 어디에서 병목이 생기는지 확인하기가 쉽지 않다. 그래서 찾아보니 스프링 시작 시 생성되는 빈(Bean)과 다양한 정보를 제공해주는 프로젝트가 있어서 사용법을 정리하게 되었다.

spring-startup-analyzer: https://github.com/linyimin0812/spring-startup-analyzer

spring-startup-analyzer라는 프로젝트인데 시작시간과 문제가 되는 부분을 확인하여 최적화할 수 있도록 스프링 애플리케이션 시작 리포트를 생성해준다. 문서의 내용에 중국어와 같이 표시되는걸 보니 중국인(linyimin)이 만든거 같다.

Spring Startup Analyzer 기능

Spring Startup Analysis Report

초기화 시간/빈 이름 검색을 위한 Spring Bean 초기화 정보와 Spring Bean 초기화 타임라인, 메소드 호출 회수, 시간 통계, 사용되지 않는 jars(fat jar를 최적화하기 위한 용도), 그리고 애플리케이션 시작 쓰레드 시간 프로파일을 제공한다. 개발자는 애플리케이션의 병목지점을 빠르게 분석할 수 있다. linux, mac, windows를 지원한다.

Spring Bean 초기화 정보

Spring Bean 초기화 타임라인

메소드 호출 횟수 및 시간 통계

사용되지 않는 jar 파일

애플리케이션 시작 쓰레드 시간 프로파일

Spring 시작 최적화

Spring Bean 비동기 초기화 jar를 제공하고 애플리케이션 시작 속도를 개선하기 위해 오래걸리는 빈에서 사용되는 init과 @PostConstruct 메소드를 비동기로 실행한다.

사용 방법

스프링 시작 데이터 수집

설치

두 가지 설치 방법을 제공한다: 수동 설치와 원 클릭 스크립트 설치

  1. 수동 설치
    1. realease 를 클릭하여 최신 버전의 tar.gz를 다운받는다.
    2. 새 폴더 생성 및 압축 해제

Linux/Mac에서는 아래 명령어를 사용한다.

mkdir -p ${HOME}/spring-startup-analyzer
cd download_path
tar -zxvf spring-startup-analyzer.tar.gz -C your_install_path/spring-startup-analyzer
  1. Shell script로 설치 (Linux/Mac만 해당)
curl -sS https://raw.githubusercontent.com/linyimin0812/spring-startup-analyzer/main/bin/install.sh | sh

기본 설치 디렉토리: $HOME/spring-startup-analyzer

구성

이 프로젝트는 여러 가지 구성 옵션을 제공하고 반드시 필요하지는 않고 기본값으로 사용할 수 있다.

구성하는 두 가지 방법:

  1. 구성 파일에 직접 구성하는 방법
    your_install_path/spring-startup-analyzer/config/spring-startup-analyzer.properties
  2. 시작 파라미터에 구성하는 방법, 예를 들어 애플리케이션 시작 헬스 체크 타임아웃을 30분으로 설정: -Dspring-startup-analyzer.app.health.check.timeout=30

애플리케이션 시작

이 프로젝트는 agent로 시작하고 파라미터를 시작 명령어에 주입할 수 있다.
-javaagent:your_install_path/spring-startup-analyzer/lib/spring-profiler-agent.jar

  • Java command line을 사용하여 애플리케이션을 시작하기 위해서는 아래와 같이 파라미터를 추가하면 된다.
java -javaagent:/Users/runner/spring-startup-analyzer/lib/spring-profiler-agent.jar \
    -Dproject.name=mac-demo \
    -Dspring-startup-analyzer.admin.http.server.port=8066 \
    -jar /Users/runner/spring-startup-analyzer/spring-boot-demo.jar
  • IDEA에서 실행하기 위해서는 VM options에 추가하면 된다.
-javaagent:/Users/runner/spring-startup-analyzer/lib/spring-profiler-agent.jar

로그의 경로: $HOME/spring-startup-analyzer/logs

  • startup.log: 시작 로그
  • transform.log: re-transform class 로그

애플리케이션이 시작된 후에 아래 메시지가 console 로그에 출력된다.

======= spring-startup-analyzer finished, click http://localhost:xxxx to visit details. ======

데모 프로젝트 구성

이제 실제로 데모 프로젝트를 구성해서 한번 실행을 해보자. 데모를 위해 간단하게 스프링 부트 애플리케이션을 만들었다.

그리고 Run Configuration의 VM options에 파라미터를 추가한다.

-javaagent:/Users/macbookpro/_WORK/_JAVA/spring-startup-analyzer/lib/spring-profiler-agent.jar

그리고 Application을 실행하자.

그러면 시작 시 아래와 같은 로그가 출력된다.

premain LibHome: /Users/macbookpro/_WORK/_JAVA/spring-startup-analyzer/lib/
Server listening on port 8065

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.3)
 ..
 ..
 2024-03-28 19:42:46.065  INFO 4495 --- [           main] com.example.StartupReportApplication     : Started StartupReportApplication in 8.95 seconds (JVM running for 10.496)
======= spring-startup-analyzer finished, click http://localhost:8065 to visit details. ======

그 다음 http://localhost:8065으로 접속하여 분석결과를 확인하자.

분석결과 화면에서 어떤 빈이 얼마나 오래 걸렸는지를 확인할 수 있다. 여기서 postConstructExampleBean이 5초 정도 걸렸는데 일부러 5초 대기하도록 코드를 넣어놓은 것이다.

@Component
@RequiredArgsConstructor
public class PostConstructExampleBean {
    private final Environment environment;

    @PostConstruct
    public void init() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

그리고 빈 시작 시간을 타임라인으로 확인할 수 있고 메소드 실행 호출 횟수도 확인할 수 있다.

spring startup analyzer를 통해 스프링 시작시간이 느린 경우에 활용할 수 있다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유