티스토리 뷰

Linux

[Linux] Device Mapper (dm-zoned)

Gray__ 2022. 10. 28. 14:44

 

Device Mapper(디바이스 매퍼)는 virtural block device를 physical block device로 매핑하는 리눅스 커널에서 제공하는 프레임워크입니다. Device Mapper는 device mapper가 지원하는 virtural block device에서 다른 블록 장치(physical block device)로 데이터를 전달하며 작동합니다. 즉 실제 물리 블럭 디바이스에 데이터를 접근시키기 위한 인터페이스라고 할 수 있습니다.

 

ZNS SSD에 직접적으로 I/O를 실행하기 위해서는 zonefs 파일 시스템을 사용해야합니다. 그러나 현재 리눅스 컨테이너는 zonefs를 지원하지 않고 zonefs는 POSIX filesystem과 호환되지 않기 때문에 ZNS SSD에 직접적으로 I/O를 실행할 수 없습니다. 리눅스 컨테이너는 legacy application을 지원하는 EXT4 파일 시스템을 주로 사용합니다. 그러므로 리눅스 컨테이너에서 ZNS SSD로 I/O를 하기 위해 device mapper가 필요하고, 여기서 사용되는 것이 dm-zoned 입니다.

 

* zonefs: raw blockdirect I/O를 쉽게 할 수 있도록 추상화된 메서드를 제공하고, zone을 시각화해주는 파일시스템

 

dm-zoned

dm-zoned는 virtural block device가 zoned block device에 대해 random write를 할 수 있는 기능을 제공합니다. ZNS SSD는 sequential write만 처리할 수 있는 제약을 가진 장치이기 때문에, dm-zoned는 사용자가 sequential write의 제약을 갖지 않고 일반적인 raw block device에 접근하는 것 처럼 random write를 지원합니다. 이를 통해 zone block device를 지원하지 않는 애플리케이션이나 파일시스템을 제약없이 사용할 수 있습니다.

 

 

dm-zoned 구조

dm-zoned가 동작하는 방법을 알아보기 전에 dm-zoned가 어떻게 구성되는지 이해하는 것이 중요합니다. ZNS SSD는 sequential wirte만 지원하는 것으로 알고 있는데 어떻게 random write를 진행하는 것일까요? ZNS SSD에 random write data를 저장하기 위해, 별도의 regular block device를 두고 하나의 regular bock device에 random write data를 저장합니다. 즉 2개의 device(Regular SSD, ZNS SSD)를 이용해 random write, sequential write 데이터들을 각각 저장합니다. Random write data가 저장되는 zone을 Conventional Zone, sequential write data가 저장되는 zone을 Sequential Zone이라고 하고 conv, seq zone이라고 줄여서 명칭하기도 합니다.

 

fdisk -l 명령어를 이용해 현재 시스템의 디스크를 조회한 사진입니다. /dev/nvme0n1 디스크는 ZNS SSD, /dev/sdb/는 Regular SSD입니다. Regular SSD를 Conv로 사용하기 위해서는 device mapper formatting 하기 전 파일 시스템, 마운트가 되지 않은 초기 상태여야 합니다.

 

Dm-zoned device mapper를 적용한 사진입니다. Zone의 타입은 conventional, sequential zone 2가지로 구분하며 conv zone에는 metadata zone, data zone, buffer zone 3가지의 zone이 존재하고, seq zone에는 data zone 하나만 존재합니다. Zone 1개 크기가 128MB라고 하고 ZNS SSD의 용량이 16GB라고 할 때, 128개의 seq zone이 생성됩니다. Random write를 위한 SSD의 용량이 512MB라고 할 때 conv zone은 4개가 생성되고 conv + seq zone = 총 132개의 zone을 이용한다는 것을 알 수 있습니다.

 

Dm-zoned device mapper를 적용한 후 fdisk롤 조회한 모습입니다. /dev/mapper/dmz-hd1 의 디스크가 새로 생성됨을 알 수 있습니다. 512MB와 16GB 크기의 합이 15.9GB로 표시되는 이유를 정확히 모르겠지만, 여러 docs를 찾아보며 생각해봤을 때 저널링 과정에서 사용되는 영역이 존재하기 때문에 일정 부분을 제외하고 표시된다고 생각합니다.

 

dm-zoned 구조

 

Dm-zoned는 Logical Device LBA라는 매핑 테이블을 가지고 동작합니다. LBA에서 구분되어 있는 하나의 덩어리를 chunk라고 합니다. 여기서 chunk의 크기는 zone 1개의 크기와 항상 동일합니다. Chunk를 이용하여 해당 chunk로 들어오는 I/O(BIO)의 sector 값을 계산해 sector 값에 해당하는 zone에 I/O를 실행합니다. Write에 종류에 따라 random write, direct write로 분기 되고, random write는 conv zone에, sequential write는 seq zone에 각각 I/O가 실행됩니다.

 

Conv zone에 write된 데이터도 최종적으로는 seq zone에 write가 되어야합니다. Conv zone은 random write 되는 데이터를 일시적으로 저장하는 buffer의 역할을 하며, conv zone 용량이 다 찬 경우 비어있는 seq zone으로 데이터를 이동시킵니다. 이 과정을 reclaim 이라고 합니다.

 

 

dm-zoned은 크게 4가지 루틴으로 동작합니다.

 

1. Conventional Zone mapping

- chunk가 Conv zone에 매핑되어 있고, 해당 chunk에 write 요청이 된 경우입니다. Random write 가능한 zone이므로 바로 write할 수 있습니다.

 

2. Sequential Zone mapping

- chunk가 Seq zone에 매핑되어 있고,해당 chunk에 write 요청이 된 경우 중, chunk의 write 포인터와 zone write 포인터가 일치하는 경우입니다. Sequential write는 chunk의 write 포인터와 zone의 write 포인터가 일치하는 경우에만 실행됩니다. 그러므로 두 포인터가 동일한 경우 write를 실행하고, 그렇지 않으면 3번 과정으로 넘어가 처리됩니다.

 

 

3. Dual Conventional-Sequential Zone mapping

- chunk가 Seq zone에 매핑되어 있고,해당 chunk에 write 요청이 된 경우 중, chunk의 write 포인터와 zone write 포인터가 일치하지 않는 경우입니다. Convetional zone을 임시로 해당 chunk에 매핑하여 write를 수행합니다. Sequential data zone + buffer zone이 여기에 해당됩니다.

 

 

4. Random Zone reclaim

- Conv zone의 여유 공간이 부족한 경우 reclaim을 수행합니다. Conv zone의 데이터를 free seq zone으로 copy합니다. 일종의 garbage collection 과정에 해당하며, reclaim이 끝날 경우, conv zone과 chunk의 매핑을 해제하고 seq zone과 chunk의 매핑정보를 업데이트합니다.

 

 

Device mapper의 역할과 dm-zoned 구조, 원리에 대해 간단하게 알아보았습니다. 다음 포스팅에는 zonefs를 이용해 zns ssd를 접근하며 겪었던 과정과, dm-zoned 코드를 이용해 dm-zoned에서 I/O 루틴과 해당 과정에서 사용되는 함수들에 대해 코드 레벨로 분석한 내용을 소개하겠습니다 !

댓글