5P by darjeeling 5시간전 | ★ favorite | 댓글 3개

macOS XNU 커널에서 정확히 49일 17시간 2분 47초 연속 가동 후 TCP 네트워킹이 완전히 마비되는 버그가 발견됐다. 원인은 커널 내부 TCP 타임스탬프 카운터(tcp_now)의 32비트 정수 오버플로우다. ping은 계속 응답하지만 새로운 TCP 연결은 전혀 맺을 수 없게 되며, 현재 유일한 해결책은 재부팅이다.


발견 경위

Photon은 iMessage 서비스 상태를 모니터링하는 Mac 서버 플리트를 24/7 운용하고 있었다. 2026년 3월 30일, 마지막 재부팅으로부터 정확히 49.7일이 지난 시점에 여러 머신이 조용히 새 TCP 연결을 거부하기 시작했다. ping은 정상, 기존 연결도 유지됐지만 새 소켓을 여는 모든 시도가 실패했다.

서비스를 복구하기 위해 재부팅 후, 팀은 며칠 내로 같은 임계점에 도달할 머신 두 대(A, B)를 골라 라이브 실험을 설계했다.


버그의 기술적 원리

문제의 카운터 tcp_now

XNU 커널의 tcp_now는 부팅 이후 경과 시간을 밀리초 단위로 세는 32비트 부호 없는 정수다. 32비트가 표현할 수 있는 최댓값은 4,294,967,295ms — 이를 환산하면 정확히 49일 17시간 2분 47초다.

왜 카운터가 "얼어붙는"가?

tcp_now 업데이트 코드에는 "시계가 뒤로 가지 않도록" 하는 단순한 가드가 있다:

if (tmp < current_tcp_now) {  
    os_atomic_cmpxchg(&tcp_now, tmp, current_tcp_now, ...);  
}  

오버플로우 순간, 새로 계산된 current_tcp_now는 0 근처로 다시 감기지만, 기존 tmp는 최댓값 근처에 있다. 조건 tmp < current_tcp_now영원히 false가 되어 tcp_now는 그 값에 그대로 멈춰버린다. 커널의 TCP 시계가 멈춘 것이다.

TIME_WAIT가 만료되지 않는 이유

TCP 연결이 닫힐 때 커널은 만료 시각을 tcp_now + 30초로 기록해둔다. 주기적으로 가비지 컬렉터가 스캔하며 tcp_now >= 만료시각이면 연결을 해제한다. 그런데 tcp_now가 얼어버리면 이 조건이 절대 참이 되지 않아 TIME_WAIT 연결이 영영 회수되지 않는다.


실험 결과

팀은 오버플로우 전후 각 5분씩 초당 여러 건의 단명 TCP 연결을 생성하며 TIME_WAIT 수를 관찰했다.

구간 상태
오버플로우 전 TIME_WAIT가 ~200개에서 안정적으로 유지 (30초마다 정상 만료)
오버플로우 직후 만료가 멈추고 TIME_WAIT 단조 증가 시작
연결 생성 중단 84초 후 0이 되어야 할 TIME_WAIT가 오히려 증가 (2,828 → 2,837)
오버플로우 후 9.5시간 Machine A: 4,888개, Machine B: 8,217개 — 단 한 건도 회수 안 됨

9.5시간 후에는 SYN_SENT 상태 연결도 3,000개 이상 쌓이고, Machine B의 로드 애버리지가 49.74까지 치솟았다.


영향을 받는 환경

일반 소비자 Mac은 OS 업데이트로 49일 이전에 재부팅하는 경우가 많아 영향이 적다. 하지만 다음 환경은 고위험군이다:

  • 장시간 무중단 서버 플리트
  • macOS CI/CD 빌드 서버 (Jenkins, GitHub Actions 셀프호스트 러너)
  • Mac Pro 워크스테이션 (렌더링·컴파일 장시간 실행)
  • 원격 관리 코로케이션 Mac
  • Mac mini 빌드팜·테스트 인프라

현재 및 향후 대응

팀은 현재 재부팅 없이 동결된 tcp_now를 직접 수정하는 워크어라운드를 개발 중이다. 그 전까지의 임시 대책은 하나다:

49일 17시간 2분 47초 이전에 재부팅을 스케줄링하라.


유사한 역사적 버그들

이 버그는 유구한 계보를 가진 정수 오버플로우 버그군에 속한다: Windows 95/98의 49.7일 크래시, 2038년 문제(Y2K38), GPS 주차 번호 롤오버, 팩맨 256스테이지 킬스크린이 모두 같은 계열이다.


원문: Photon Blog, 2026.04.07

요즘은 MacOS 가 49제를 다 지내는군요

시간 이슈라고 하니까 Y2K가 생각나는군요.. 🤖..

AWS 나 github 의 mac instance 들은 어떻게 그동안 문제가 없었던거죠...?