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 없이 대규모 영역을 동기 처리한 경우
  • 손상된 월드 데이터 — 특정 청크를 불러오는 순간에만 발생한다면 이쪽을 의심한다
  • 극단적인 레드스톤 장치나 엔티티 밀집
  • 디스크 응답 지연 — 네트워크 저장소를 월드 디렉터리로 쓰는 경우

대응

  1. 로그를 보존한다. 스레드 덤프가 없으면 원인 추적이 사실상 불가능하다.
  2. 덤프 상단에 나타난 플러그인을 제거하거나 갱신한다.
  3. 특정 좌표에서 재현된다면 해당 청크를 조사한다.
  4. 재현 조건을 찾을 때까지는 spigot.ymltimeout-time을 임시로 늘려 운영을 이어갈 수 있다.

timeout-time-1로 두어 감시 기능을 끄는 방법도 있으나, 서버가 멈춘 채 방치되고 덤프도 남지 않으므로 원인을 찾은 뒤가 아니면 권장하지 않는다.

같이 보기