Watchdog thread
Watchdog thread는 마인크래프트 서버가 정해진 시간 동안 응답하지 않을 때 감시 스레드가 서버를 강제로 종료시키며 남기는 오류이다. A single server tick took XX.XX seconds, The server has stopped responding과 함께 출력된다.
Paper와 Spigot 계열 서버는 메인 스레드가 정상적으로 동작하는지 감시하는 별도의 스레드를 둔다. 한 틱이 설정된 한계 시간을 넘기면 서버가 멈춘 것으로 판단해 스레드 덤프를 남기고 프로세스를 종료한다.
Can't keep up이 '느려졌다'는 경고라면, 이 오류는 멈췄다는 판정이다.
스레드 덤프 읽기
이 오류의 가치는 함께 출력되는 스레드 덤프에 있다. 종료 시점에 메인 스레드가 무엇을 하고 있었는지가 그대로 기록되므로, 원인을 특정할 수 있는 거의 유일한 단서다.
로그에서 Server thread dump 이후의 스택을 위에서부터 읽는다. 플러그인이나 모드의 패키지 이름이 보이면 그 구성 요소가 원인일 가능성이 높다. 게임 자체의 클래스만 보인다면 월드 데이터나 대량 연산 문제일 수 있다.
주요 원인
- 플러그인의 무한 루프 또는 교착 상태 — 가장 흔하다. 특히 데이터베이스 연결을 메인 스레드에서 기다리는 경우
- 대량 월드 편집 — FastAsyncWorldEdit 없이 대규모 영역을 동기 처리한 경우
- 손상된 월드 데이터 — 특정 청크를 불러오는 순간에만 발생한다면 이쪽을 의심한다
- 극단적인 레드스톤 장치나 엔티티 밀집
- 디스크 응답 지연 — 네트워크 저장소를 월드 디렉터리로 쓰는 경우
대응
- 로그를 보존한다. 스레드 덤프가 없으면 원인 추적이 사실상 불가능하다.
- 덤프 상단에 나타난 플러그인을 제거하거나 갱신한다.
- 특정 좌표에서 재현된다면 해당 청크를 조사한다.
- 재현 조건을 찾을 때까지는
spigot.yml의timeout-time을 임시로 늘려 운영을 이어갈 수 있다.
timeout-time을 -1로 두어 감시 기능을 끄는 방법도 있으나, 서버가 멈춘 채 방치되고 덤프도 남지 않으므로 원인을 찾은 뒤가 아니면 권장하지 않는다.