Hacker News인프라 · 데브옵스

메모리 스왑이 Go 가비지 컬렉터를 40ms 멈추게 한다

원제 A 40ms Go garbage collector pause caused by swap

101 포인트댓글 106
Key Point

프로덕션 환경에서 스왑을 사용할 때 Go 애플리케이션의 예측 불가능한 대규모 일시 중지와 성능 저하가 발생하는 실제 사례이므로, Go 기반의 고성능 시스템을 운영하는 개발자와 인프라 엔지니어가 알아야 한다.

핵심 요약

  • 프로덕션에서 메모리 스파이크를 처리하려고 스왑을 활성화했을 때, Go 가비지 컬렉터의 일시 중지 시간이 크게 증가하는 문제를 발견했다.
  • Go GC는 stop-the-world 일시 중지 중에 힙 외부의 메타데이터를 읽는데, 이 메타데이터가 스왑 디바이스에 옮겨지면 페이지 폴트가 발생한다.
  • 실험 결과 메타데이터가 NVMe에 있을 때 최악의 경우 일시 중지 시간이 40ms에 달했고, 이는 중간값인 51μs의 800배이다.
  • 40ms 중 39ms는 228건의 페이지 폴트로 인한 것이며, 커널이 스왑에서 페이지를 다시 읽어들이는 과정에서 발생했다.
  • GC 일시 중지는 모든 goroutine과 프로세서를 멈추므로, I/O 결과를 처리하지 못하고 이벤트를 놓치는 문제가 생긴다.
  • 메모리 스파이크 테스트에서 이런 오래된 일시 중지가 2~3회 발생했으며, 메시지 빌드 시간도 일반적인 3~5ms에서 NVMe에서 105ms, 네트워크 볼륨에서 903ms로 증가했다.
  • Go 1.26의 Green Tea 가비지 컬렉터도 메타데이터 읽기 방식은 변하지 않아 이 문제는 여전히 존재한다.
AI 요약 안내

AI가 한국어로 정리한 내용입니다. 정확한 정보는 원문을 확인해 주세요.

요약 원칙 ↗