MSR 메모리 할당기 mimalloc, CPython 3.13·언리얼엔진에 채택
마이크로소프트 리서치(MSR) RiSE 그룹이 자사 연구 블로그를 통해 고성능 메모리 할당기 mimalloc의 설계와 도입 현황을 정리해 공개했다. 표준 C 라이브러리의 malloc과 free를 그대로 대체할 수 있는 드롭인 라이브러리다.
mimalloc은 약 12K(약 1만2천 줄) 분량의 C 코드로 구성됐다. 깃허브에서 1만2천 개 이상의 스타를 받았으며, 러스트 래퍼 패키지만으로도 하루 10만 회 이상 다운로드되고 있다.
MSR 측은 mimalloc이 최악의 경우에도 OS 원시 호출 수준의 할당 시간 상한과 공간 오버헤드 상한, 낮은 내부 단편화, 최소한의 락 경쟁을 제공한다고 설명했다. 거의 모든 동기화는 원자 연산만으로 처리한다.
mimalloc은 2020년에 처음 설계됐다. MSR의 함수형 프로그래밍 언어 Lean과 Koka에서 빠른 할당기로 사용하기 위해 만들어졌으며, 두 언어는 Perceus라는 컴파일러 가이드형 참조 카운팅 기법을 사용한다.
마이크로소프트는 검색 서비스 빙(Bing) 등 자사 대형 서비스에서 제품팀과 협업해 mimalloc을 도입했고, 응답 시간을 크게 개선했다고 밝혔다. 외부 도입 사례로는 NoGIL CPython 3.13 이상, 언리얼 엔진, 게임 '데스 스트랜딩(Death Stranding)' 등이 있다.
작은 코드베이스 덕분에 다양한 플랫폼으로 포팅됐다. 윈도우, macOS, 리눅스, FreeBSD, NetBSD, DragonFly에 더해 여러 콘솔에도 이식돼 있다. NoGIL CPython 적용은 샘 그로스 등이 동시성 할당기로 mimalloc을 채택해 이뤄졌다.
핵심 설계는 tcmalloc, jemalloc 등 기존 확장형 할당기와 유사하게 스레드별 로컬 힙을 두는 방식이다. mimalloc은 이를 'theap'으로 부르며, 각 theap은 보통 64 KiB 크기의 페이지 집합을 소유한다. 페이지 안에는 고정 크기 블록을 두어 내부 단편화를 줄였다.
다른 스레드가 할당한 블록을 해제할 때만 원자 연산이 필요하다. 실무에서는 대부분의 할당이 1 KiB 미만의 작은 크기이며, 이 경우 mimalloc의 빠른 경로(fast path)는 x64 어셈블리상 두 개 정도의 드문 분기만 남는 매우 짧은 코드로 컴파일된다.
최신 버전인 mimalloc v3에서는 페이지 메타데이터 조회에 메모리 전체에 걸친 온디맨드 맵을 사용한다. free()를 전역으로 오버라이드한 환경에서 무효 포인터가 들어오는 경우를 효율적으로 감지해 NULL을 반환할 수 있도록 한 설계다.