MEMKIND
Build Status
MEMKIND version
Coverage Status
Packaging status
Language grade: C/C++
⚠️ 프로젝트 중단 안내
memkind 프로젝트는 Intel에 의해 더 이상 유지 관리되지 않습니다.
- Intel은 이 프로젝트의 유지 보수, 버그 수정, 새 릴리스 또는 업데이트를 포함하되 이에 국한되지 않는 개발 및 기여 활동을 중단했습니다.
- Intel은 이 프로젝트에 대한 패치를 더 이상 받지 않습니다.
- 만약 이 프로젝트를 계속 사용해야 하거나, 독립적으로 개발하는 데 관심이 있거나, 오픈 소스 소프트웨어 커뮤니티를 위해 패치를 유지 관리하고 싶다면, 이 프로젝트의 자신만의 포크(fork)를 생성해 주십시오.
유사한 기능에 관심이 있다면 UMF project를 참고할 수 있습니다.
개요 (Introduction)
memkind 라이브러리는 jemalloc을 기반으로 구축된 사용자가 확장 가능한 힙 관리자(heap manager)입니다. 이는 메모리 특성 제어와 다양한 종류의 메모리 간에 힙을 분할하는 기능을 가능하게 합니다. 여기서 '메모리 종류(kinds of memory)'는 가상 주소 범위에 적용된 운영체제 메모리 정책에 의해 정의됩니다. memkind가 사용자 확장 없이 지원하는 메모리 특성에는 NUMA 및 페이지 크기 기능 제어 등이 포함됩니다. jemalloc의 비표준 인터페이스는 전문화된 아레나(specialized arenas)를 활성화하여, memkind 파티션 인터페이스를 통해 운영체제로부터 가상 메모리를 요청할 수 있도록 확장되었습니다. 다른 memkind 인터페이스를 통해 사용자는 메모리 파티션 기능을 제어하고 확장하며, 활성화된 기능들을 선택하면서 메모리를 할당할 수 있습니다. Memkind 인터페이스는 지정된 장치(device)에서 파일 기반 메모리(PMEM kind)를 생성하고 제어하는 것을 허용합니다.
목차 (Contents)
- 인터페이스
- 빌드 및 설치
- 의존성
- 커널
- NVDIMM 휘발성 사용
- Kind의 감지 메커니즘
- 로깅 메커니즘 설정
- 힙 매니저 설정
- 고대역폭 메모리 시뮬레이션
- 고대역폭 메모리 식별
- 프로젝트
- 테스트
- 참고 사항
- 면책 조항
인터페이스 (Interfaces)
The memkind 라이브러리는 다섯 가지 인터페이스를 제공합니다:
- hbwmalloc.h - 고대역폭 메모리 사용 사례에 권장됨 (stable)
- memkind.h - 더 복잡한 사용 사례를 위한 일반적인 인터페이스 (stable)
- pmem_allocator.h - PMEM 사용 사례에 사용되는 C++ 할당자이며, C++ Allocator 요구사항을 충족합니다 (stable)
- memkind_allocator.h - 정적 Kind에 사용되는 C++ 할당자이며, C++ Allocator 요구사항을 충족합니다 (stable)
- fixed_allocator.h - 고정된 Kind에 사용되며, 사용자로부터 제공된 영역에서 생성되는 C++ 할당자이며, C++ Allocator 요구사항을 충족합니다 (experimental)
이들 인터페이스에 대한 더 자세한 정보는 해당 man페이지(man/ 서브디렉터리에 위치)를 참조하십시오:
man memkind
man hbwmalloc
man pmemallocator
man memkindallocator
man fixedallocator
빌드 및 설치 (Building and Installing)
memkind 라이브러리는 관련 포크 버전의 jemalloc에 의존합니다.
configure 스크립트와 gtest 소스 코드는 소스 RPM에 포함된 소스 tarball과 함께 배포되며, 이 tarball은 memkind의 "make dist" 타겟을 사용하여 생성됩니다. 배포되는 소스 tarball와 달리 git 저장소에는 생성된 파일이 포함되어 있지 않습니다.
이러한 이유로 git 리포지토리에서 체크아웃하여 빌드할 때는 몇 가지 추가 단계가 필요합니다. 이 단계들에는 configure를 실행하기 전에 "autogen.sh"라는 bash 스크립트를 실행하는 것이 포함됩니다. 이 스크립트는 "git describe"를 기반으로 VERSION 파일을 채우고, autoreconf를 사용하여 configure 스크립트를 생성합니다.
표준 시스템 위치에 memkind를 빌드하고 설치하는 것은 소스 트리의 루트 디렉토리에서 다음을 입력하는 것만큼 간단할 수 있습니다:
./autogen.sh
./configure
make
make install
다른 위치에 이 라이브러리를 설치하려면 prefix 변수를 사용할 수 있습니다. 예를 들어 다음과 같습니다:
./autogen.sh
./configure --prefix=/usr
make
make install
이렇게 하면 파일들이 /usr/lib, /usr/include, /usr/share/doc/, usr/share/man에 설치됩니다.
memkind 또는 jemalloc의 구성 옵션에 대한 더 많은 정보는 다음 출력을 참조하십시오:
man 디렉토리에 man 파일을 생성하려면 다음을 실행하십시오:
RPM
RPM 패키지를 생성하는 것은 Fedora OS에서 수행할 수 있으며, 다음을 설치해야 합니다:
- rpmdevtools
- libdaxctl-devel (일반적으로 선택적 패키지임에도 불구하고)
- hwloc-devel (일반적으로 선택적 패키지임에도 불구하고)
이러한 의존성들이 설치된 상태에서 다음을 실행하여 RPM 패키지를 생성할 수 있습니다:
jemalloc
jemalloc 소스는 jemalloc 버전 5.3.0에서 포크되었습니다. 이 소스 트리는 memkind 소스의 jemalloc 하위 디렉터리에 위치합니다. jemalloc 소스 코드는 다음 항목들을 제외하고는 원본 형태를 유지했습니다:
- "arenalookupx" 및 "check_reallocatex" 함수로 jemalloc API 확장
- mallctl에서 검색 명령어 최적화
- 빌드 시스템이 약간 수정되었습니다.
종속성 (Dependencies)
소스에서 빌드하려면 시스템에 필수 패키지를 설치해야 합니다:
- autoconf
- automake
- gcc-c++
- numactl-devel / libnuma-devel
- libtool
- unzip
PMEM NUMA를 MEMKIND_DAX_KMEM에서 자동 인식하여 사용하려면:
- libdaxctl-devel / libdaxctl-dev (v66 이상)
memkind에서 HMAT 기능을 사용하려면:
- hwloc-devel / libhwloc-dev (v2.3.0 이상)
man 문서를 생성하려면 pandoc을 설치해야 합니다.
실행 요구 사항 (Run Requirements)
런타임에 memkind 라이브러리를 사용하여 동적 링크되는 애플리케이션에는 필수 패키지를 설치해야 합니다:
- numactl-libs / libnuma
- numactl
- pthread
Kind 요구 사항 (Kind Requirements)
아래 표는 사용된 메모리 종류에 따라 추가 요구 사항을 요약합니다:
| Memory kind | NUMA | HBW Memory | Hugepages | Device DAX | Filesystem supporting hole punching | HMAT | libhwloc |
|---|
| MEMKIND_DEFAULT | | | | | | | |
| ... | | | | | | | |
| *Intel의 2세대 Intel(R) Xeon Phi(TM)에서는 필요하지 않음 | | | | | | | |
커널 (Kernel)
NUMA, Hugepages 및 파일 기반 메모리를 올바르게 제어하려면 Linux 커널에 대한 다음 요구 사항이 충족되어야 합니다:
커널 필요
패치는 Linux v3.11에 도입되었으며 NUMA 시스템 호출의 기능에 영향을 미칩니다. Red Hat은 이 패치를 RHEL 7.0 GA 릴리스의 v3.10 커널로 백포팅(back-ported)했기 때문에, RHEL 7.0부터는 해당 커널 버전이 v3.11보다 이전임에도 불구하고 memkind를 지원합니다.
hugepages 할당과 관련된 기능은 패치1와 패치2가 필요합니다. 이것들이 없으면 물리 메모리가 잘못된 NUMA 노드에 위치할 수 있습니다.
2MB 페이지를 얻기 위한 인터페이스를 사용하려면 여기의 지침을 따르고 procfs 파일 사용에 특히 주의해야 합니다:
/proc/sys/vm/nr_hugepages
/proc/sys/vm/nr_overcommit_hugepages
커널의 huge page 풀(pool)을 활성화하기 위해서입니다.
- hole punching을 지원하는 파일 시스템
PMEM 종류를 사용하려면, PMEM 생성을 위해 사용되는 파일 시스템이 FALLOC_FL_PUNCH_HOLE 플래그를 지원하는지 확인해야 합니다.
MEMKIND_DAX_KMEM_* 종류를 사용하려면 최소 Linux Kernel 5.1(DEV_DAX_KMEM 커널 옵션 활성화 필요)이 필요하며, 여기에는 다음 변경 사항들이 포함됩니다:
그리고 DAX 장치를 생성합니다. 자세한 내용은 article을 참조하십시오.
메모리 성능 특성(지연 시간 및 대역폭)을 활용하려면, platform 지원 외에 최소 Linux Kernel 5.5(CONFIG_ACPI_HMAT 커널 옵션 활성화 필요)가 필요합니다.
시스템의 NUMA 노드 지역성 특성을 얻으려면 hwloc-devel v2.3.0 이상이 필요합니다.
NVDIMM 휘발성 사용 (NVDIMM volatile usage)
Memkind는 영구 메모리를 DRAM의 확장으로 사용하는 것을 지원합니다. 이 휘발성 메모리 솔루션은 아래에 설명된 두 가지 별도의 방식으로 라이브러리에 의해 제공됩니다.
DAX 장치 (DAX device)
NVDIMM 메모리를 DAX 장치로 사용하는 것은 MEMKIND_DAX_KMEM_* 종류에서 지원합니다. 이 솔루션을 사용하면 영구 메모리가 OS에서 별도의 NUMA 노드로 인식됩니다.
Memkind는 이 종류를 사용하는 두 가지 방법을 허용합니다:
- 첫째, 영구 메모리(persistent memory)를 사용하여 생성된 NUMA 노드를 자동으로 인식할 수 있도록 memkind 라이브러리를 허용함으로써 암묵적으로 지원합니다.
- 둘째,
MEMKIND_DAX_KMEM_NODES 환경 변수를 사용함으로써 명시적으로 지원합니다 (어떤 값을 설정해야 하는지는 memkind(3) 섹션 "ENVIRONMENT"를 참조하십시오). 이 환경 변수는 쉼표로 구분된 NUMA 노드 목록을 받으며, 해당 노드들을 영구 메모리에서 생성된 NUMA 노드로 간주하게 합니다; 이 솔루션은 첫 번째 방식을 재정의합니다.
DAX 파일 시스템
PMEM kind는 메모리 매핑 파일에서 전통적인 malloc/free 인터페이스를 지원합니다. 이를 통해 영구 메모리를 휘발성 메모리로 사용할 수 있게 하는데, 이는 영구 메모리의 특정 영역이 애플리케이션에 유용하지만, 애플리케이션이 해당 데이터가 반드시 영구적일 필요는 없는 경우입니다. PMEM kind는 Direct Access 스토리지인 DAX와 함께 사용될 때 가장 유용합니다. DAX는 시스템 페이지 캐시를 통해 페이징되지 않고 로드/스토어 접근을 지원하는 메모리 주소 지정 가능한 영구 스토리지입니다.
memkind 라이브러리를 사용하는 애플리케이션은 데이터 배치를 관리할 수 있습니다:
| 데이터 배치 | 메모리 종류 |
|---|
| PMEM (fsdax) | PMEM kind |
| ... | |
| 현재, PMEM kind는 jemalloc 힙 매니저에 의해서만 지원됩니다. | |
kind의 감지 메커니즘
memkind의 주목할 만한 기능 중 하나는 이전에 할당된 메모리의 정확한 종류를 감지하는 것입니다.