Application Servers & Java

[장애 사례] WebLogic STUCK THREAD 경고와 처리 방법

midworker 2025. 5. 15. 18:55
반응형

[장애 사례] WebLogic STUCK THREAD 경고와 처리 방법

WebLogic 운영 중 다음과 같은 경고 로그가 출력된다면,
애플리케이션 내부 요청이 장시간 응답하지 않고 멈춰 있는 상태를 의미합니다.


✅ 에러 로그 예시

<BEA-000337> <[STUCK] ExecuteThread: '166' for queue: 'weblogic.kernel.Default (self-tuning)' 
has been busy for "605" seconds working on the request...

✅ STUCK THREAD란?

  • WebLogic은 요청을 처리할 때 ExecuteThread라는 내부 워커 스레드를 사용합니다
  • 요청 처리 중 600초 이상(기본값) 응답이 없으면 해당 스레드를 "STUCK" 상태로 간주
  • 누적 시 전체 WAS가 멈추거나 Thread Pool 고갈로 인해 신규 요청 처리 불가

✅ 발생 조건 요약

원인 유형 설명
DB 대기 느린 쿼리, 커넥션 풀 고갈 등
외부 API 응답 지연 인증, 결제, 메시지 서버 등과의 통신 대기
코드 내부 무한 루프 반복 조건 누락, 대기 로직 오류
파일 I/O 대용량 파일 처리, NFS 지연
Thread.sleep, wait 블로킹 코드 사용으로 인한 응답 지연

✅ 진단 방법

1. 로그 경고 시간 확인

has been busy for "605" seconds → 특정 요청이 10분 이상 처리되지 않음

2. STUCK 스레드 발생 시점의 Thread Dump 확인

kill -3 <weblogic_pid>

또는 Admin 콘솔 > Monitoring > Threads 탭에서 상태 확인

3. 아래 키워드로 검색

  • weblogic.kernel.Default
  • STUCK
  • ExecuteThread

✅ 조치 방법

✔ 1. 원인 요청 추적 (Thread Dump 분석)

  • STUCK 로그 직후 Thread Dump 내 "ExecuteThread: '166'" 위치 검색
  • 어떤 클래스/메서드/라인에서 멈춰있는지 추적

예:

"ExecuteThread: '166'" daemon prio=5 tid=0x12345 nid=0x6789 waiting on condition
   at java.net.SocketInputStream.socketRead0(Native Method)
   at your.service.ExternalAPI.call(...)
   ...

✔ 2. 처리 시간 조정 (임시 대응)

<server>
  <stuck-thread-max-time>600</stuck-thread-max-time>  <!-- default -->
  <stuck-thread-timer-interval>60</stuck-thread-timer-interval>
</server>

→ 너무 민감하게 잡혀있으면 false alarm 증가
→ 너무 길게 잡으면 진짜 장애 감지가 늦어짐


✔ 3. 코어 개선

  • 오래 걸리는 로직 → 비동기 처리, 배치 이관
  • 외부 호출 → timeout 설정 명확히
  • 데이터베이스 쿼리 튜닝, 커넥션 풀 상태 점검

✅ 마무리

STUCK THREAD는 WebLogic이 서버 생존 여부를 판단하는 핵심 지표입니다.
다수 발생 시에는 즉시 Thread Dump 분석을 통해 병목 코드를 찾아야 하며,
오류가 아닌 경고일 때도 지속적으로 발생한다면 구조 개선이 필요합니다.


반응형