Trawling
발견 출처 Lobsters/발행

jemalloc 5.4.0 release

jemalloc 5.4.0 릴리스 — 대규모 기술 부채 정리와 tcache 정책 변경

메모리 할당자 jemalloc이 160개 이상의 커밋을 담은 5.4.0을 릴리스했습니다. tcache 채움·유지 정책을 수요 기반 적응형으로 바꾸면서 기존 설정 7개를 제거하는 비호환 변경이 포함되며, HugeTLB 같은 비회수 매핑을 위한 pinned extent 기능과 대규모 리팩터링·이식성 개선이 담겼습니다.

본문

jemalloc 5.4.0은 160개가 넘는 커밋을 포함한 릴리스로, 리팩터링·버그 수정·테스트 커버리지 향상·옵션 정리 등 기술 부채 청산에 초점을 두고 있습니다. 업스트림 이슈 리포트에 따른 이식성 개선도 다수 포함되어 있습니다.

주요 신규 기능

새 EXTENT_ALLOC_FLAG_PINNED 플래그가 추가되어, 커스텀 extent-allocation 훅이 HugeTLB 페이지처럼 회수 불가능한 매핑을 표시하고 decay·purge 파이프라인 밖에서 우선적으로 재사용할 수 있게 되었습니다. stats.pinned, stats.arenas.<i>.pinned, stats.arenas.<i>.extents.<j>.npinned 등 관련 mallctl 통계 인터페이스도 함께 추가되었습니다. thread.arena를 통한 per-CPU arena 선택 재개(resume)가 가능해졌고, 사람이 읽는 형식과 JSON 형식의 malloc 통계 내용이 더 잘 정렬되었습니다. 런타임 옵션이던 experimental_infallible_new는 컴파일타임 --enable-cxx-infallible-new 옵션으로 대체되어 컴파일러 수준 최적화와 move 생성자 최적화가 가능해졌으며, new(std::nothrow) 계약 위반도 수정되었습니다.

비호환 변경 — tcache 정책

이번 릴리스에서 가장 주의할 부분입니다. tcache의 bin별 채움(fill)과 유지(retention) 목표가 GC 이벤트 사이에 관측된 수요에 맞춰 적응적으로 조정되도록 바뀌었고, 기존의 고정 refill/flush 정책이 제거되었습니다. 이에 따라 lg_tcache_nslots_mul, tcache_nslots_small_min, tcache_nslots_small_max, tcache_nslots_large, tcache_gc_delay_bytes, lg_tcache_flush_small_div, lg_tcache_flush_large_div 등 레거시 제어 옵션 7개가 삭제되었습니다. 해당 malloc_conf 설정은 조용히 무시되고, 대응하는 opt.* mallctl은 ENOENT를 반환합니다. tcache_ncached_max는 계속 지원됩니다.

버그 수정

free, free_sized, free_aligned_sized와 process_madvise 기반 페이지 purging 전반에서 errno가 보존되도록 수정되었습니다. size class의 수치 오버플로 검사가 고쳐졌고, free_sized()와 free_aligned_sized()가 NULL을 받아들이도록 하여 C23 준수를 맞췄습니다. TSD(thread-specific data) 라이프사이클의 엣지 케이스 두 가지 — 캐시 활성화 표시 전 thread-cache bin 초기화, 스레드 종료 후 늦은 해제 시 TSD 재생성 방지 — 이 수정되었습니다. init_thp_state에서 THP sysfs 파일을 열 때 O_CLOEXEC을 사용하고, arena_reset 중 잠재적 데드락, SAN 환경의 prof-sampling·guard-page 상호작용 버그도 해결되었습니다.

리팩터링과 최적화

jemalloc.c에서 arena 관리, 초기화, fork 오케스트레이션, 할당 디스패치를 분리해 프런트엔드를 모듈화했고, tcache/arena 소유권을 정리하며 내부 헤더 그래프의 순환 의존성을 제거했습니다. PAI vtable 디스패치를 직접 PAC/HPA 호출로 대체해 pai_t/pai.h 추상화를 걷어냈고, 통계 수집과 렌더링을 gather/emission 단계로 분리했습니다. 플랫폼 의존적인 파일·프로세스 I/O, 시간, 동기화, 가상메모리 등을 다루는 OS 추상화 계층도 새로 도입되었습니다.

이식성 개선

macOS의 malloc_getcpu 수정 및 컴파일 경고 해소, MinGW의 thread-exit TSD 정리, GCC 16 빌드 경고 대응, 백그라운드 스레드 sleep의 CLOCK_MONOTONIC 전환(클럭 롤백 정지 방지), glibc 의존 없는 PID 네임스페이스 심볼릭 링크 파싱 등이 포함되었습니다.

Lobsters 반응

  • @fzakaria — jemalloc에 기여를 하게 되었는데 정말 멋진 경험이었습니다. AI의 도움을 받았지만 진단과 재현이 매우매우 어려운 문제였습니다. AI 지원 없이는 근본 원인을 찾지 못했을 겁니다.
  • @zg — jemalloc이 다시 새 릴리스를 내놓는 모습을 보니 정말 반갑습니다!

원문: GitHub (jemalloc releases) / 번역·요약: Trawling