NVMe 2.0 버전이 출시되면서 ZNS(Zoned Namespace)라는 새로운 개념이 도입되었습니다. NVMe 입장에서만 새로운 개념이지, 비슷한 개념으로 이미 SMR(Shingled Magnetic Recording) HDD에 도입된 ZBC(Zoned Block Command)가 존재합니다. ZNS는 이러한 개념을 기반으로 NVMe 2.0 스펙에 새롭게 추가된 것입니다. 그럼 먼저 ZNS가 무엇인지에 대해 알아보도록 하겠습니다.

ZNS란?

ZNS는 Zoned Namespace의 약자로 연관성 있는 데이터 그룹을 Zone이라는 이름 공간으로 추상화한 것입니다. 즉 기존 데이터 저장 단위인 블록들을 기존 SSD의 임의 쓰기(Random Write) 방식이 아닌, 특정 Zone에 유사한 데이터 스트림을 순차 쓰기(Sequential Write) 하는 것이 특징입니다.

그렇다면 왜 NVMe에 ZNS 개념이 도입되었을까요?

 

NVMe에 ZNS가 도입된 이유는?

Alt text

<기존 SSD와 ZNS SSD의 데이터 저장 구조>

 

위 그림처럼 기존 SSDZNS SSD는 데이터 저장 방식에 있어서 차이가 있습니다.

기존 SSD는 단일 블록에 여러 종류의 데이터를 입력하는 임의 쓰기(Random Write) 방식을 사용했습니다. 문제는 데이터를 삭제할 때 발생하는데, 플래시 메모리(Flash Memory)로 구성된 SSD의 덮어쓰기가 불가능하다는 특성 때문입니다. 데이터 삭제 시, 삭제된 데이터에 해당하는 페이지는 재사용될 수 없는 페이지로 표시되어 공간을 차지하게 됩니다.

이에 대한 해결책으로 기존 SSD는 재사용될 수 없는 페이지들을 효율적으로 관리하기 위해 가비지 컬렉션(Garbage Collection) 방식을 사용했습니다. 하지만, 이는 재사용될 수 없는 페이지가 포함된 블록 내에서 유효 데이터를 찾기 위한 읽기 및 다른 블록으로 옮겨 쓰기 위한 쓰기 작업 유발시킵니다. 즉 불필요한 I/O인 쓰기 증폭이 발생합니다. 그만큼 SSD의 수명이 짧아질 수밖에 없는데, 이러한 단점을 보완하기 위해 ZNS가 도입되었습니다.

ZNS SSD는 특정 Zone에 대한 순차 쓰기 방식을 사용합니다. 호스트에 의해 관리되며, 데이터의 삭제 단위가 Zone으로 기존 SSD에서 발생했던 문제인 가비지 컬렉션으로 인한 불필요한 I/O가 발생하지 않습니다. 이로 인해 쓰기 증폭의 발생이 줄어들며, SSD 내부 저장 공간 관리의 필요성이 적어지므로 오버 프로비저닝의 비율을 줄일 수 있습니다.

 

오버 프로비저닝이란?

덮어쓰기가 불가능한 SSD는 가용 공간이 적을 때 특정 셀에 데이터의 쓰기가 집중될 수 있습니다. 오버 프로비저닝은 이러한 현상을 방지하기 위해, SSD에 용량의 일정 부분을 여분 공간으로 할당하는 기술입니다.

ZNS가 어떻게 기존 SSD의 단점을 보완할 수 있는지에 대해 ZNS 세부 스펙을 통해 알아볼까요?

 

Zone Specification

ZNS 스펙에 대해 알아보기에 앞서, NVMe 프로토콜은 적합한 I/O 명령어 집합을 어떻게 식별하여 사용할까요?

 

I/O Command Interpretation

아래 그림은 NVMe에서 사용하는 공통 명령어 형식입니다.

Alt text

<NVMe 명령어 집합 포맷>

 

컨트롤러는CID(Command Identifier) 필드를 통해 어떤 명령어 집합을 사용할 것인지 식별합니다. 그리고 NSID 필드의 값에 따라 특정 이름 공간에 대한 명령어 집합을 사용할 수 있습니다. 최종 식별된 명령어 집합의 명령어는 Opcode 필드로 구분하여 사용할 수 있습니다.

 

ZNS 명령어 집합

ZNS 명령어 집합에 대해 알아보기에 앞서, ZNS 명령어 집합이 어떤 속성을 사용하여 Zone을 핸들링 하는지 알아보겠습니다.

 

Zone Attributes

Zone Attributes는 Zone 명령어 집합 필드에 사용되는 속성들입니다.

  • Zone Type
    Zone에 데이터 I/O를 위한 룰로, 2h 값이면 순차 쓰기가 요구됨을 의미합니다.
  • Zone State
    각 Zone은 상태 집합으로 구성된 상태 시스템과 연결되어 있으며, 해당 Zone의 작동 특성을 정의합니다.
  • WP(Write Pointer)
    해당 Zone에서 write 할 수 있는 논리 블록 주소의 포인터를 정의합니다.
  • ZSLBA(Zone Start Logical Block Address)
    각 Zone의 가장 낮은 논리 블록 주소를 정의합니다.
  • Zone Capacity
    각 Zone의 write 할 수 있는 논리 블록의 총량을 정의합니다.
  • Zone Descriptor Extension Valid
    해당 Zone과 연결된 유효 데이터가 있는지를 정의합니다.
  • Reset Zone Recommended
    컨트롤러가 해당 Zone을 리셋하도록 정의합니다.
  • Finish Zone Recommended
    컨트롤러가 해당 Zone을 완료하도록 권장함을 정의합니다.
  • Zone Finished by Controller
    해당 Zone이 완료되었음을 정의합니다.

 

ZNS 명령어는 위의 속성들을 사용하여 Zone을 핸들링합니다. 그렇다면 어떤 ZNS 명령어가 있는지 알아보겠습니다. ZNS 명령어의 종류는 Zone Append, Zone Management Send, Zone Management Receive의 총 3가지가 있습니다.

 

1. Zone Append

Zone Append 명령어는 Zone의 ZSLBA(Zone Start Logical Block Address) 필드에 표시된 I/O 컨트롤러에 데이터 및 메타데이터를 기록하는 명령어입니다. 즉 데이터를 기록할 때, 해당 Zone의 가장 낮은 논리 블록 주소를 WP로 지정하는 방식입니다. WP는 자동으로 조정되며, 이는 여러 개의 쓰기 작업이 동시에 실행될 수 있음을 의미합니다. 쓰기가 완료되면 컨트롤러는 명령 CQE(Completion Queue Entry)를 I/O 완료 대기열에 게시합니다. 최종적으로 명령이 성공적으로 완료되면, 데이터가 포함된 가장 낮은 LBA가 반환됩니다.

기존 NVMe SSD 방식에서 활용된 데이터를 기록 방법인 Write 명령어 방식은 WP를 명시적으로 알려줘야 했습니다. 쓰기 명령 제출 시, WP의 싱크가 맞지 않으면 순차 쓰기 요구사항 위반으로 오류가 발생할 수 있습니다. Zone Append 명령어를 통해 이러한 문제점을 보완할 수 있습니다.

그럼 실제로 데이터가 저장될 때, WriteZone Append 방식은 어떻게 데이터를 처리하는지에 대해 예시를 통해 한 번 알아볼까요?

Alt text

<Write & Zone Append 예시>

 

위 그림은 Write 방식과 Zone Append 방식의 동작을 잘 보여주는 예시로, 데이터는 A -> B -> C 순차적으로 입력된다고 가정합니다.

  • Single Queue
    WriteZone Append 두 방식 모두 안전한 쓰기 작업이 가능합니다.
  • Multi Queue
    WP를 명시적으로 입력 받는 Write 방식은 입력된 데이터의 WP가 현재 가리키고 있는 WP가 아닐 경우, 다른 데이터가 쓰여질 때까지 대기해야합니다. 이러한 문제로 인해, 실행 오버헤드가 발생할 수 있습니다.
    반면, Zone Append 방식은 입력된 데이터의 WP를 Zone의 가장 낮은 논리 블록 주소로 지정합니다. 장치 컨트롤러에 의해 WP는 자동 조정되며, 여러 개의 쓰기 작업이 동시에 실행될 수 있습니다. 하지만 순차적으로 입력된 데이터는 순서대로 Zone에 쓰여지지 않을 수 있습니다.

 

2. Zone Management Send

Zone Management Send 명령어는 여러 Zone의 action 수행에 대한 제어를 요청하는 작업을 정의합니다. 여기서 action 수행은 Zone Send Action 필드가 담당합니다. 여기서 action 수행을 통해 Zone 상태가 변환되는데요, 그렇다면 Zone 상태 기계에 대해 먼저 알아보도록 하겠습니다.

 

Zone 상태 기계

아래 그림은 데이터가 Zone에 쓰일 때, 시스템에 의해 변화하는 각 Zone의 상태들을 나타냅니다. Alt text

<Zone 상태 기계>

 

Zone의 상태를 크게 활성 Zone, 비활성 Zone의 2가지 상태 집합으로 분류하여 정리해봤습니다.

 

  1. 비활성 Zone 상태들

    모든 Zone의 초기 상태는 ZSE:Empty이며, 나머지는 Zone의 활동에 따라 변하는 고유 상태입니다.

    • ZSE:Empty
      Zone에 데이터가 비어있음을 의미하고 WP(Write Pointer)는 해당 Zone의 첫 번째 LBA입니다.
    • ZSF:Full
      Zone에 데이터가 가득 찼음을 의미하고, WP(Write Pointer)는 해당 Zone의 마지막 LBA입니다.
    • ZSRO:ReadOnly
      수명이 다한 상태로, Zone 용량 중 일부가 작동을 중지한 후에도 호스트가 해당 Zone에 대한 이름 공간을 계속 사용할 수 있습니다
      (ex: copy, ZSO:Offline로의 상태 전환)
    • ZSO:Offline
      수명이 다한 상태로, 더 이상의 상태 전환이 발생할 수 없습니다.
  2. 활성 Zone 상태들

    최대 활성화될 수 있는 리소스는 제한되며, 다음과 같은 상태가 있습니다.

    • ZSIO:Implicitly Opened
      Write 명령어를 실행하여 암시적으로 오픈된 상태이며, 오픈 할 수 있는 리소스가 포화 상태일 경우, 호스트의 Open Zone 명령어에 의해 우선순위가 밀려 닫힐 수 있습니다.
    • ZSEO:Explicitly Opened
      open 명령어를 명시적으로 실행하여 오픈된 상태이며, 호스트 소프트웨어에 의한 Close 명령어를 통해서만 닫힐 수 있습니다.
    • ZSC:Closed
      암시적 오픈을 통한 해당 Zone의 쓰기 용량이 모두 채워졌거나, Close 명령어를 통한 리소스 해제되었음을 의미합니다.

 

Zone은 Zone 상태 기계를 기반으로 상태가 변환되는데요, Zone의 action 수행을 통해 Zone의 상태를 변환시키는 명령어에 대해 분석해보겠습니다.

 

ZSA(Zone Send Action)

Zone의 실질적인 action 수행을 위한 작업으로, Zone 상태 전환을 위해 직접적으로 사용되는 Byte 필드입니다. ZSA는 Zone의 상태를 어떻게 변환시킬까요? ZSA가 수행하는 Zone의 첫 번째 논리 블록 주소(SLBA - Start Logical Block Address)이 명시된 경우만 한 번 살펴보겠습니다.

  • Close Zone
    해당 Zone이 Open 상태라면, Zone을 ZSC:Close 상태로 전환시킵니다.
  • Finish Zone
    수명이 남아 있다면, 해당 Zone을 ZSF:Full 상태로 전환시킵니다.
  • Open Zone
    명시 Open 명령어로, 수명이 남아 있다면 ZSEO:Explicitly Opened 상태로 전환시킵니다.
  • Reset Zone
    수명이 남아있다면, 해당 Zone은 ZSE:Empty 상태로 전환시킵니다.
  • Offline Zone
    ZSRO:ReadOnly 상태라면, ZSO:Offline 상태로 전환시킵니다.
  • Set Zone Descriptor Extension
    ZSE:Empty 상태라면, ZSC:Closed 상태로 전환시킵니다.

 

그렇다면, 위의 상태도에 따라 실제로 드라이브에 데이터가 쓰여질 때 Zone의 상태는 어떻게 변할까요?

 

상태 전환 사이클 예시
  1. 일반적으로 새 드라이브의 초기 상태는 ZSE:Empty 상태입니다.
  2. ZSE:Empty 상태에서 Write 명령어와 같은 쓰기 명령어를 통해 Zone이 Open되는 경우, 자동으로 ZSIO:Implicitly Opened 상태로 전환됩니다.
    호스트에 의한 Open Zone 명령어를 통해, ZSE:Empty, ZSIO:Implicitly Opened 상태는 ZSEO:Explicitly Opened 상태로 전환될 수도 있습니다.
    Open 명령어를 통한 명시 오픈 상태인 ZSEO:Explicitly Opened는 호스트에 의한 Close Zone 명령어를 통해서만 ZSC:Closed 상태로 전환될 수 있습니다.
  3. 용량이 모두 채워지면, 자동으로 ZSC:Closed 상태로 전환됩니다.
  4. ZSC:Closed 상태는 Zone Send Action의 Finish Zone 명령 또는 Zone Active ExcursionFinish Zone Recommended 속성에 의해 ZSF:Full 상태로 전환되어 최종 완료 처리됩니다.

 

3. Zone Management Receive

Zone Management Receive 명령어는 Zone에 대한 정보(Zone Type, Zone State, Zone Attributes 등)가 포함된 데이터 버퍼를 반환합니다. 반환된 데이터를 통해 해당 Zone에 대한 정보를 알 수 있습니다. 주로 호스트가 Zone의 상태 전환을 결정하기 위해 이 명령어를 사용합니다. 또한, Zone Receive Action 필드를 통해 Zone의 어떤 정보를 불러올지에 대해 선택할 수 있습니다.

ZRA(Zone Receive Action)

해당 필드는 위에 설명한 Zone Descriptor Attributes 데이터 구조를 포함한 모든 Zone 대한 Descriptor에 접근할 수 있도록 설정할 수 있습니다.

 

마무리

지금까지 ZNS 명령어 집합에 대하여 자세히 알아보았는데요, NVMe ZNS 기술은 우리가 사용해왔던 SSD에 안정성 및 효율성을 제공합니다. 앞으로 더 좋은 기술이 나오기를 고대하며 포스팅을 마무리하겠습니다.

 

출처