HikariCP - Thread Starvation & Clock Leap Detection

2024. 8. 5. 15:12·📘 Backend/Spring

📚 HikariCP - Thread Starvation & Clock Leap

Spring Boot 서버에서 가끔 보이던 특정 문구가 있었는데, 일이 바빠서 무시하다가 이번에 여유가 좀 생겨서 알아보았습니다.

이 경고 문구는 스레드가 기아상태가 되거나 시스템 시간이 실제 시간과 비동기화 되는 현상인 Clock Leap가 일어났을떄 발생합니다.

어쩌다 1번씩 가끔 뜨고 가끔 API 호출도 안되는 현상이 있어 바로 알아보았습니다.

master - Thread starvation or clock leap detected (housekeeper delta=20m34s90ms530µs700ns).

정확한 원인은 아직도 잘 모르지만 검색 결과 유추할 수 있는 원인은 아래와 같습니다.

  • House Keeping Thread 중지로 인한 Clock Leap Detection (시간대가 갑자기 큰폭으로 변경, House Keeping Thread 중지 => 확인 결과 아님)
  • 노트북 화면 잠금으로 인한 Clock Leap 발생 (제일 유력한 원인)
  • Hikari CP Thread Pool 개수 부족 (가능성 없음)
  • 서버 리소스 부족 (CPU 50% / Memory 40% => 가능성 없음)

📚 House Keeping Thread 중지로 인한 Clock Leap Detection

검색해본 결과 많은 답변에서 말하길 이 현상이 발생하기 위한 조건 중 하나는 과도하게 많은 Garbage를 수집할 때 발생합니다.


Garbage가 많으면 시스템 리소스를 많이 소모하고 GC가 실행될 떄 모든 스레드의 실행이 일시적으로 중단되며,

이떄 시스템의 정리 작업을 하는 House Keeping Thread가 멈춰 Clock Leap가 발생한다고 합니다.


즉 Spring Boot에서 House Keeping Thread를 실행했을 떄 Garbage Collection이 더 오래 실행 되면서 메모리를 확보하려고 했고,

GC가 하우스키핑 스레드를 포함한 모든 응용 프로그램 스레드를 차단하고 있기 때문에, Clock Leap가 발생한다고 합니다.


우선 어플리케이션 규모가 크지도 않고, 코드 내 불필요한 Garbage도 많지 않아 용의선상에서 제외합니다.

하나 이상한 점은 하우스키핑 델타값이 20분이나 차이나는거 보면 Garbage 문제는 확실히 아닌것 같습니다.


📚 노트북 화면 잠금으로 인한 Clock Leap Detection

(거의 이거 떄문에 발생하는 거라고 추정)

글 처음에 1번씩 뜰떄 있고, 많이 뜰떄가 있다고 했는데 아마 제 생각에 1번씩 뜰떄가 이 경우인것 같습니다.

보통 PC는 CPU가 비활성 상태일 때 전력 소비를 줄이기 위한 기술인 C-States는 시스템 클럭을 조정하여 Clock Leap를 발생시킬 수 있습니다.

또한 화면 잠금 시 하드디스크가 비활성 상태로 전환되면서 데이터의 I/O가 작업이 지연될 수 있으며 이 또한 Clock Leap를 발생시킬 수 있습니다.

아마 이번에 노트북 로컬에서 Spring Boot를 돌리면서 화면 잠금을 해놓고 다른 서버에서 API 호출을 자꾸 해서 그런것 같습니다.


📚 HikariCP Thread Pool 개수 & 서버 리소스 부족

로컬에서 혼자 개발하고 그렇게 큰 규모도 아니며 규모에 비해 Thread Pool도 넉넉하게 15개로 잡았으므로 스레드 풀 문제는 아닐것 같습니다.

그리고 Linux 서버의 CPU도 Max 50% 이상 넘어가지 않고 Memory도 충분하기 떄문에 이 문제도 아닌것 같았습니다.

정확한건 Heap 메모리 Dump와 Thread 관련 Dump를 비교하며 Memory Leak이 발생하는지 등등 확인을 해봐야 알겠지만,

OutOfMemory가 뜬게 아니니까 넘어갑니다.

  # MariaDB  
  datasource:  
    hikari:  
      connection-test-query: SELECT 1  
      pool-name: master  
      maximum-pool-size: 15 
      minimum-idle: 5  
#      jdbc-url: jdbc:mariadb://192.168.0.5:5001/ys # 협업용 DB#      
      jdbc-url: jdbc:mariadb://192.168.0.5:5001/test # 로컬 개발용  
      username: skw  
      password: 1234  
      driver-class-name: org.mariadb.jdbc.Driver  
      connection-timeout: 5000  
      idle-timeout: 10000
저작자표시 (새창열림)

'📘 Backend > Spring' 카테고리의 다른 글

Open API 3.0 Swagger + Export Rest API Docs  (1) 2024.10.04
Spring AOP - API Verification 공통화, 로깅  (2) 2024.07.11
DataBufferLimitException - Webflux 버퍼 크기 제한 초과  (0) 2024.06.18
비밀번호 찾기 & 재설정 구현(Google SMTP & Redis)  (0) 2024.06.03
Spring WebSocket (Stomp X)  (1) 2024.04.26
'📘 Backend/Spring' 카테고리의 다른 글
  • Open API 3.0 Swagger + Export Rest API Docs
  • Spring AOP - API Verification 공통화, 로깅
  • DataBufferLimitException - Webflux 버퍼 크기 제한 초과
  • 비밀번호 찾기 & 재설정 구현(Google SMTP & Redis)
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      Lock #Thread #Concurrency
      GStreamer #Pipeline
      React #Markdown
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    HikariCP - Thread Starvation & Clock Leap Detection
    상단으로

    티스토리툴바