SSD 컨트롤러, 낸드 플래시를 저장 장치로 만드는 두뇌
큰 물류센터에는 수만 개의 선반이 있지만, 주문한 사람은 상품이 몇 번 선반에 있는지 알 필요가 없습니다. 관제실이 들어온 물건을 빈 선반에 배정하고, 위치를 장부에 적고, 고장 난 선반은 빼고, 여러 작업자에게 일을 나눠 줍니다. 고객 눈에는 주문하면 물건이 나오는 단순한 창고로 보이죠.
SSD에서 이 관제실 역할을 하는 칩이 SSD 컨트롤러입니다. 낸드 플래시는 그대로 쓰기에는 까다로운 성질이 많은데, 컨트롤러가 그 성질을 모두 감추고 운영체제에는 평범한 저장 장치처럼 보이게 만들죠. 이 글에서는 컨트롤러의 하드웨어 구조와 그 위에서 돌아가는 핵심 기능을 차례로 살펴봅니다.
SSD 컨트롤러가 필요한 이유
낸드 플래시에는 하드디스크와 전혀 다른 제약이 있습니다. 데이터를 쓰는 단위는 수 KB에서 수십 KB 크기의 페이지(Page)인데, 지우는 단위는 수백 개의 페이지를 묶은 블록(Block)입니다. 게다가 이미 쓴 페이지에 그대로 덮어쓸 수 없어서, 고치려면 블록 전체를 지운 뒤 다시 써야 하죠.
여기에 셀은 쓰고 지울수록 닳아 횟수에 한계가 있고, 시간이 지나거나 이웃 셀을 읽기만 해도 오류가 생기며, 처음부터 쓸 수 없는 블록도 섞여 있습니다. 운영체제가 이런 사정을 일일이 챙기게 할 수는 없으니, 낸드의 불편함을 대신 떠안는 장치가 필요해진 것입니다.
컨트롤러 칩의 내부 구조
SSD 컨트롤러는 작은 컴퓨터 하나를 칩에 담은 SoC(System on Chip)입니다. 크게 호스트 쪽 입구, 두뇌 역할의 프로세서, 데이터를 다듬는 가속 엔진, 낸드 쪽 출구로 나눌 수 있죠.
호스트 쪽에는 PCIe(Peripheral Component Interconnect Express) 물리 계층과 그 위에서 명령을 주고받는 NVMe(Non-Volatile Memory Express) 프로토콜 처리부가 있습니다. NVMe는 여러 개의 명령 대기열을 동시에 다룰 수 있어, 많은 요청을 병렬로 받아들이는 SSD의 성질과 잘 맞습니다.
안쪽에는 펌웨어를 실행하는 여러 개의 임베디드 프로세서 코어가 있고, 오류 정정 엔진과 암호화 엔진처럼 반복 계산을 하드웨어로 처리하는 가속기가 붙어 있습니다. 낸드 쪽에는 ONFI나 Toggle 같은 규격으로 낸드와 통신하는 플래시 인터페이스가 여러 채널(Channel)로 나뉘어 있죠.
채널이 핵심인 이유는 병렬성입니다. 낸드 칩 하나는 느리지만, 여러 채널에 여러 칩을 매달고 각 칩을 CE(Chip Enable) 신호로 골라 가며 동시에 일을 시키면 전체 속도가 크게 올라가죠. 물류센터가 작업자 한 명을 빠르게 만드는 대신 여러 통로에 작업자를 나눠 배치하는 것과 같습니다.
호스트의 쓰기 요청이 낸드에 저장되기까지(단순화)
- 호스트가 NVMe 명령으로 논리 주소와 데이터를 보냅니다.
- 컨트롤러가 데이터를 내부 버퍼에 받아 두고, 필요하면 암호화합니다.
- FTL이 비어 있는 물리 페이지를 골라 배정하고 매핑 표를 고칩니다.
- ECC 엔진이 데이터에 오류 정정용 패리티를 덧붙입니다.
- 여러 채널과 칩에 나누어 동시에 프로그램하고, 이전 위치의 페이지는 무효로 표시합니다.
DRAM 캐시와 HMB
컨트롤러가 가장 자주 들여다보는 것은 논리 주소와 물리 주소를 잇는 매핑 표입니다. 4 KB마다 4바이트 항목을 두는 방식이라면 1 TB 용량에 약 1 GB의 표가 필요한데, 이 때문에 용량 1 TB당 DRAM 1 GB라는 경험칙이 생겼죠. 그래서 많은 SSD가 컨트롤러 옆에 별도의 DRAM을 둡니다.
원가를 줄인 DRAM 없는 SSD는 NVMe 규격의 HMB(Host Memory Buffer) 기능으로 호스트 PC의 메인 메모리 일부를 빌려 매핑 표의 일부를 캐시합니다. 빌린 공간은 작고 PCIe를 거쳐야 하므로, 무작위 접근이 많은 작업에서는 DRAM을 갖춘 제품과 차이가 날 수 있습니다.
FTL, 논리 주소와 물리 주소를 잇는 지도
FTL(Flash Translation Layer)은 컨트롤러 펌웨어의 심장입니다. 운영체제가 같은 논리 주소에 데이터를 고쳐 쓰면, FTL은 원래 자리를 지우지 않고 새 빈 페이지에 쓴 뒤 지도만 바꿔 놓죠. 이전 페이지는 무효 표시만 남깁니다.
가비지 컬렉션
이렇게 쓰다 보면 블록마다 유효한 페이지와 무효 페이지가 뒤섞여 빈 블록이 줄어듭니다. 그러면 컨트롤러는 무효 페이지가 많은 블록을 골라 유효한 페이지만 다른 곳으로 옮기고 그 블록을 통째로 지우는데, 이를 가비지 컬렉션(Garbage Collection)이라고 하죠.
문제는 옮기는 작업도 낸드에 쓰는 일이라는 점입니다. 호스트가 쓴 양보다 낸드에 실제로 쓴 양이 많아지는 비율을 쓰기 증폭(WAF, Write Amplification Factor)이라고 하며, 이 값이 클수록 성능과 수명이 함께 깎입니다. 사용자에게 보이지 않는 여유 공간인 오버 프로비저닝(Over-provisioning)을 두거나, 운영체제가 지운 파일의 주소를 알려 주는 TRIM 명령을 활용하면 옮길 데이터가 줄어 쓰기 증폭을 낮출 수 있습니다.
웨어 레벨링
특정 블록만 계속 쓰고 지우면 그 블록이 먼저 닳아 버립니다. 웨어 레벨링(Wear Leveling)은 쓰기와 지우기를 모든 블록에 고르게 나누는 기능으로, 새 데이터를 덜 닳은 블록에 배정하는 동적 방식과 오래 그대로 있는 데이터까지 옮겨 그 블록을 다시 쓰게 하는 정적 방식이 있죠.
오류와 불량 블록 다루기
낸드는 셀 하나에 여러 비트를 담을수록 상태 사이의 간격이 좁아져 오류가 늘어납니다. 그래서 SSD 컨트롤러에는 강력한 오류 정정 엔진이 들어가는데, 과거에는 BCH 부호를 많이 썼고 지금은 정정 능력이 더 큰 LDPC(Low-Density Parity-Check) 부호가 주류입니다. 한 번에 정정이 안 되면 읽기 전압을 바꿔 다시 읽는 리드 리트라이(Read Retry)로 실마리를 더 모으죠.
불량 블록 관리(Bad Block Management)도 컨트롤러의 몫입니다. 출하 때부터 표시된 초기 불량 블록은 처음부터 쓰지 않고, 쓰다가 프로그램이나 지우기에 실패하는 블록은 데이터를 옮긴 뒤 예비 블록으로 바꿔 넣습니다. 오래 읽지 않은 데이터나 너무 자주 읽힌 블록은 오류가 쌓이기 전에 미리 다른 곳으로 옮겨 쓰기도 하죠.
펌웨어가 만드는 성능 차이
흔히 SSD 성능은 어떤 낸드를 썼는지로 결정된다고 생각하지만, 같은 낸드를 써도 SSD 컨트롤러와 펌웨어에 따라 체감 성능과 수명이 크게 달라집니다. 어떤 블록을 언제 정리할지, 매핑 표를 어떻게 캐시할지, 채널에 일을 어떻게 나눌지가 모두 펌웨어의 정책이기 때문이죠.
대표적인 예가 SLC 캐싱(SLC Caching)입니다. 셀당 3비트를 담는 TLC 낸드의 일부를 셀당 1비트처럼 빠르게 써서 쓰기 요청을 먼저 받아 두고, 한가할 때 원래 방식으로 옮겨 적는 방식이죠. 캐시 크기를 넘는 대용량 쓰기에서는 속도가 뚝 떨어지므로, 짧은 측정값만 보고 성능을 판단하면 안 됩니다.
이 밖에도 온도가 오르면 속도를 낮춰 칩을 보호하는 스로틀링(Thermal Throttling), 갑작스러운 전원 차단에 대비해 매핑 정보를 안전하게 남기는 기능이 있습니다. 데이터센터용 제품은 커패시터를 달아 전원이 끊긴 뒤에도 버퍼의 데이터를 낸드에 마저 기록하는 경우가 많죠.
SSD 컨트롤러 기능 비교 표
| 구분 | 해결하는 낸드의 제약 | 하는 일 | 대가와 주의점 |
|---|---|---|---|
| FTL 매핑 | 덮어쓰기 불가 | 새 페이지에 쓰고 주소 지도를 갱신 | 매핑 표용 DRAM 또는 HMB 필요 |
| 가비지 컬렉션 | 블록 단위 지우기 | 유효 페이지를 옮기고 블록 회수 | 쓰기 증폭, 순간 성능 저하 |
| 웨어 레벨링 | 쓰기·지우기 횟수 한계 | 모든 블록을 고르게 사용 | 정적 방식은 추가 쓰기 발생 |
| ECC 엔진 | 비트 오류 증가 | LDPC 등으로 오류 정정 | 칩 면적, 재시도 시 지연 |
| 불량 블록 관리 | 초기·사용 중 불량 | 불량 블록 제외, 예비 블록 대체 | 예비 공간만큼 용량 손실 |
| SLC 캐싱 | 느린 다중 비트 쓰기 | 일부를 1비트처럼 빠르게 사용 | 캐시 소진 시 속도 급락 |
핵심 정리
SSD 컨트롤러는 덮어쓸 수 없고, 블록 단위로 지워야 하며, 닳고 오류가 나는 낸드를 평범한 저장 장치로 보이게 만드는 칩입니다. 하드웨어로는 NVMe와 PCIe 입구, 여러 프로세서 코어, ECC 엔진, 여러 채널의 플래시 인터페이스를 갖추고, 펌웨어로는 FTL, 가비지 컬렉션, 웨어 레벨링, 불량 블록 관리를 수행하죠.
물류센터의 실력이 선반보다 관제실에서 갈리듯, SSD의 성능과 수명도 낸드만큼이나 컨트롤러가 일을 어떻게 나누고 정리하는지에 달려 있습니다. 제품을 비교할 때는 순간 최고 속도보다 DRAM 유무, 캐시를 다 쓴 뒤의 속도, 보증 쓰기 용량을 함께 보면 컨트롤러의 설계 방향을 읽을 수 있습니다.
면접 대비 질문
면접 대비 질문SSD를 거의 가득 채운 상태로 오래 쓰면 쓰기 성능이 떨어지는 이유를 컨트롤러 동작으로 설명해 보십시오.
[답변 포인트] 낸드는 덮어쓰기가 안 되고 블록 단위로 지워야 해서 FTL이 새 페이지에 쓰고 이전 페이지를 무효로 남긴다는 점부터 설명합니다. 빈 공간이 적으면 빈 블록을 만들기 위한 가비지 컬렉션이 자주 일어나고, 회수할 블록에도 유효 페이지가 많아 옮겨 쓰는 양이 늘어나므로 쓰기 증폭이 커지고 호스트 쓰기와 경쟁해 성능이 떨어진다고 답합니다. 대책으로 오버 프로비저닝, TRIM 활용, 여유 공간 확보를 들고, SLC 캐시가 줄어드는 영향도 덧붙이면 좋습니다.









