쓰기 증폭(Write Amplification)은 Flash 기반 SSD, NAND 메모리, 로그 구조 파일 시스템에서 필수적인 과정인 Garbage Collection(GC)으로 인해 발생하는 현상이다.
GC는 스토리지 내부에서 벨리드한 데이터를 재배치하고 삭제된 데이터를 정리하여 새로운 쓰기 공간을 확보하는 과정이다. 이 과정에서 사용자가 요청한 데이터 쓰기보다 더 많은 블럭이 내부적으로 쓰이게 되는데, 이를 쓰기 증폭이라고 한다. 즉, 한 번의 사용자 쓰기 요청이 여러 번의 추가 쓰기를 유발하는 것이다.
쓰기 증폭이 발생하는 주요 원인은 두 가지!
첫 번째는 Garbage Collection 과정이다. 스토리지는 데이터를 세그먼트 단위로 관리하는데, 가비지 블럭이 포함된 세그먼트가 GC 대상으로 선택되면 벨리드한 블럭을 새로운 세그먼트로 복사한 후 원래 세그먼트를 삭제한다. 이 과정에서 삭제 대상이 아닌 벨리드한 블럭을 새로운 위치로 옮겨야 하기 때문에 추가적인 쓰기가 발생한다.
두 번째 원인은 Out-of-Place Write 방식이다. SSD와 로그 구조 기반 머지 트리 데이터베이스는 기존 데이터를 덮어쓰지 않고 새로운 위치에 데이터를 기록한다. 기존 데이터를 수정하는 것이 아니라 새로운 블럭에 데이터를 기록하는 방식이므로, 일정 주기마다 GC를 실행하여 불필요한 블럭을 정리해야 한다. 따라서 새로운 데이터가 기록될 때마다 불필요한 데이터도 함께 이동하게 되어 쓰기 증폭이 발생한다.
쓰기 증폭의 영향을 정량적으로 측정하는 대표적인 지표는 Write Amplification Factor(WAF)이다. WAF는 사용자가 요청한 데이터 쓰기뿐만 아니라 GC로 인해 발생한 추가 쓰기를 포함하여 전체적인 쓰기 증폭의 정도를 나타낸다.
WAF= (User Writes+GC Writes) / (User Writes)
사용자가 요청한 쓰기량(user writes) 대비 실제로 스토리지에 기록된 전체 쓰기량(user writes + GC writes)의 비율을 나타낸다.
내가 의문을 가졌던 것처럼 (Total - User Writes = GC Writes) / (User Writes) 형태로 계산하면 왜 안 될까?
총 블럭 수에서 사용자가 요청한 블럭 수를 단순히 빼면 GC로 인해 발생한 추가 쓰기량만 계산할 수 있지만, 이는 전체적인 쓰기 증폭을 평가하는 지표로 적절하지 않다. WAF는 절대적인 GC 비용이 아니라 시스템이 경험하는 전체적인 쓰기 증폭의 비율을 표현하는 개념이기 때문에 유저가 요청한 블럭 수 대비 전체적으로 발생한 쓰기의 비율을 측정해야 한다.
예
사용자가 100 블럭을 썼고 GC가 50 블럭을 추가로 썼다면 스토리지에 기록된 총 블럭 수는 150이 된다.
이때 WAF는 (100 + 50) / 100 = 1.5가 된다.
반면, 총 블럭 수에서 사용자 블럭 수를 빼서 계산하면 GC로 인해 발생한 추가 쓰기량만 50이 도출될 뿐, 전체적인 쓰기 증폭이 얼마나 심각한지를 파악하기 어렵다.
따라서 WAF는 총 블럭 수를 사용자가 요청한 블럭 수로 나누는 방식으로 정의된다.
쓰기 증폭이 높아지면 스토리지의 성능이 저하되고, 내구성이 감소하며, I/O 병목 현상이 발생할 가능성이 커진다.
그래서 쓰기 증폭을 줄이기 위해 몇 가지 최적화 방법이 사용된다. Garbage Collection을 최적화하여 불필요한 데이터 이동을 최소화하는 방식이 있다.
웨어 레벨링 기법을 적용하면 특정 블럭이 과도하게 사용되는 현상을 방지할 수 있고, 벨리드한 데이터 밀도를 높여 불필요한 데이터 복사를 줄일 수 있다.
Out-of-Place Write를 최소화하는 방법도 있다. 로그 구조 기반 쓰기 방식을 개선하여 GC가 자주 실행되지 않도록 데이터를 배치할 수 있으며, 데이터 압축을 활용하여 동일한 공간에 더 많은 데이터를 저장하면 GC 부담을 줄일 수 있다.
Over-Provisioning을 적용하면 GC가 실행될 수 있는 여유 공간을 확보할 수 있어 WAF를 감소시키는 데 도움을 줄 수 있다.
'[ Laboratory ] > System Software & Storage' 카테고리의 다른 글
The Importance of Data Placement Policies in Reducing Write Amplification Caused by Garbage Collection (GC로 인한 쓰기 증폭 완화 측면에서의 데이터 배치 정책 중요성) (0) | 2025.02.28 |
---|---|
GC (Garbage Collection) 최적화 기법 (CAT, AutoStream, MiDA, SepBIT, MiDAS) (2) | 2025.02.28 |
[I/O] I/O Software Stack of High Performance Computing Systems (0) | 2024.11.22 |
[SPDK/NVMe] NVMe PCI 버스 인식 문제 ( nvme list에 보이지 않음 ) (2) | 2024.10.10 |
[SPDK/examples] nvme/hello_world 예제 수정 및 실행 (1) | 2024.10.10 |
[SPDK/examples] spdk/build/examples 하위 예제 파일 실행하기 (0) | 2024.10.10 |
[SPDK] spdk 빌드 및 example 실행 (4) | 2024.10.10 |