Programming
스프링부트 서비스 리소스 절감 최적화 전략
ipxy
2025. 3. 20. 09:51
728x90
🚩 1. 서비스 통합 (MSA → Monolith)
- JVM 인스턴스 수 감소 (메모리, CPU 절약)
- REST API 호출을 내부 메서드 호출로 변경하여 네트워크 비용 절감
🚩 2. JVM 튜닝 (OpenJDK vs GraalVM)
- JVM 메모리 제한을 통해 메모리 오버헤드 방지
- 기본적으로 스프링부트는 1GB 이상의 Heap을 사용하기 때문에, 서비스별로 최적화가 필요함.
java -Xms128m -Xmx256m -XX:MaxRAM=256m -jar my-app.jar
✅ -Xms128m → 초기 Heap 크기를 128MiB로 설정
✅ -Xmx256m → 최대 Heap 크기를 256MiB로 제한
✅ -XX:MaxRAM=256m → 전체 JVM 메모리 사용량을 256MiB로 제한
JVM 옵션 | 설명 | 권장 설정값 예시 |
-Xms, -Xmx | 초기 및 최대 힙(Heap) 크기 설정 | -Xms256m -Xmx512m |
-XX:+UseG1GC | Garbage Collector 최적화(G1) | Spring Boot 2.0 이후 기본 설정 |
-XX:MaxMetaspaceSize | 클래스 메타데이터 공간 제한 | -XX:MaxMetaspaceSize=128m |
🔹 GraalVM Native Image로 전환
- JVM 기반 스프링부트 앱을 GraalVM 네이티브 이미지로 빌드하면 메모리 사용량과 시작 시간을 획기적으로 줄일 수 있습니다.
- 실행 중 리소스 사용량을 50%~80%까지 절감 가능.
- 그러나, Reflection이나 동적 로딩과 같은 기능이 제한적일 수 있어, 코드 조정이 필요할 수 있음.
🚩 3. 컨테이너 리소스 제한 (Kubernetes requests/limits)
- 과도한 CPU 및 메모리 사용 방지
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
🚩 4. Tomcat 스레드 개수 제한 (max-threads)
- 내장 웹서버의 스레드를 제한하여 CPU 사용량 절감
- CPU 사용량 절감 및 스레드 생성 오버헤드 방지
- Tomcat의 기본 스레드 개수는 200개이므로, 최소한의 트래픽을 처리하도록 제한해야 합니다.
server:
tomcat:
max-threads: 50 # 기본 200 → 50으로 제한
accept-count: 10 # 기본 100 → 10으로 제한
🚩 5. DB Connection Pool 최소화 (HikariCP)
- DB 커넥션 수를 최소화하여 메모리 사용량 절감
- 기본적으로 HikariCP의 커넥션 풀 크기는 10개 이상이지만, 작은 서비스에서는 3~5개로 줄여야 합니다.
spring:
datasource:
hikari:
maximum-pool-size: 5 # 기본 10~20개 → 5개로 제한
minimum-idle: 2 # 최소 2개 유지
🚩 6. 불필요한 DevTools & Actuator 비활성화
- 불필요 모듈 제거로 메모리 및 CPU 절약
spring:
devtools:
enabled: false
management:
endpoints:
enabled-by-default: false
endpoint:
health:
enabled: true
metrics:
enabled: false
🚩 7. 불필요한 AutoConfiguration 제거
- 사용하지 않는 자동 설정 비활성화하여 부팅속도 개선 및 메모리 절약
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
- org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
- org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration
🚩 8. Init Container 활용
- 초기 실행 시의 리소스 과부하 방지 (CPU, 메모리 절약)
initContainers:
- name: init-script
image: busybox
command: ['sh', '-c', '/init-script.sh']
🚩 9. 로깅 레벨 조정 & 파일 로그 제한
- 불필요한 로깅을 줄여 CPU 및 디스크 I/O 절약
- 로그 레벨을 INFO 또는 WARN으로 조정
- 로그를 파일로 저장하면 디스크 I/O 사용량이 증가하므로, 필요할 때만 활성화
logging:
level:
root: WARN
org.springframework.web: WARN
file:
name: /logs/app.log
logback:
rollingpolicy:
max-file-size: 10MB
max-history: 3
🚩 10. 가벼운 내장 웹서버로 변경 (Tomcat → Undertow 또는 Jetty)
- 서버 교체로 메모리 및 CPU 사용량 절감 (Gradle 기준)
implementation('org.springframework.boot:spring-boot-starter-web') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
implementation 'org.springframework.boot:spring-boot-starter-undertow'
🚩 11. 데이터 액세스 계층 최적화 & 캐시 적용
- DB 접근 최소화 및 비효율 쿼리 개선으로 CPU 및 메모리 절약
- Redis, Local Cache 등을 활용
🚩 12. 정적 리소스 분리 및 HTTP 캐싱 적용
- 별도의 CDN 또는 정적 웹서버를 활용하여 네트워크 비용 절약
- HTTP 캐싱 전략 활용하여 리소스 접근 최소화
🚩 13. Spring WebFlux 기반의 비동기/논블로킹 구조 전환
- WebFlux + Netty로의 전환으로 CPU, 메모리 사용량 절감 및 높은 동시 처리량 확보
- 기존의 Servlet MVC 기반보다 리소스를 크게 절약 가능
예시 의존성 설정 (Gradle):
implementation 'org.springframework.boot:spring-boot-starter-webflux'
WebFlux의 자원 절약 효과:
항목 | Servlet MVC | WebFlux (Netty) |
메모리 사용량 | 높음 | 낮음 (약 30~50% 절약) |
동시 처리량 | 중간 수준 | 매우 높음 |
스레드 오버헤드 | 높음 | 매우 낮음 |
📌 최종 리소스 절감 전략 요약표
전략 | 최적화 | 리소스 효과 |
서비스 통합 및 REST 내부 호출 | CPU, 메모리, 네트워크 | 🔥🔥🔥🔥🔥 |
JVM 힙 메모리 제한 | 메모리 | 🔥🔥🔥🔥 |
컨테이너 리소스 제한 | CPU, 메모리 | 🔥🔥🔥🔥 |
Tomcat 스레드 개수 제한 | CPU | 🔥🔥🔥 |
DB Connection Pool 최소화 | 메모리 | 🔥🔥🔥 |
불필요 DevTools & Actuator 제거 | CPU, 메모리 | 🔥🔥🔥 |
불필요 AutoConfiguration 제거 | CPU, 메모리 | 🔥🔥🔥 |
Init Container 활용 | CPU, 메모리(초기) | 🔥🔥 |
로깅 레벨 조정 & 파일로그 제한 | CPU, 디스크 I/O | 🔥🔥🔥 |
가벼운 내장 웹서버 변경 | CPU, 메모리 | 🔥🔥🔥 |
데이터 계층 최적화 및 캐시 | CPU, 메모리 | 🔥🔥🔥🔥 |
정적 리소스 분리 & HTTP 캐싱 | CPU, 네트워크 | 🔥🔥 |
Spring WebFlux 전환 | CPU, 메모리, Thread | 🔥🔥🔥🔥 |
🎯 추천하는 적용 우선순위
- 서비스 통합 및 REST API 내부화 (가장 높은 효과)
- JVM 힙 메모리 제한 및 컨테이너 리소스 제한
- DB 커넥션 풀 최소화 및 데이터 액세스 계층 최적화
- WebFlux 전환 (구조적 변화 가능 시)
- Tomcat 스레드 제한, 내장 서버 변경, AutoConfiguration 제거
- 로깅 조정 및 Init Container 활용
- 정적 리소스 분리 및 HTTP 캐싱 적용 (간접적)
위 최적화 전략을 환경에 맞게 선택적/단계적으로 적용하면, 스프링부트 서비스의 리소스를 효과적으로 관리하고 성능 및 운영비용을 크게 개선할 수 있습니다.
728x90