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

  1. 일반적인 SSD는 OS가 던지는 데이터의 성격(수명)을 전혀 모른 채 빈 공간이 보이는 대로 아무렇게나 뒤섞어 쓴다(Mixed IO).
  2. 짧게 쓰고 버려질 캐시 데이터와 10년간 보관할 사진 데이터가 낸드 플래시의 같은 블록(Block)에 섞여 있으면, 짧은 데이터 하나를 지우기 위해 긴 데이터까지 통째로 들어냈다 다시 써야 하는 끔찍한 쓰기 증폭(WAF)과 가비지 컬렉션(GC) 낭비가 발생한다.
  3. **다중 스트림 쓰기(Multi-stream Write)**는 OS가 저장할 때부터 "이건 금방 지울 놈들(Stream 1), 저건 오래갈 놈들(Stream 2)"이라고 꼬리표를 달아주어, SSD 컨트롤러가 성격이 같은 데이터끼리 묶어서 저장하게 해주는 하드웨어-소프트웨어 협력 최적화 기법이다.

Ⅰ. 섞여버린 쓰레기통의 비극 (가비지 컬렉션의 한계)

SSD에 들어가는 낸드 플래시 메모리는 데이터를 쓸 때는 '페이지(Page)' 단위로 작게 쓰지만, 지울 때는 무조건 거대한 덩어리인 '블록(Block)' 단위로 한꺼번에 날려버려야 하는 치명적 제약이 있습니다.

만약 블록 A에 **'10분 뒤에 지워질 임시 로그 파일'**과 **'10년간 보관할 운영체제 코어 파일'**이 사이좋게 같이 저장되었다고 칩시다. 10분 뒤 임시 파일이 삭제(Invalid) 처리되었습니다. SSD 컨트롤러는 블록 A를 비워서 새 공간을 만들고 싶은데, 옆에 찰싹 붙어있는 OS 파일이 지워지면 안 됩니다. 어쩔 수 없이 SSD는 블록 A의 살아있는 OS 파일을 새 블록 B로 통째로 복사해서 피난(Migration) 시킨 뒤에야 블록 A를 펑! 날려버립니다 (Garbage Collection).

아무 죄 없는 OS 파일이 10분짜리 임시 파일 때문에 쓸데없이 복사되며 SSD의 소중한 쓰기 수명을 갉아먹는 쓰기 증폭 현상입니다.

📢 섹션 요약 비유: 쓰레기봉투(Block) 안에 음식물 쓰레기(임시 파일)와 현금다발(OS 파일)을 섞어 버렸습니다. 쓰레기통을 비우려면, 어쩔 수 없이 봉투를 통째로 부은 다음 현금만 일일이 손으로 골라내서(GC 피난) 새 봉투에 넣고 나머지를 버리는 고통스러운 노동을 해야 합니다.

Ⅱ. 스트림 꼬리표 붙이기: 끼리끼리 모여라

삼성전자를 비롯한 기업들이 이 낭비를 막기 위해 다중 스트림 쓰기 (Multi-stream Write) 표준을 NVMe 규격에 집어넣었습니다.

운영체제(또는 DB 엔진)는 데이터의 수명(Lifetime)을 누구보다 잘 압니다. 데이터를 SSD로 내려보낼 때, 짐 박스에 **스트림 ID(Stream ID)**라는 숫자를 딱 붙여서 옵니다.

  • Stream 1 (Hot): 매초 바뀌는 캐시 파일. 금방 지워질 놈들.
  • Stream 2 (Warm): 하루에 한 번 바뀌는 로그 파일들.
  • Stream 3 (Cold): 절대 안 지워지는 OS 백업 파일들.

SSD 컨트롤러는 이 꼬리표를 보고, **"Stream 1 꼬리표가 붙은 놈들은 무조건 1번 블록에 모아! Stream 3 놈들은 3번 블록에 모아!"**라고 분리수거를 철저히 해서 기록합니다.

데이터 분류 저장 (ASCII)

 [ 전통적 방식: 난장판 ]                  [ 다중 스트림 쓰기: 분리수거 ]
 ┌─ 블록 A ──────────────┐              ┌─ 블록 1 (금방 지워질 Hot 전용) ─────┐
 │ Hot 데이터 (로그)      │              │ 로그 A, 로그 B, 로그 C             │
 │ Cold 데이터 (OS 파일)  │              └────────────────────────────────────┘
 │ Hot 데이터 (임시 파일)  │              ┌─ 블록 2 (영원히 남을 Cold 전용) ─┐
 └───────────────────────┘              │ OS 코어 파일, 가족 사진             │
 (지울 때 현금 골라내기 노가다 필수)            └─────────────────────────────┘
                                       (Hot 블록은 고민 없이 통째로 쿨하게 날려버림!)

📢 섹션 요약 비유: 처음부터 일반 쓰레기봉투, 재활용 봉투, 음식물 봉투로 철저히 3분할(스트림)해서 버렸습니다. 이제 청소부(SSD 컨트롤러)는 음식물 봉투만 쏙 집어서 통째로 쓰레기차에 던져버리면(블록 Erase) 끝입니다. 고르는 노가다(GC)가 0%로 줄어듭니다.

Ⅲ. 트레이드오프와 성능 향상

스트림을 너무 많이 쪼개면(예: 1,000개 스트림), 1,000개의 블록을 동시에 열어두고 찔끔찔끔 써야 하므로 파편화가 일어나 오히려 역효과가 납니다. 보통 4~8개 정도의 스트림(온도)으로 분류하는 것이 스윗스팟(Sweet Spot)입니다.

이 기술이 카산드라(Cassandra)나 RocksDB 같은 NoSQL 데이터베이스에 적용되면, 가비지 컬렉션(GC) 때문에 서버가 멈칫거리는 렉(Tail Latency)이 기적처럼 50% 이상 사라지고, 디스크의 수명(Endurance)이 30% 이상 공짜로 늘어나는 엄청난 경제적 마법을 부리게 됩니다.