Insights / 기술 해설
Minecraft 지연 조사: 조용한 지표 수집과 공유 스토리지 원인 분석
TPS/MSPT를 조용히 수집하는 단계부터 JFR과 운영체제 I/O 관측을 대조하는 과정까지 소개합니다. 완료된 원인 조사와 아직 시험하지 않은 성능 개선을 구분합니다.

목차
Minecraft 지연은 서버 tick 처리, 짧은 저장 대기, 네트워크, 클라이언트 렌더링 등 여러 원인에서 생길 수 있습니다. 내부 호스트명과 구성을 공개하지 않고 여러 Paper 서버에서 진행한 조사를 익명으로 소개합니다.
지연이 발생하는 시간에 첫 프로파일 수집하기
플레이어가 지연을 느낀 시각, 인원, 저장 여부를 기록하고 같은 시간대의 MSPT와 프로파일을 비교합니다. 정상 시간대의 짧은 표본도 수집하세요. 처리 점유 증가와 대기 증가를 나누면 플러그인 조정과 스토리지 조사 중 어느 쪽으로 진행할지 판단하기 쉽습니다.
평균과 짧은 멈춤을 따로 측정합니다
TPS, MSPT 평균·최대·p95, 느린 tick의 누적 횟수를 기록합니다. 평균이 양호해도 짧은 멈춤은 숨을 수 있습니다. 호스트 전체 CPU 사용률만으로는 단일 스레드 작업과 I/O 대기를 구분할 수 없습니다.
콘솔을 늘리지 않고 누락도 기록합니다
이 사례에서는 소형 플러그인이 Paper 공개 API에서 가져온 측정값을 로컬 JSON에 기록하고, 수집기가 이를 모니터링 시계열로 집계했습니다. 파일 I/O는 게임 main thread 밖에서 처리했고, 임시 파일을 교체해 읽는 중인 파일이 부분 갱신되지 않게 했습니다. 일반 콘솔 로그를 숨긴 방식은 아닙니다.
시간과 수집 성공 여부도 확인합니다. 수집기가 멈춘 뒤 남은 오래된 값을 정상으로 보거나, 누락 데이터를 TPS 0으로 바꾸지 않습니다.
제한된 JVM·OS·저장 관측을 대조합니다
문제가 재현되는 동안 JFR, OS 대기 관측, 블록 I/O를 서로 다른 제한된 시간 창에서 수집했습니다. 이를 연속 MSPT 시계열 및 주기적인 I/O pressure와 대조해 GC 활동과 동기 저장 중 대기를 구분했습니다. 모든 수집이 같은 시점에 이뤄진 것은 아닙니다. Paper 분석을 시작할 때는 공식 spark 프로파일링 안내를 참고할 수 있습니다. 이 사례에서는 저장 중 대기를 자세히 조사하기 위해 JFR과 OS 관측을 추가했습니다.
정상적인 240초 관측 창과 정체가 있던 220초 창에서 초당 write-await 중앙값은 각각 1.60ms와 43.71ms였고, 최대값은 6.00ms와 123.57ms였습니다. 이는 두 관측 창의 비교이며, 조치 전후 결과나 일반적인 벤치마크가 아닙니다.
동기 저장과 파일시스템 journal 대기 외에도 여러 애플리케이션의 장치 요청에서 지연이 보여 공유 스토리지 경로를 원인 후보로 좁혔습니다. Linux 블록 tracepoint의 완료 이벤트는 요청 일부만 나타낼 수 있으므로, 대응되지 않은 요청을 전체 I/O 통계에 섞지 않았습니다. 수집 시간과 데이터량을 제한하고 계측 부하도 고려했습니다.
- 조용한 상시 측정 일반 콘솔 로그를 늘리지 않고 TPS/MSPT와 누락 데이터를 기록합니다.
- 제한된 원인 조사 JFR·OS·block I/O를 따로 수집해 대조합니다. 공유 storage 경로는 후보 원인이지 확정된 장애가 아닙니다.
다음 단계는 별도의 시험으로 다룹니다
조사 뒤 제한 수집을 종료하고 상시 수집이 정상임을 확인했습니다. 스토리지를 옮긴 뒤 유사한 사용 조건에서 여러 주기를 비교하는 시험은 아직 하지 않았습니다. 이 기록은 백업·복구·롤백 계획을 갖춘 후속 대응을 준비합니다. 저장 내구성을 낮추거나 근거 없이 GC 또는 특정 플러그인을 원인으로 지목하지 않습니다.
모니터링 신호와 장애 진단의 구분은 OpenClaw 모니터링 및 장애 조사, 복구 검증은 R2 및 restic 백업 모니터링을 참고하세요.