본문 바로가기
삵

StuckThreadDetectionValve로 멈춘 요청 찾기

조회 0 · 댓글 0
빅토르최빅토르최작성자2026년 10월 12일

특정 요청이 응답 없이 오래 걸려 스레드 풀이 서서히 차오르는데, 어느 요청이 물고 있는지 로그만 봐선 안 잡힐 때가 있습니다. Tomcat 기본 Valve인 StuckThreadDetectionValve를 걸어두면, 지정한 시간 이상 처리 중인 요청을 찾아 그 스레드의 스택 트레이스를 WARN 레벨로 남겨줍니다. 멈춘 지점을 바로 코드 위치로 좁힐 수 있어 유용합니다.

Engine, Host, Context 어디든 <Valve>로 추가하면 됩니다. 핵심 속성은 threshold(초, 기본 600 = 10분, 0이면 비활성)입니다. 감지된 스레드의 ID와 이름은 JMX 속성 stuckThreadIds, stuckThreadNames로도 확인할 수 있습니다.

<Valve className="org.apache.catalina.valves.StuckThreadDetectionValve"
       threshold="120" />

주의할 점 두 가지입니다. 공식 문서는 threshold를 해당 컨테이너의 backgroundProcessorDelay보다 크게 두라고 안내합니다. 또 interruptThreadThreshold(기본 -1, 비활성)로 멈춘 스레드 인터럽트까지 시도할 수 있지만, I/O나 락 대기에는 통해도 무한 루프는 풀리지 않을 수 있으니 해제가 보장되진 않습니다.

🔗 https://tomcat.apache.org/tomcat-10.1-doc/config/valve.html

🔗 https://tomcat.apache.org/tomcat-9.0-doc/api/org/apache/catalina/valves/StuckThreadDetectionValve.html

로그인 후 답글을 남길 수 있습니다.