Meilisearch 메모리 누수, jemalloc, bumpalo, mimalloc v3로 해결!
Meilisearch에서 발생한 메모리 누수(Memory Leak) 문제를 jemalloc, bumpalo, mimalloc을 활용하여 해결하는 과정을 다룸
초기에는 jemalloc을 사용하여 메모리 누수를 진단하고, AI 에이전트(AI Agent)의 도움을 받아 버그를 발견함
bumpalo::Vec 사용 시 발생한 drop glue 문제(Drop Glue Issue)를 해결했으나, 메모리 사용량 증가 문제는 지속됨
mimalloc v3를 도입하여 성능 향상(Performance Improvement)을 달성하고, 메모리 사용량을 대폭 감소시킴
jemalloc을 활용한 메모리 누수 진단
Meilisearch 개발자는 jemalloc을 사용하여 메모리 누수 문제를 진단했다. jemalloc(Jemalloc)은 메모리 할당 및 해제를 추적하는 데 유용한 도구를 제공하며, 이를 통해 코드 내에서 메모리 누수의 원인을 파악할 수 있었다. 특히, jemalloc의 프로파일링 기능을 활성화하여 생성된 SVG 보고서를 분석, AI 에이전트의 도움을 받아 버그를 발견했다. 이 과정에서 개발자는 AI 에이전트(AI Agent)의 유용성을 확인했다.
bumpalo::Vec 사용 시 발생한 drop glue 문제
bumpalo::Vec을 사용하여 메모리 할당을 최적화하려 했으나, drop glue 문제(Drop Glue Issue)로 인해 예상치 못한 메모리 누수가 발생했다. bumpalo::Vec을 slice로 변환할 때 drop glue가 실행되지 않아, std::Vec과 같은 global-allocator-backed data structure가 제대로 해제되지 않았다. 이 문제는 v1.12부터 존재했으며, 개발자는 이 버그를 수정하여 메모리 누수를 해결했다. 하지만, bumpalo(Bumpalo)의 사용은 여전히 복잡한 문제로 남아있다.
mimalloc v3 도입을 통한 성능 개선
mimalloc v3를 도입하여 Meilisearch의 메모리 사용량을 대폭 감소시키고 성능을 향상시켰다. mimalloc v3는 jemalloc과 유사한 성능을 제공하며, 특히 멀티 스레드 환경에서 메모리 공유를 효율적으로 처리한다. 개발자는 mimalloc v3를 통해 RSS(Resident Set Size)를 줄여 디스크 I/O를 감소시키고, 전반적인 성능을 개선했다. mimalloc v3는 lock-free 디자인(Lock-Free Design)과 first-class heaps를 지원한다.
LMDB와 메모리 할당기의 상호 작용
Meilisearch는 LMDB를 사용하여 인덱스를 저장하며, LMDB는 자체적인 메모리 할당기를 사용한다. Meilisearch와 LMDB가 서로 다른 할당기를 사용하면서, 메모리 할당 및 해제 과정에서 비효율성이 발생했다. 특히, mimalloc을 사용할 때 이러한 문제가 두드러졌다. 개발자는 jemalloc을 사용하여 LMDB와 Meilisearch의 메모리 할당을 통합함으로써 문제를 해결했다. 데이터 격리 아키텍처(Data Isolation Architecture)를 개선하기 위한 노력의 일환이다.