28장. 영구 메모리: NVDIMMs
스토리지 클래스 메모리라고도 하는 영구 메모리(
pmem
)는 메모리와 스토리지의 조합입니다. PMEM은
스토리지 내구성과 낮은 액세스 대기 시간 및 높은 대역폭의 DRAM(Dynamic RAM)을 결합합니다.
- 영구 메모리는 바이트 주소 지정 가능이므로 CPU 로드 및 저장 지침을 사용하여 액세스할 수 있습니다. 기존 블록 기반 스토리지에 액세스하는 데 필요한
read()
또는write()
시스템 호출 외에도pmem
에서는 직접 로드 및 저장 프로그래밍 모델도 지원합니다. - 영구 메모리의 성능 특성은 일반적으로 10과 수백의 나노초에서 매우 낮은 액세스 대기 시간이 있는 III와 유사합니다.
- 영구 메모리의 콘텐츠는 전원이 꺼져 있을 때 스토리지처럼 보존됩니다.
영구 메모리 사용은 다음과 같은 사용 사례에 유용합니다.
- 신속한 시작: 데이터 세트가 이미 메모리에 있습니다.
- 빠른 시작은 웜 캐시 효과라고도 합니다. 시작 후 파일 서버에 메모리의 파일 콘텐츠가 없습니다. 클라이언트가 데이터를 연결하고 읽을 때 해당 데이터는 페이지 캐시에 캐시됩니다. 결국 캐시에는 주로 핫 데이터가 포함됩니다. 재부팅 후 시스템이 프로세스를 다시 시작해야합니다.영구 메모리를 사용하면 애플리케이션이 제대로 설계된 경우 재부팅 후에도 애플리케이션이 웜 캐시를 유지할 수 있습니다. 이 경우 페이지 캐시가 연결되지 않습니다. 애플리케이션은 영구 메모리에서 직접 데이터를 캐시합니다.
- 빠른 쓰기 캐시
- 파일 서버는 데이터가 내구성 있는 미디어에 있을 때까지 클라이언트의 쓰기 요청을 확인하지 않는 경우가 많습니다. 영구 메모리를 빠른 쓰기 캐시로 사용하면 파일 서버에서
pmem
의 짧은 대기 시간으로 인해 쓰기 요청을 신속하게 승인할 수 있습니다.
NVDIMMs Interleaving
비 Volatile Dual In-line Memory Module (NVDIMMs)은 일반 DASD와 동일한 방식으로 인터리브 세트로 그룹화할 수 있습니다. 인터리브 세트는 여러 DIMM에 RAID 0(stripe)과 같습니다.
다음은 NVDIMMS 상호 작용의 이점입니다.
- NVDIMM과 마찬가지로 NVDIMM은 interleave 집합으로 구성될 때 성능을 향상시킬 수 있습니다.
- 여러 개의 작은 NVDIMM을 하나의 더 큰 논리 장치로 결합하는 데 사용할 수 있습니다.
시스템 BIOS 또는 UEFI 펌웨어를 사용하여 상호 집합을 구성합니다.
Linux에서는 interleave 세트별로 하나의 지역 장치가 생성됩니다.
다음은 리전 장치와 레이블 간의 관계입니다.
- ECDHENVDIMMs에서 라벨을 지원하는 경우 지역 장치를 네임스페이스로 더 세분화할 수 있습니다.
- NVDIMMs에서 라벨을 지원하지 않는 경우 리전 장치에는 단일 네임스페이스만 포함할 수 있습니다. 이 경우 커널은 전체 리전을 다루는 기본 네임스페이스를 생성합니다.
영구 메모리 액세스 모드
섹터
,fsdax
,devdax
(device direct access) 또는 raw
모드에서 영구 메모리 장치를 사용할 수 있습니다.
섹터
모드- 스토리지를 빠른 블록 장치로 제공합니다. 섹터 모드를 사용하면 영구 메모리를 사용하도록 수정되지 않은 레거시 애플리케이션 또는 장치 매퍼를 포함하여 전체 I/O 스택을 사용하는 애플리케이션에 유용합니다.
fsdax
모드- 이를 통해 영구 메모리 장치는 SNIA(Storage Networking Industry Association) NVMe( Non-Volatile Memory) 프로그래밍 모델 사양에 설명된 대로 직접 액세스 프로그래밍을 지원할 수 있습니다. 이 모드에서는 I/O가 커널의 스토리지 스택을 무시하고 많은 장치 매퍼 드라이버를 사용할 수 없습니다.
devdax
모드devdax
(device DAX) 모드는 DAX 문자 장치 노드를 사용하여 영구 메모리에 대한 원시 액세스를 제공합니다.devdax
장치의 데이터는 CPU 캐시 플러시 및 펜싱 명령을 사용하여 내구성을 유지할 수 있습니다. 특정 데이터베이스 및 가상 머신 하이퍼바이저는devdax
모드의 이점을 누릴 수 있습니다. 장치devdax
인스턴스에서 파일 시스템을 만들 수 없습니다.원시
모드- 원시 모드 네임스페이스에는 몇 가지 제한 사항이 있으며 사용해서는 안 됩니다.
28.1. ndctl을 사용하여 영구 메모리 구성
ndctl 유틸리티를 사용하여 영구 메모리 장치를 구성합니다. ndctl 유틸리티를 설치하려면 다음 명령을 사용합니다.
#
yum install ndctl
절차 28.1. 라벨을 지원하지 않는 장치에 대한 영구 메모리 구성
- 시스템에서 사용 가능한
pmem
리전을 나열합니다. 다음 예에서 명령은 레이블을 지원하지 않는 NVDIMM-N 장치를 나열합니다.#
ndctl list --regions [ { "dev":"region1", "size":34359738368, "available_size":0, "type":"pmem" }, { "dev":"region0", "size":34359738368, "available_size":0, "type":"pmem" } ]Red Hat Enterprise Linux는 NVDIMM-N 장치가 레이블을 지원하지 않기 때문에 각 지역에 대해 기본 네임스페이스를 생성합니다. 따라서 사용 가능한 크기는 0바이트입니다. - 시스템의 모든 비활성 네임스페이스를 나열합니다.
#
ndctl list --namespaces --idle [ { "dev":"namespace1.0", "mode":"raw", "size":34359738368, "state":"disabled", "numa_node":1 }, { "dev":"namespace0.0", "mode":"raw", "size":34359738368, "state":"disabled", "numa_node":0 } ] - 이 공간을 사용하도록 비활성 네임스페이스를 재구성합니다. 예를 들어 DAX를 지원하는 파일 시스템에 namespace0.0 을 사용하려면 다음 명령을 사용합니다.
#
ndctl create-namespace --force --reconfig=namespace0.0 --mode=fsdax --map=mem { "dev":"namespace0.0", "mode":"fsdax", "size":"32.00 GiB (34.36 GB)", "uuid":"ab91cc8f-4c3e-482e-a86f-78d177ac655d", "blockdev":"pmem0", "numa_node":0 }
절차 28.2. 레이블을 지원하는 장치에 대한 영구 메모리 구성
- 시스템에서 사용 가능한
pmem
리전을 나열합니다. 다음 예에서 명령은 레이블을 지원하는 NVDIMM-N 장치를 나열합니다.#
ndctl list --regions [ { "dev":"region5", "size":270582939648, "available_size":270582939648, "type":"pmem", "iset_id":-7337419320239190016 }, { "dev":"region4", "size":270582939648, "available_size":270582939648, "type":"pmem", "iset_id":-137289417188962304 } ] - NVDIMM 장치가 라벨을 지원하는 경우 기본 네임스페이스는 생성되지 않으며 --force 또는 --reconfigure 플래그를 사용하지 않고 리전에서 하나 이상의 네임스페이스를 할당할 수 있습니다.
#
ndctl create-namespace --region=region4 --mode=fsdax --map=dev --size=36G { "dev":"namespace4.0", "mode":"fsdax", "size":"35.44 GiB (38.05 GB)", "uuid":"9c5330b5-dc90-4f7a-bccd-5b558fa881fe", "blockdev":"pmem4", "numa_node":0 }이제 동일한 리전에서 다른 네임스페이스를 생성할 수 있습니다.#
ndctl create-namespace --region=region4 --mode=fsdax --map=dev --size=36G { "dev":"namespace4.1", "mode":"fsdax", "size":"35.44 GiB (38.05 GB)", "uuid":"91868e21-830c-4b8f-a472-353bf482a26d", "blockdev":"pmem4.1", "numa_node":0 }다음 명령을 사용하여 동일한 리전에서 다른 유형의 네임스페이스를 생성할 수도 있습니다.#
ndctl create-namespace --region=region4 --mode=devdax --align=2M --size=36G { "dev":"namespace4.2", "mode":"devdax", "size":"35.44 GiB (38.05 GB)", "uuid":"a188c847-4153-4477-81bb-7143e32ffc5c", "daxregion": { "id":4, "size":"35.44 GiB (38.05 GB)", "align":2097152, "devices":[ { "chardev":"dax4.2", "size":"35.44 GiB (38.05 GB)" }] }, "numa_node":0 }
ndctl 유틸리티에 대한 자세한 내용은 man ndctl 을 참조하십시오.