328. 가비지 컬렉션 (Garbage Collection in SSD)

핵심 인사이트 (3줄 요약)

  1. 본질: SSD의 가비지 컬렉션(Garbage Collection, GC)은 낸드 플래시(NAND Flash) 메모리의 치명적인 약점인 '덮어쓰기 불가(Erase-before-Write)' 특성 때문에 발생하는 쓰레기 데이터(Invalid Data)들을 정리하여 새로운 빈 블록(Free Block)을 확보하는 필수 유지보수 작업이다.
  2. 가치: 읽기와 쓰기는 아주 작은 '페이지(Page)' 단위로 가능하지만, 지우기는 엄청나게 큰 '블록(Block)' 단위로만 가능하기 때문에, 블록 안에 섞여 있는 유효한 데이터(Valid Page)만 새 블록으로 이사시키고 남은 구 블록 전체를 통째로 폭파(Erase)시켜 수명을 연장하고 기록 공간을 확보한다.
  3. 융합: GC 작업 중에는 엄청난 양의 데이터 복사와 지우기가 발생하여 '쓰기 증폭(Write Amplification)'과 심각한 I/O 성능 저하를 유발하므로, 운영체제가 지워진 파일의 주소를 미리 알려주는 TRIM 명령어와 결합하여 효율을 극대화하는 것이 현대 스토리지 최적화의 핵심이다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

  • 개념: 가비지 컬렉션(GC)은 SSD 내부에 숨어있는 펌웨어인 FTL(Flash Translation Layer)이 수행하는 백그라운드 청소 작업이다. 하드디스크(HDD) 시절에는 존재하지 않았던, 오직 낸드 플래시라는 반도체의 태생적 한계 때문에 생겨난 고유의 메커니즘이다.

  • 필요성: 낸드 플래시는 데이터를 덮어쓸 수 없다(No Overwrite). 1번지에 있는 데이터를 바꾸려면, 기존 1번지 데이터에 '무효(Invalid, 쓰레기)' 딱지를 붙이고, 텅 비어있는 50번지에 새 데이터를 적은 뒤 논리 주소를 연결해야 한다(Out-of-Place Update). 컴퓨터를 쓰다 보면 필연적으로 이 '무효화된 쓰레기 데이터'들이 SSD 전역에 가득 차게 된다. 이 쓰레기들을 치우지 않으면 SSD는 텅 빈 공간(Free Block)이 고갈되어 더 이상 새로운 파일을 저장할 수 없는 '쓰기 불능' 상태에 빠지게 된다.

  • 💡 비유: 노트에 연필로 글을 썼는데 지우개가 없습니다. 글씨를 고치고 싶으면 기존 글씨에 빨간 줄을 쫙 긋고(무효 처리), 뒤페이지 빈 공간을 찾아서 새 글씨를 적어야 합니다. 이 짓을 반복하다 보면 노트 전체가 빨간 줄이 그어진 쓰레기 글씨로 꽉 차게 되므로, 가끔 새 노트를 꺼내서 아직 유효한 글씨들만 예쁘게 베껴 적고 헌 노트를 불태워버리는(GC) 작업이 필요합니다.

  • 비대칭적 I/O 단위 (The Root Cause): 낸드의 비극은 읽고 쓰는 단위와 지우는 단위가 다르다는 데서 출발한다.

    • 읽기/쓰기: 4KB ~ 16KB 크기의 페이지(Page) 단위로 수행.
    • 지우기(Erase): 무조건 256개 이상의 페이지가 묶인 거대한 블록(Block, 수 MB) 단위로만 수행 가능. 이 비대칭성 때문에 페이지 하나를 지우고 싶어도 지울 수가 없어서, 필연적으로 블록 단위의 대형 이사(Migration) 프로젝트인 가비지 컬렉션이 강제된다.
┌─────────────────────────────────────────────────────────────┐
│          가비지 컬렉션(GC)의 블록 이사 및 지우기 동작 원리         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  [Step 1: 쓰레기가 쌓인 상태]                                  │
│   Block A (기존 블록)                                         │
│  ┌──────┬──────┬──────┬──────┐                              │
│  │ Valid│ Inval│ Inval│ Valid│ -> V(유효), I(무효/쓰레기)     │
│  │ (P1) │ (P2) │ (P3) │ (P4) │                              │
│  └──────┴──────┴──────┴──────┘                              │
│                                                             │
│  [Step 2: 유효 데이터만 이사 (Data Migration)]                  │
│  Block A에서 Valid(P1, P4)만 추출하여 텅 빈 Block B에 복사.      │
│                                                             │
│           (복사)       Block B (새 블록)                      │
│   [ P1 ] ─────────▶ ┌──────┬──────┬──────┬──────┐        │
│   [ P4 ] ─────────▶ │ Valid│ Valid│ Free │ Free │        │
│                      │ (P1) │ (P4) │      │      │        │
│                      └──────┴──────┴──────┴──────┘        │
│                                                             │
│  [Step 3: 기존 블록 통째로 폭파 (Block Erase)]                 │
│  이제 Block A는 100% 쓰레기이므로 전체를 지우기(Erase) 실행!       │
│                                                             │
│   Block A (새로운 Free Block으로 재탄생)                       │
│  ┌──────┬──────┬──────┬──────┐                              │
│  │ Free │ Free │ Free │ Free │ -> 이제 여기 새 데이터를 쓸 수 있음!│
│  └──────┴──────┴──────┴──────┘                              │
└─────────────────────────────────────────────────────────────┘

[다이어그램 해설] 가비지 컬렉션은 단순히 데이터를 지우는 것이 아니라 '살릴 놈을 살리는' 구출 작전이다. 블록 내에 무효 데이터(I)가 아무리 많아도 유효 데이터(V)가 단 한 개라도 섞여 있으면 블록 전체를 지울 수 없다. 그래서 컨트롤러(FTL)는 V 데이터를 끄집어내어 새로운 블록(B)에 복사한 뒤에야, 홀가분한 마음으로 구 블록(A)에 고전압을 가해 물리적으로 데이터를 싹 날려버린다.

  • 📢 섹션 요약 비유: 재개발 지역(블록)을 철거하려는데 아직 안 나간 주민(유효 데이터)이 두 명 있습니다. 포크레인으로 건물을 밀어버리기 전에, 이 두 명을 강제로 옆 동네 새 아파트(새 블록)로 이주시키고 나서야 비로소 건물을 시원하게 폭파(Erase)하여 빈 땅(빈 블록)을 얻어내는 과정입니다.

Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)

쓰기 증폭 현상 (Write Amplification Factor, WAF)

가비지 컬렉션의 가장 큰 부작용은 실제 사용자가 요구한 쓰기 양보다 SSD 내부에서 훨씬 더 많은 쓰기 작업이 일어난다는 점이다. 이를 **WAF (쓰기 증폭 지수)**라 부른다.

  • WAF 계산식: $WAF = \frac{\text{SSD 내부 낸드에 쓰인 총 바이트 수}}{\text{OS(사용자)가 요청한 쓰기 바이트 수}}$
  • 이상적인 상태: WAF = 1 (사용자가 10MB 쓰면 낸드도 딱 10MB만 씀)
  • GC 발생 시 (최악의 상태): 사용자가 1MB 파일을 쓰려고 했는데 텅 빈 블록이 없다. GC가 발동하여 기존 유효 데이터 10MB를 새 블록으로 이사시킨 뒤 1MB를 쓴다. 이때 WAF = 11 (OS는 1MB를 요청했으나 낸드에는 11MB가 쓰임).

WAF가 높아질수록 낸드 플래시의 한정된 수명(TBW)은 빛의 속도로 갉아 먹히며, I/O 대역폭이 내부 복사에 빼앗겨 시스템 전체가 멈칫하는 프리징(Freezing) 현상을 겪게 된다.

GC의 실행 시점 (Foreground vs Background)

  • 포그라운드 GC (Foreground GC, On-demand GC):
    • 여유 공간이 완전히 바닥났을 때, OS가 쓰기 요청을 하면 즉시 쓰지 못하고 사용자를 멈춰 세운 채 강제로 GC를 수행한다. 이 순간 SSD 쓰기 속도는 10MB/s 밑으로 나락을 간다.
  • 백그라운드 GC (Background GC, Idle GC):
    • 가장 이상적인 형태. 사용자가 컴퓨터를 켜놓고 커피를 마시러 간 사이(Idle Time), FTL이 스스로 깨어나 미리미리 쓰레기를 청소해 두는 방식이다.
  • 📢 섹션 요약 비유: 내가 손님을 데려와서 "방 좀 치워주세요"라고 했을 때 그제야 부랴부랴 짐을 옮기느라 손님을 밖에서 10분 기다리게 하는 것(포그라운드 GC)은 최악입니다. 손님이 오기 전에 미리 새벽에 일어나 방을 깨끗이 비워두는 것(백그라운드 GC)이 훌륭한 매니저(FTL)의 기본 소양입니다.

Ⅲ. 융합 비교 및 다각도 분석

TRIM 명령어와의 완벽한 융합 (OS & SSD Co-work)

초창기 SSD는 OS와 소통이 안 되는 고립된 섬이었다. OS에서 사용자가 파일을 지워도(휴지통 비우기), OS는 자기 파일 시스템 장부(NTFS/EXT4)에서 파일 이름만 지울 뿐 디스크에 아무 말도 해주지 않았다.

  • TRIM 없는 세상: SSD(FTL) 입장에서는 그 데이터가 진짜 지워진 건지, 아직 중요한 데이터인지 알 턱이 없다. 그래서 GC를 할 때마다 이미 사용자가 지워버린 쓰레기 데이터조차 '유효 데이터(Valid)'인 줄 알고 눈물겹게 새 블록으로 이사시키는 헛수고를 반복했다. 이로 인해 SSD는 쓰면 쓸수록 느려지는 치명병에 걸렸다.
  • TRIM 명령어의 구원: 이를 타파하기 위해 ATA 규격에 TRIM이라는 명령어가 추가되었다. 사용자가 파일을 지우면 OS는 SSD에게 "방금 네 100번지부터 500번지에 있던 데이터, 이제 나한테 필요 없는 진짜 쓰레기니까 나중에 GC 할 때 이사시키지 말고 그냥 다 태워버려!"라고 알림을 보낸다.
  • 결과: FTL은 GC를 할 때 복사해야 할 짐이 확 줄어들어 속도가 미친 듯이 빨라지고 불필요한 쓰기(WAF)가 급감하여 수명이 비약적으로 늘어났다.
비교 항목HDD의 파일 삭제SSD (TRIM X)SSD (TRIM O)
삭제 원리덮어쓰기 가능 (무시함)덮어쓰기 불가 (GC 시 헛수고 이사함)덮어쓰기 불가 (GC 시 그냥 폭파시킴)
속도 변화꽉 차도 처음과 속도 같음용량이 찰수록 속도 수직 하락용량이 차도 초기 속도 방어 가능
데이터 복구파일 복구 프로그램으로 쉽게 복구복구 가능성 꽤 높음복구 절대 불가능 (물리적 삭제됨)
  • 📢 섹션 요약 비유: 철거해야 할 건물 안에 있는 마네킹(지워진 파일)을 사람인 줄 알고 굳이 포크레인을 세우고 끄집어내던 멍청한 짓(TRIM 없음)을 막기 위해, 시청(OS)이 철거반(FTL)에게 "저건 마네킹이니까 그냥 다이너마이트로 같이 터트려버려!"라고 전화(TRIM 명령어)를 걸어주는 완벽한 협업 시스템입니다.

Ⅳ. 실무 적용 및 기술사적 판단

실무 시나리오 및 최적화 전략

  1. 시나리오 — 클라우드 환경의 오버프로비저닝(Over-Provisioning) 설정: AWS나 엔터프라이즈 서버에 SSD 스토리지를 세팅할 때, 쓰기 워크로드(DB 로깅 등)가 매우 잦다.

    • 의사결정: GC가 원활하게 돌려면 짐을 옮겨둘 '빈방(Free Block)'이 절대적으로 필요하다. 디스크가 99% 꽉 차면 빈방이 없어 GC 속도가 극단적으로 느려진다(Write Cliff 현상). 아키텍트는 1TB SSD를 구매한 뒤, OS 파티션을 잡을 때 고의로 800GB만 파티션하고 나머지 200GB를 텅 빈 할당되지 않은 영역(Unallocated)으로 버려둔다. 이 영역은 FTL이 삥땅 쳐서 GC를 위한 널널한 '여유 창고(Over-Provisioning)'로 사용하게 되며, SSD의 수명과 지속 쓰기 성능(Sustained Performance)을 2배 이상 뻥튀기하는 엔터프라이즈 최고의 비기다.
  2. 시나리오 — 보안 문서 파기 (Secure Erase): 금융기관이나 군부대에서 기밀문서를 완전히 파기해야 한다. HDD 시절에는 그 주소에 0과 1을 무의미하게 세 번씩 덮어쓰는 방식을 썼다(DoD 5220.22-M).

    • 의사결정: SSD에 0을 덮어쓰라는 명령을 내리면, FTL은 기존 기밀 데이터는 그대로 둔 채 그냥 텅 빈 다른 블록에 0을 적고 주소만 바꾼다. 기밀 데이터는 쓰레기(Invalid) 상태로 플래시 칩 어딘가에 온전히 살아있어 칩셋 추출로 해킹당할 위험이 있다. SSD를 초기화할 때는 반드시 FTL에 내장된 하드웨어 Secure Erase 명령을 내려, 모든 낸드 블록에 수천 볼트의 전압을 일시에 가해 셀 자체를 초기화(Erase)시켜버려야 법적/보안적 문제가 발생하지 않는다.

안티패턴

  • 디스크 100% 꽉꽉 채워 쓰기: SSD 용량의 95% 이상을 데이터로 꽉 채워 쓰는 행위. 빈 블록이 고갈되어 FTL은 1MB짜리 파일을 쓸 때마다 수백 MB의 파일을 이리저리 옮기느라 비명을 지른다. 결과적으로 속도가 HDD보다 느려지는 것은 물론, 특정 셀들의 수명이 급격히 타들어가 SSD가 반년 만에 돌연사하는 가장 완벽한 자해 행위다. (최소 10~20%의 여유 용량 유지가 필수다.)

  • 📢 섹션 요약 비유: 15 퍼즐 게임을 할 때 빈칸이 딱 1개(여유 용량 부족)밖에 없으면 숫자 하나를 맞추기 위해 타일을 수백 번 이리저리 옮겨야 합니다. 하지만 처음부터 타일 3개를 빼놓고(오버프로비저닝) 게임을 시작하면 너무나 쉽고 빠르게 숫자를 정렬(GC)할 수 있는 원리입니다.


Ⅴ. 기대효과 및 결론

기대효과

  • TRIM과 백그라운드 GC 메커니즘이 완벽히 조율된 현대의 시스템은 사용자가 낸드의 복잡한 물리적 한계를 1%도 느낄 수 없게 만들었다. 지속적인 쓰기(Sustained Write) 성능이 크게 향상되었으며, SSD의 수명(TBW)은 일반 사용자가 평생 써도 다 닳지 않을 만큼 비약적으로 연장되었다.

결론

가비지 컬렉션(GC)은 단순한 청소 작업이 아니다. 덮어쓰기가 안 된다는 반도체 소재(낸드 플래시)의 치명적인 저주를 극복하기 위해, FTL이라는 소프트웨어 두뇌가 끝없이 이사를 다니며 공간을 창출해 내는 투쟁의 과정이다. 이 끊임없는 데이터의 춤(Migration) 덕분에 우리는 쾌적한 0.1ms의 랜덤 액세스 속도를 누리며 클라우드와 AI 시대를 지탱하는 데이터 폭우를 견뎌내고 있다.

  • 📢 섹션 요약 비유: 우아하게 호수를 떠다니는 백조(빠른 SSD 속도)가 물밑에서는 쉴 새 없이 발길질(가비지 컬렉션)을 하고 있는 것과 같습니다. 우리가 느끼는 마법 같은 속도 뒤에는 24시간 내내 쓰레기를 치우는 FTL의 눈물겨운 막노동이 숨어 있습니다.

📌 관련 개념 맵 (Knowledge Graph)

개념 명칭관계 및 시너지 설명
TRIM 명령어운영체제가 SSD에게 지워진 파일의 물리적 주소를 알려주어 GC의 불필요한 이사 헛수고를 방지하는 마법의 통신 규약.
오버프로비저닝 (Over-Provisioning)GC가 원활하게 동작하기 위해 사용자가 접근할 수 없게 숨겨둔 여유 블록 공간 (보통 7~10%).
쓰기 증폭 지수 (WAF)GC 과정에서의 추가 복사 때문에 원래 쓰려던 양보다 SSD 칩에 더 많은 쓰기가 발생하는 비효율성 지표.
마모 평준화 (Wear Leveling)GC 과정에서 데이터를 새 블록으로 이사시킬 때, 가급적 덜 지운(젊은) 블록을 골라 SSD 전체의 수명을 맞추는 기술.
FTL (Flash Translation Layer)이 모든 복잡한 GC와 웨어 레벨링 로직을 지휘하는 SSD 컨트롤러 내부의 핵심 두뇌 소프트웨어.

👶 어린이를 위한 3줄 비유 설명

  1. 가비지 컬렉션은 장난감 상자(SSD)가 꽉 찼을 때 벌어지는 엄청난 '상자 정리 대작전'이에요.
  2. 헌 상자 안에 부서진 장난감(쓰레기 데이터)과 예쁜 장난감이 섞여 있으면, 예쁜 장난감만 쏙쏙 골라 빈 상자로 소중하게 옮겨 담아요.
  3. 그리고 쓰레기만 남은 헌 상자는 마법의 지우개로 한 번에 와르르 지워버려서, 언제든 다시 쓸 수 있는 깨끗한 새 상자로 만들어두는 아주 중요한 청소랍니다!