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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions