Ubuntu 26.04 LTS로 업그레이드한 뒤 MongoDB 컨테이너가 약 30초 간격으로 계속 재시작되는 현상이 발생했다.
서비스 입장에서는 요청이 간헐적으로 3~5초씩 멈추는 현상으로 관측됐다. MongoDB가 죽는 타이밍에 들어온 쿼리가 재시작 대기 시간 동안 블로킹되는 것이었다.
Linux 커널 6.19 이상에서 MongoDB 8.x 전체가 호환되지 않는다.
MongoDB JIRA: SERVER-121912
Ubuntu 26.04 LTS는 Linux 커널 7.0.x를 기본 탑재한다. MongoDB 8.x는 메모리 할당자를 기존 jemalloc에서 tcmalloc-google으로 교체했는데, 이 tcmalloc-google이 커널의 rseq(restartable sequences) 기능을 직접 syscall로 사용한다. 커널 6.19에서 rseq 관련 동작이 변경되면서 MongoDB 8.x가 충돌하게 됐다.
| 버전 | 증상 |
|---|---|
| MongoDB 8.0.x | 시작 시 명시적 오류 출력 후 거부 |
| MongoDB 8.2.x | 오류 없이 약 30초 후 segfault |
MongoDB 8.0.x에서 출력되는 오류 메시지:
MongoDB cannot start: Linux kernel versions 6.19 and newer has a known
incompatibility with this version of MongoDB.
See https://jira.mongodb.org/browse/SERVER-121912 for more information.흔히 알려진 GLIBC_TUNABLES: glibc.pthread.rseq=0 환경변수 설정은 glibc의 rseq 사용만 비활성화한다. 그러나 MongoDB 8.x의 tcmalloc-google은 glibc를 거치지 않고 직접 rseq syscall을 호출하기 때문에 이 워크어라운드가 효과가 없다.
MongoDB 7.x는 tcmalloc-google 대신 jemalloc을 사용하여 이 문제가 없다.
docker-compose.yaml:
mongo:
image: mongo:7 # mongo:latest 대신 버전 고정단, MongoDB는 데이터 포맷 하위 호환이 안 된다. 8.x로 쓴 데이터 파일을 7.x가 읽지 못하므로, 기존 데이터가 있다면 mongodump / mongorestore로 마이그레이션이 필요하다.
SERVER-121912 이슈가 해결되면 패치 버전에서 커널 6.19+ 호환성이 복구될 예정이다. 그 이후 mongo:latest로 복귀 가능하다.
Ubuntu 24.04 LTS는 커널 6.8.x를 기본 탑재하므로 MongoDB 8.x와 호환된다. Ubuntu 26.04 클린 설치도 동일한 커널 버전 문제가 발생한다.
MongoDB 8.x 시작 시 로그에 아래 경고들이 함께 출력된다. THP 설정으로 해결하려 해도 근본 원인(rseq)이 달라 충돌은 계속된다.
Soft rlimits for open file descriptors too low (currentValue: 1024, recommendedMinimum: 64000)
For customers running tcmalloc-google, suggest changing transparent_hugepage/enabled to "always"
We suggest setting swappiness to 0 or 1ulimits 조정이나 THP 활성화는 보조적인 권장 사항이지, 이 충돌의 해결책이 아니다.
----------
머루아저씨
✨ Full-stack Developer | 최신 기술 애호가
💻 현개발환경: PHP 8.4, Swoole, MongoDB, Redis, Docker
⚙️ Ubuntu/Linux 환경 & VS Code SSH 기반 작업
📚 "지속 가능한 개발, 효율적인 코드"를 지향합니다.