Skip to content

EB 메모리 사용량 높은 원인 #2

@seobeeeee1001

Description

@seobeeeee1001

User

eb로 배포했는데
인스턴스 메모리가 다음과 같아
[root@ip-172-31-9-135 ~]# free -m
total used free shared buff/cache available
Mem: 949 603 64 164 281 53
Swap: 1023 34 989


Cursor

안녕하세요! Elastic Beanstalk 환경에서 스프링 부트 애플리케이션의 메모리 사용량이 예상보다 높게 나오는 문제에 대해 함께 살펴보겠습니다. 요청이 없는 상황에서도 메모리 사용량이 높은 데에는 몇 가지 일반적인 원인이 있습니다.

가장 먼저, 스프링 부트 애플리케이션 자체의 구성이 메모리 사용량에 큰 영향을 줍니다. 어떤 설정들이 메모리를 사용하고 있는지 application.yml 파일을 확인하여 데이터베이스 설정이나 다른 연동 서비스들을 파악해보겠습니다. 이를 통해 문제의 원인을 좁혀나갈 수 있습니다.

application.yml 파일을 살펴보니 몇 가지 주목할 점이 보입니다.

  1. 다양한 외부 서비스 연동:
    • AWS S3
    • Kakao OAuth2
    • Firebase
    • SpringDoc (Swagger UI)
      이처럼 다양한 서비스와 연동하면, 해당 SDK(라이브러리)들이 메모리에 로드되면서 기본적으로 차지하는 메모리 양이 늘어납니다.
  2. 데이터베이스 커넥션 풀: dev 프로필에서 HikariCP 데이터베이스 커넥션 풀을 최대 5개까지 사용하도록 설정했습니다. 각 커넥션은 일정량의 메모리를 소모합니다.
  3. JVM 메모리 설정 부재: application.yml 파일이나 제공해주신 CI/CD 워크플로우에는 JVM의 힙 메모리 크기(-Xms, -Xmx)를 직접 설정하는 부분이 없습니다.

결론적으로, 현재 메모리 사용량이 높은 가장 유력한 원인은 다음과 같습니다.

Java 애플리케이션(JVM)은 시작될 때 운영체제로부터 일정량의 메모리(힙 메모리)를 할당받습니다. 만약 이 크기를 명시적으로 지정하지 않으면, JVM은 인스턴스의 전체 메모리 중 일정 비율(예: 1/4)을 최대로 사용하려고 시도합니다. 현재 사용 중인 인스턴스는 1GB의 메모리를 가지고 있으므로, JVM은 시작 시 수백 MB의 메모리를 예약할 수 있습니다.

여기에 스프링 부트가 애플리케이션 컨텍스트를 초기화하고, 설정된 모든 빈(Bean)을 로드하며, 데이터베이스 커넥션 풀을 생성하는 과정에서 추가적인 메모리를 사용하게 됩니다. 이 모든 것이 합쳐져 현재와 같이 높은 메모리 사용량을 보이는 것으로 추정됩니다.

Procfile 파일 수정으로 JVM 메모리 옵션 설정 가능

web: java -Xms256m -Xmx256m -jar *.jar

-Xms256m 로 옵션 변경. 최소, 최대 설정 가능.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions