제멜로크 5.4.0 업데이트 안내

jemalloc은 컴퓨터 프로그램이 실행될 때 메모리를 효율적으로 관리할 수 있도록 돕는 도구입니다. 프로그램은 작동 중에 필요한 만큼의 기억 공간인 메모리를 빌려 쓰고 반납하는 과정을 반복하는데, jemalloc은 이 메모리 할당과 해제를 담당하는 관리자 역할을 합니다. 이번에 발표된 5.4.0 버전은 새로운 기능을 대거 추가하기보다는, 그동안 쌓였던 코드의 기술 부채를 청소하고 내부 구조를 정리하는 리팩터링, 버그 수정, 테스트 개선 등에 집중한 업데이트입니다.

이번 버전은 새로운 기능 추가 외에도 다양한 운영체제와 환경에서 더 안정적으로 작동하도록 구조를 전면적으로 개편했다는 점이 특징입니다. 개발 과정에서 발견된 여러 가지 버그를 수정하고, 코드를 모듈 형태로 깔끔하게 나누어 유지보수가 쉽도록 개선했습니다. 특히 운영체제별 호환성 문제를 해결하고, 고정된 정책 대신 실제 사용량에 맞춰 메모리 관리 방식을 바꾸는 등 다양한 개선 작업을 수행했습니다.

제멜로크 공개 저장소 페이지입니다.

알림 설정 변경을 위해 로그인해야 합니다.

이 저장소를 다른 사람의 계정으로 복사해 간 횟수는 1,600회입니다.

즐겨찾기(별표) 수는 11,200개입니다.

5.4.0 버전입니다.

최신 버전 표시입니다.

최신 버전입니다.

비교할 태그를 선택할 수 있습니다.

필터 기능입니다.

모든 태그 보기입니다.

광리 다이(guangli-dai) 사용자가 9월 17일 오후 6시 31분에 이 버전을 공개했습니다.

이후 개발 버전에는 5개의 변경 이력이 추가되었습니다.

5.4.0 버전입니다.

기술적 변경 이력을 식별하는 고유 번호인 7a34f18입니다.

이번 공개 버전에는 160개가 넘는 변경 이력이 담겨 있으며, 그 중심에는 코드 재작성, 오류 수정, 테스트 범위 확대, 설정 정리 등 오래된 기술 부채를 청산하는 작업이 있습니다. 또한 상위 개발팀의 문제 보고를 반영하여 여러 운영체제에서 원활히 작동하도록 개선한 내용도 포함되어 있습니다.

새로운 기능들입니다.

EXTENT_ALLOC_FLAG_PINNED 기능을 추가하여, 거대한 메모리 페이지(HugeTLB)처럼 일반적인 정리 과정에서 제외해야 하는 특수 메모리 공간을 사용자 지정 할당 도구가 따로 표시해 두었다가 우선적으로 다시 쓸 수 있게 만들었습니다. 또한, stats.pinned, stats.arenas.<i>.pinned, stats.arenas.<i>.extents.<j>.npinned, stats.arenas.<i>.extents.<j>.pinned_bytes, stats.arenas.<i>.mutexes.extents_pinned.{counter}와 같은 상태 확인용 인터페이스(mallctl)를 추가하여 고정된 메모리 사용량과 내부 잠금 장치 통계를 확인할 수 있게 했습니다. (기여 자: @binliu19, 변경 번호: be2de8c)

스레드별 메모리 관리 구역(arena)을 지정하는 thread.arena 설정을 통해 개별 중앙처리장치(CPU) 구역 선택 기능을 다시 쓸 수 있게 허용했습니다. (기여자: @Algunenano, 변경 번호: 68c35f6)

사람이 읽기 쉬운 형태의 메모리 사용 통계와 기계가 읽기 쉬운 JSON 형식의 통계 내용을 서로 더 잘 맞추었습니다. (기여자: @spredolac, 변경 번호: 68fe1be, 30b1a41, 04aad97)

프로그램이 실행될 때 쓰이던 실험적인 experimental_infallible_new 설정을 없애고, 프로그램을 만들 때 결정하는 --enable-cxx-infallible-new 설정으로 바꾸었습니다. 이를 통해 컴파일러 단계에서의 최적화와 객체 이동 시 최적화가 가능해졌으며, new(std::nothrow) 규칙의 오류를 바로잡았습니다. (기여자: @spredolac, 변경 번호: 160ab9d, fe33667)

기존 방식과 호환되지 않는 변경 사항들입니다.

임시 메모리 보관소(tcache)의 채우기 및 유지 목표를 고정된 방식 대신, 쓰레기 수집(GC) 주기 사이에 관찰된 실제 요구에 맞추어 조절하도록 변경했습니다. 실험적이지 않은 기존 제어 설정 7가지(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)를 삭제했습니다. 이에 해당하는 설정값(malloc_conf)들은 무시되며, opt.* 관련 확인 명령은 ENOENT 오류를 반환하고, tcache_ncached_max 설정은 계속 지원됩니다. (기여자: @spredolac, 변경 번호: d13fe91)

오류 수정 사항들입니다.

메모리를 해제하는 함수(free, free_sized, free_aligned_sized)와 커널 기능을 이용해 메모리 페이지를 비우는 과정에서 시스템 오류 번호(errno)가 유지되도록 수정했습니다. (기여자: @spredolac, 변경 번호: 3a77966, 86f0582)

메모리 크기별 분류에서 숫자가 너무 커져 발생하는 범위를 벗어남(overflow) 오류 검사를 수정했습니다. (기여자: @spredolac, 변경 번호: 6b24522)

크기가 지정된 메모리 해제 함수(free_sized() 및 free_aligned_sized())에서 비어 있음을 뜻하는 빈 값(NULL)을 받아들이도록 하여 최신 C언어(C23) 표준에 맞게 수정했습니다. (기여자: @bigbruno, 변경 번호: 7ce8b91)

스레드 지역 저장소(TSD)의 생명 주기 과정에서 발생하는 예외 상황을 해결했습니다. 1) 캐시가 활성화되었다고 표시하기 전에 임시 메모리 보관소 단위를 먼저 초기화하여, 초기화되지 않은 상태를 재진입 초기화 과정에서 사용하는 것을 막았고, 2) 일반적인 스레드 지역 저장소 플랫폼에서 스레드가 끝난 뒤 늦게 메모리를 해제할 때 저장소를 불필요하게 다시 만드는 과정을 없숬습니다. (기여자: @fzakaria, 변경 번호: 54f22c8, @spredolac 기여자: fb5499a)

거대한 페이지 시스템 파일(THP sysfs)을 열 때 O_CLOEXEC 설정을 사용하도록 수정했습니다. (기여자: @ibookstein, 변경 번호: d070554)

메모리 통계 출력 결과에서 중복으로 나타나던 opt.stats_print 및 opt.stats_print_opts 항목을 바로잡았습니다. (기여자: @spredolac, 변경 번호: dfe3a2e)

메모리 구역을 초기화(arena_reset)하는 과정에서 프로그램이 멈추는 교착 상태(deadlock) 가능성을 수정했습니다. (기여자: @guangli-dai, 변경 번호: 6957341)

보안 기능(SAN)에서 성능 측정 표본 추출과 안전 구역(guard page)이 상호작용할 때 발생하던 오류를 수정했습니다. (기여자: @gctony, 변경 번호: e36a0fa)

성능 최적화 및 구조 개선 사항들입니다.

메인 파일(jemalloc.c)에서 메모리 구역 관리, 초기화, 프로그램 분기 처리, 할당 전달 기능을 분리하여 제멜로크의 앞단 구조를 모듈화했습니다. 또한, 임시 메모리 보관소와 메모리 구역 간의 소유 관계를 정리하고, 내부 헤더 파일들의 연결 구조를 정돈하여 서로 맞물려 순환하는 의존성을 없애켰습니다. (기여자: @spredolac, 변경 번호: ba1e2fe, 8874597, 9d75722, de9ad14 외 다수)

아레나 도우미 함수를 다듬고, 내부 구현용 제어 기능을 감추고, 제어 흐름 매크로를 형식이 지정된 도우미 함수로 바꾸고, c.t.l 파일의 구조를 하위 시스템별로 정리하여 제어(ctl) 전달 과정을 단순화했습니다. 이 작업은 @spredolac 기여자가 진행했습니다.

드물게 발생하는 경쟁 상태에서 가상 메모리가 완전히 고갈되는 것을 막기 위해 기본 블록(base-block) 성장의 한계치를 설정했습니다. 여기서 경쟁 상태란 여러 작업이 동시에 자원을 차지하려다 엉키는 상황을 말하며, 가상 메모리는 컴퓨터가 실제 물리 메모리보다 더 큰 공간처럼 쓸 수 있게 만든 가상의 기억 공간입니다. 이 작업은 @guangli-dai 기여자가 진행했습니다.

백그라운드 스레드의 생명주기와 상태 관리 작업을 백그라운드 스레드 모듈 안으로 이동시켰습니다. 스레드는 프로그램 안에서 동시에 실행되는 여러 작업 단위를 뜻하며, 생명주기는 스레드가 태어나서 사라질 때까지의 과정을 말합니다. 이를 통해 기존 호출 방식과 상관없이 누가 이 자원을 소유하고 관리하는지 더 명확하게 정리했습니다. 이 작업은 @guangli-dai 기여자가 진행했습니다.

페이지 할당 방식의 경계를 더 단순하게 만들었습니다. 기존의 가상 함수 테이블 방식을 직접 호출 방식으로 바꾸고, 더 이상 쓰이지 않는 방식을 제거했으며, 미뤄둔 작업과 메모리 해제 조율 과정을 아레나 외부로 옮겼습니다. 이 작업은 @guangli-dai 기여자가 진행했습니다.

성능 통계 정보를 모으고 화면에 보여주는 과정을 정보 수집 단계와 출력 단계로 나누고, 표 형식으로 깔끔하게 정리했습니다. 이 작업은 @spredolac 기여자가 진행했습니다.

운영체제(컴퓨터 하드웨어를 관리하고 프로그램이 실행될 환경을 제공하는 기본 소프트웨어)와 직접 소통하는 계층을 새로 만들었습니다. 이에 따라 파일 및 프로세스 입출력, 시간 측정, 동기화, 중앙처리장치 관리, 가상 메모리, 프로그램 분기, 오류 처리, 성능 측정, 스레드 양보, 설정 접근 등 플랫폼에 따라 달라지는 기능들을 메모리 관리자의 핵심 코드 밖으로 분리해 냈습니다. 이 작업은 @guangli-dai 기여자가 진행했습니다.

다른 운영체제나 환경에서도 잘 실행되도록 개선한 부분입니다.

메모리 할당 실패 시 쓰이던 기존 방식을 표준 C++ 언어 문법으로 변경했습니다. 이는 2900번 문제 해결과 관련이 있습니다. 이 작업은 @lexprfuncall 기여자가 진행했습니다.

C99 표준 이상의 프로그래밍 언어 환경에서 아레나 구조체가 유연한 배열 멤버를 사용하도록 변경했습니다. 이 작업은 @grueninger 기여자가 진행했습니다.

가상 주소 공간 크기 설정 옵션인 --with-lg-vaddr을 사용할 때 프로세서의 빠른 시간 측정 기능을 올바르게 감지하도록 수정했습니다. 이 작업은 @xinydev 기여자가 진행했습니다.

맥 운영체제(macOS)에서 현재 중앙처리장치 번호를 올바르게 읽어오도록 관련 기능을 수정했습니다. 이 작업은 @Algunenano 기여자가 진행했습니다.

백그라운드 스레드가 잠들 때 시스템 시계가 뒤로 돌아가는 현상으로 인해 프로그램이 멈추는 문제를 막기 위해 단조 시계 기능을 사용하도록 바꿨습니다. 또한 프로그램을 설치하기 전 환경을 점검할 때 단조 조건 변수를 지원하는지 확인하도록 수정했습니다. 이 작업은 @antonio2368 기여자가 진행했습니다.

맥 운영체제에서 코드를 번역할 때 나타나는 경고 메시지를 수정했습니다. 이 작업은 @gctony 기여자가 진행했습니다.

윈도우 운영체제에서 최소한의 개발 환경을 제공하는 도구 모음인 민기브(MinGW) 환경에서 스레드가 끝날 때 스레드 지역 저장소를 정리하는 과정의 오류를 수정했습니다. 이 작업은 @gctony 기여자가 진행했습니다.

프로그래밍 언어 번역기인 지시씨(GCC) 16 버전에서 코드를 번역할 때 경고가 발생하지 않도록 수정했습니다. 매크로와 함수 문법에서 엄격한 규칙을 위반하는 부분을 제거하고, 성능 측정용 스레드 이름 복사 시 문자열 끝을 나타내는 표시를 확실하게 넣도록 수정했습니다. 이 작업은 @grueninger 기여자와 @jasonangelov 기여자가 진행했습니다.

프로세스 식별자 공간과 연결된 특수한 파일 경로를 읽을 때 표준 라이브러리에 의존하는 복잡한 함수 대신 직접 분석하도록 바꾸고, 식별자 값을 64비트 정수로 반환하도록 수정했습니다. 이 작업은 @guangli-dai 기여자가 진행했습니다.

기여자 목록

@fzakaria

@Algunenano

@ibookstein

@lexprfuncall

@spredolac

@bigbruno

@xinydev

@binliu19

@guangli-dai

@antonio2368

@grueninger

@jasonangelov

@gctony

fzakaria, Algunenano를 포함하여 총 11명의 기여자가 함께 참여했습니다.

배포 파일(Assets) 3개

불러오는 중

18명이 이 게시물에 반응했습니다.

토론 참여하기 0

일반 사용자들은 평소에 jemalloc을 직접 눈으로 보거나 설치할 일이 없으므로 당장 일상생활에서 직접적인 변화를 느끼기는 어렵습니다. 하지만 이 도구를 기반으로 만들어진 다양한 프로그램과 서버 소프트웨어들은 메모리를 더 안정적이고 효율적으로 관리할 수 있게 됩니다. 개발자나 시스템 관리자의 경우, 새로운 고정밀 메모리 통계 기능과 추적 기능을 활용할 수 있고, 다양한 운영체제 간 호환성 문제와 잠재적인 오류가 줄어들어 대규모 시스템을 운영할 때 안정성을 높이는 데 도움을 받을 수 있습니다.