개발자를 위한 SSD (Coding for SSD)

김지섭·2023년 5월 24일
0

이 문서는 https://tech.kakao.com/2016/07/14/coding-for-ssd-part-2/의 내용을 읽고 이해한 내용을 정리한 것입니다.


SSD의 구조

출처: https://tech.kakao.com/2016/07/14/coding-for-ssd-part-2/


NAND 특징 및 종류

  1. HDD와 달리 물리적인 기계 장치가 없다.
    하드디스크는 플래터를 회전시키며 헤드를 정확한 위치에 위치시켜 읽기/쓰기를 하는 물리적인 구조를 가진 반면, SSD는 모든 부분이 전자 장치로 이루어져 있습니다.
  2. 수명이 제한적이다.
    읽기와 쓰기의 사이클마다 일부 전자가 오류로 인해 트랜지스터에 갇히게 됩니다. 그 전자가 일정 수준을 넘어서면 수명이 다하게 됩니다.
  3. 쓰기 성능이 읽기 성능에 비해 떨어진다.
    쓰기 작업은 블록 삭제 작업이 필요한 경우가 있는데, 삭제 작업은 페이지가 아닌, 더 큰 단위인 블록으로 이루어지기 때문에, 시간이 더 소요될 수 있습니다.

벤치마크 파라미터

  • 워크로드 타입
    1. 읽기 / 쓰기
    2. 랜덤 / 시퀀셜
    3. 읽기쓰기 비율
  • 큐 너비(Queue Depth)
    SSD 드라이브로 읽고 쓰기 명령을 전송하는 동시 쓰레드의 개수를 의미합니다.
    큐 길이(Queue Length)와 동일한 개념입니다.
  • 청크의 크기
    한번에 읽거나 쓰려고 하는 단위입니다. (4 KB, 8 KB, 기타..)

벤치마크 결과 지표

  • 스루풋(Throughput)
    데이터 전송 속도를 나타내는 메트릭입니다. KB/s 또는 MB/s 단위로 표시되며, 시퀀셜한 작업의 지표로 사용됩니다.

  • IOPS (Input/Output Operations Per Second)
    작업 횟수를 나타내는 메트릭이다. 주로 랜덤 읽기 및 쓰기 벤치마킹에서의 지표로 사용됩니다.

  • 레이턴시(Latency)
    입출력 작업이 시스템에 전달된 후에 응답을 받기까지 걸리는 시간을 나타내는 메트릭입니다. 일반적으로 마이크로초(μs) 또는 밀리초(ms) 단위로 표시됩니다. 높은 레이턴시는 전체 시스템 처리 속도를 느리게 만들 수 있습니다.


성능 비교

SLCMLCTLCHDDRAML1 cacheL2 cache
P/E cycles100k10k5k____
Bits per cell123____
Seek latency (μs)___9000___
Read latency (μs)25501002000-70000.04-0.10.0010.004
Write latency (μs)25090015002000-70000.04-0.10.0010.004
Erase latency (μs)150030005000____

출처: https://tech.kakao.com/2016/07/14/coding-for-ssd-part-2/


실제 비교

셀 타입도 속도에 중요하지만, 현재에 와서는 호스트 인터페이스가 속도에 주는 영향이 높습니다.

HDDIntel X25-MSamsung 840 EVORAM
Brand/ModelWestern Digital Black 7200 rpmIntel X25-M (SSDSA2MH080G1GC)Samsung (SSD 840 EVO mSATA)Corsair Vengeance DDR3
Memory cell type_MLCTLC_
Release year2013200820132012
InterfaceSATA 3.0SATA 2.0SATA 3.0_
Total capacity4 TB80 GB1 TB4 x 4 GB
Pages per block_128256_
Page size_4 KB8 KB_
Block size_512 KB2048 KB*
Sequential reads (MB/s)1852545407233
Sequential writes (MB/s)185 (100%)78 (30.70%)520 (96.29%)5872 (81.18%)
4KB random reads (MB/s)0.54 (0.29%)23.6 (9.29%)383 (70.92%)5319 (73.53%) **
4KB random writes (MB/s)0.85 (0.45%)11.2 (4.40%)352 (65.18%)5729 (79.20%) **
4KB Random reads (KIOPS)0.14698105
4KB Random writes (KIOPS)0.222.890102

출처: https://tech.kakao.com/2016/07/14/coding-for-ssd-part-2/


상황 별 주요 지표

  1. 수많은 파일을 조금씩 업데이트하는 상황
    이 경우 IOPS 성능이 중요합니다. 스루풋이 높아도 IOPS 성능이 낮으면 랜덤 작업 처리가 느려 시스템이 전체적으로 느린 것처럼 느껴질 수 있습니다.
    ex) Logging System, 복잡한 폴더 구조를 가진 파일의 이동

  2. 대용량 파일을 순차적으로 읽거나 쓰는 상황
    이 경우 IOPS보다 스루풋 성능이 중요합니다. 시퀀셜 읽기 및 쓰기 속도가 중요한 상황입니다.
    ex) 동영상 편집, 대용량 백업

  3. 동시에 여러 작업을 수행하는 상황
    이 경우 레이턴시와 IOPS 성능이 중요합니다. 작업들이 빠르게 실행되어야 하므로, 낮은 레이턴시와 높은 IOPS 성능을 가진 SSD를 선택하는 것이 좋습니다.

  4. 가상화 또는 DBMS 구동중인 상황
    많은 응용 프로그램에서 자주 액세스 할 때, 레이턴시, IOPS 성능 및 스루풋이 모두 중요합니다.


Pre-conditioning

20~40분 시점부터 쓰기 성능이 급격히 하강합니다. 지속되는 랜덤 쓰기로 인하여 수많은 페이지들이 Stale 상태가 되고, GC가 이를 처리하기 위하여 오버로드가 발생합니다.

출처: https://tech.kakao.com/2016/07/14/coding-for-ssd-part-2/


셀, 페이지, 블록

셀(Cell)

플래시 메모리에서 가장 작은 단위로, SLC는 1비트, MLC는 2비트, TLC비트는 3비트를 저장할 수 있습니다.

페이지(Page)

셀들로 구성된 논리적인 데이터의 단위입니다. 페이지는 2KB, 4KB, 8KB 등의 크기를 가질 수 있으나, 일반적으로 4KB 크기를 가집니다. 페이지는 데이터를 저장하기 위한 단위이며, 페이지 안에 여러 개의 셀이 사용됩니다. 페이지는 상태를 가지고 있으며, 상태는 아래에 설명될 FTL의 맵핑 테이블에 저장됩니다.

블록(Block)

페이지들의 묶음입니다. 일반적으로 128개 또는 256개의 페이지를 하나의 블록으로 묶습니다. 블록은 SSD에서 데이터를 읽고 쓰는 최소한의 단위가 되며, 블록 단위로 삭제, 복사, 이동 등의 작업이 이루어집니다. SSD에서 데이터를 쓰는 경우, 블록을 모두 사용한 후 새로운 블록에 데이터를 씁니다. 따라서, 블록의 수명이 다한 경우 SSD는 더 이상 데이터를 사용할 수 없게 됩니다.

데이터는 페이지 단위로 읽고 쓰이기 때문에 작은 데이터를 읽을 때도 전체 페이지가 읽히게 됩니다. 따라서 페이지 크기는 성능과 관련된 중요한 요소 중 하나입니다. 예를 들어, 작은 데이터의 경우, 페이지 크기가 크면 읽은 데이터 중 많은 양이 불필요하게 읽게 되어 읽기 속도가 느려질 수 있습니다.

블록은 NAND 플래시 메모리의 기본 조직 단위로, 일반적으로 128, 256개 등의 연속된 페이지들의 집합입니다. 페이지는 개별 데이터를 기록하는 가장 작은 메모리 단위이며, 페이지는 블록으로 묶여 블록 단위로 삭제 작업이 수행됩니다. 이렇게 블록 구조를 사용하는 이유는 NAND 플래시 메모리의 특성과 관련된 성능 및 내구성 문제를 해결하고, 웨어 레벨링과 가비지 컬렉션과 같은 최적화 기술을 구현하기 위해서입니다. 따라서 블록은 NAND 플래시 메모리의 논리적 구성과 관리의 핵심 구성요소입니다.

페이지의 상태

  1. Free 상태
    페이지의 내용이 삭제되어 아직 새로운 데이터가 기록되지 않은 상태를 말합니다. 이 상태의 페이지들은 새로운 데이터를 저장할 준비가 되어 있는 경우입니다.

  2. Valid 상태
    페이지에 유효한 데이터가 저장되어 있는 상태를 말합니다. 이 상태의 페이지들에는 현재 사용 중인 데이터가 저장되어 있으며 데이터 읽기 작업에 사용됩니다.

  3. Stale 상태
    페이지에 이전에 기록된 데이터가 더 이상 사용되지 않게 된 상태를 말합니다. 데이터가 변경되거나 삭제되면 페이지의 내용은 새로운 'free' 상태의 페이지로 복사되고 기존 페이지는 'stale'로 표시됩니다. 이후 'garbage collection' 과정에서 stale 상태의 페이지가 삭제되어 'free' 상태로 변환됩니다.

  4. 사용 불가능 (블록 단위)
    블록이 P/E cycle 횟수 제한에 도달하여 더 이상 삭제 또는 쓰기 작업이 불가능한 상태를 말합니다. 이 상태의 블록은 데이터 저장에 사용될 수 없으며, SSD 컨트롤러는 이러한 블록을 무시하고 다른 사용 가능한 블록을 선택해야 합니다. 이 상태에 도달한 블록은 전체 SSD의 사용 가능한 공간을 감소시키며, 오랜 시간 동안 사용한 SSD의 수명이 점점 줄어들게 됩니다. 웨어 레벨링 기술을 사용하여 이러한 사용 불가능 상태에 도달하는 블록의 수를 최소화하고 전체 SSD의 수명을 극대화할 수 있습니다.

P/E cylce

NAND 플래시 메모리의 페이지에 쓰기(Program)과 삭제(Erase) 작업을 반복할 수 있는 횟수를 나타냅니다. NAND 플래시는 일정한 횟수의 프로그램 및 삭제 작업에 대해 견딜 수 있는 내구성이 있기 때문에, P/E cycle은 플래시 메모리의 수명을 결정하는 중요한 지표입니다.


오퍼레이션

1. 읽기

읽기는 페이지 단위로 실행됩니다. SSD는 작은 크기의 데이터를 요청해도 하나의 페이지를 전체적으로 읽고 필요한 데이터만 반환합니다.

2. 쓰기

쓰기 또한 페이지 단위로 실행됩니다. 쓰기 연산에는 다음 특징들이 있습니다.

  1. 쓰기를 할 데이터의 크기는 페이지 크기의 정수배로 맞춰서 실행하도록 구성
  2. 페이지 사이즈보다 작은 데이터 쓰기 피하기
  3. 작은 데이터의 쓰기는 버퍼하였다가 가득 차면 쓰도록 구성

3. 삭제

삭제는 블록 사이즈 단위로 실행됩니다. 페이지는 덮어 쓰기가 불가능하기 때문에 한번 “stale” 상태로 된 페이지는 반드시 삭제(Erase)하는 작업을 거쳐서 “free” 상태로 전이할 수 있습니다. 그러나 삭제는 단일 페이지 단위로 처리될 수 없고, 그 페이지가 포함된 블록을 통째로 삭제해야 합니다. 사용자는 읽기와 쓰기 명령만 데이터 액세스를 위해서 사용할 수 있으며, 삭제 명령은 SSD 컨트롤러가 “free” 공간이 필요할 때자동적으로 내부 명령을 실행해서 Garbage-collection을 실행할 때 사용됩니다.


페이지 덮어쓰기

NAND 플래시 메모리는 논리적으로 덮어쓰기 작업 수행이 불가능합니다. 이에 따라 덮어쓰기는 Read-Modify-Write 절차를 거치게 됩니다.

Read-Modify-Write

  1. Read (읽기): NAND 플래시 메모리에서 수정하려는 페이지의 기존 데이터를 읽어 메모리 버퍼에 저장합니다.

  2. Modify (수정): 새로 추가하거나 변경해야 할 데이터를 메모리 버퍼에 있는 기존 데이터와 결합합니다.

  3. Write (쓰기): 수정된 데이터를 다시 NAND 플래시 메모리에 쓰기 작업을 수행합니다.

  4. GC에 의해 삭제: 기존 데이터가 있던 영역은 Stale상태이기 때문에 GC에 의해서 삭제됩니다.


Write amplification

쓰려는 데이터가 페이지의 크기보다 작을 때, 페이지 크기에 맞추기 위하여 의미없는 더 많은 양의 데이터를 저장하게 됩니다.


오퍼레이션 예시

여기서 PPN(Physical Page Number)은 페이지 번호라고 이해하면 됩니다.

1. Initial Configuration

1000번 블록의 PPN=0,1,2번 페이지는 Valid, 3번 페이지의 2000번 블록의 모든 페이지는 Free 상태입니다.

2. Writing a Page

1000번 블록의 PPN=0을 x'로 업데이트하려고 하면, 비어있는 페이지인 PPN=3에 기록이 되고, PPN=0은 Stale 상태로 바뀌게 됩니다. FTL에 의해서 0번 페이지에 접근하려고 하면, 3번 페이지의 데이터를 가져오게 됩니다.

3. Erasing a Block (GC)

GC는 Stale 페이지를 제거하는 과정입니다. Block 1000의 Vaild 페이지를 Block 2000에 옮기고, Block 1000을 전체삭제 하게 됩니다.


GC (Garbage collection)

GC는 Stale 페이지를 Free 해주는 것에 목적이 있지만, NAND 셀의 특징이나 데이터의 특징에 따라 앞으로의 오퍼레이션에서 속도 저하가 발생하지 않게 해주는 역할을 하고 있습니다.

Stale to Free

SSD의 페이지는 덮어쓰기가 불가능하기 때문에, 데이터 업데이트 시 새로운 데이터를 free 페이지에 쓰고, 이전 데이터가 있는 페이지를 stale 상태로 마킹해야 합니다. Garbage collection 프로세스는 이러한 stale 페이지를 삭제하여 새로운 데이터가 쓰일 수 있는 공간을 확보합니다. 블록 삭제 작업은 시간이 오래 걸리므로, 쓰기 성능을 방해할 수 있습니다.

읽기 방해

NAND 플래시 메모리를 일정 횟수 이상으로 읽게 되면, 오류가 발생할 수 있습니다. 이를 사전에 방지하고자, 읽기 횟수에 따라 데이터를 다른 위치로 옮겨야 합니다.

콜드 데이터와 핫 데이터 분리

빈번하게 변경되는 핫 데이터와, 그렇지 않은 콜드 데이터가 한 페이지에 공존한다면, 핫 데이터 수정을 위한 Read-Modify-Write 작업 시에 콜드 데이터 또한 이동이 되게 됩니다. 또한, 읽기방해 방지를 위한 데이터 이동 시에도 필요 이상의 데이터 복사가 이루어질 수 있습니다. 콜드 데이터와 핫 데이터를 분리하여 저장하면 좋겠지만, 이는 프로그램 레벨에서 작동되기 때문에 정확한 예측이 불가능합니다.


Wear leveling

SSD의 NAND 플래시 메모리는 프로그램-삭제(P/E Cycles) 회수가 제한되어있어서 제한된 수명을 가지게 됩니다. 데이터 오퍼레이션 및 GC가 이루어짐에 따라서 각 셀간 수명 차이가 발생하게 되는데, 이를 방지하여, 모든 블록들이 P/E Cycle 한계에 동시에 도달할 수 있게 하는 기술이 Wear leveling입니다. 이를 구현하기 위하여 물리적 페이지 주소와 논리적 페이지 주소를 구분하여 적절하게 사용될 수 있도록 조정해주는 것이 FTL 입니다.


FTL (Flash Translation Layer)

HDD가 주력이던 시절, SSD는 내부적으로 전혀 다른 구조를 가지고 있었지만, HDD가 사용하는 LBA 어레이 방식처럼 동작할 수 있도록 변환해주는 레이어가 있었기 때문에 쉽게 받아들여지게 되었습니다. GC또한 FTL에서 작동되며, 그 중에서 논리적 블록 맵핑 기능을 수행하여 Wear Leveling 또한 수행합니다.

논리적 블록 맵핑

논리적인 블록 맵핑은 LBA(Logical Block Address)를 PBA(Physical Block Address)로 변환하여 저장하는 역할을 담당합니다. 이를 위한 맵핑 테이블이 SSD에 내장된 플래시 메모리에 저장되며, 전원이 켜지면 내장 RAM에 로딩됩니다.

블록 맵핑을 페이지 단위로 구성한다면 유연하게 사용이 가능하지만, 맵핑 테이블 자체가 방대하게 커지는 문제가 있기 때문에 페이지들을 다수 묶어서 블록 단위로 관리하게 됩니다. 예를 들면 한 블록이 256개의 페이지를 가지고 있다고 하면, 256배 더 적은 메모리를 필요로 하게 됩니다.

0개의 댓글