AI

SPDK가 뭘까? 전격 해부

marvin-jung 2026. 5. 13. 22:27

 

STORAGE PERFORMANCE DEVELOPMENT KIT
SPDK가 뭘까? 전격 해부
커널을 우회하여 NVMe 성능 한계를 돌파하는
사용자 공간 스토리지 프레임워크
NVMe SSD를 장착하고도 기대만큼의 IOPS가 나오지 않는다면, 그 원인은 디스크가 아니라 리눅스 커널일 가능성이 높습니다. 하드웨어는 이미 마이크로초 단위로 응답하는데, 운영체제의 I/O 스택이 그 속도를 따라가지 못하고 있는 셈입니다. SPDK(Storage Performance Development Kit)는 바로 이 병목을 우회하기 위해 인텔이 설계한 오픈소스 프레임워크입니다. 이번 글에서는 SPDK가 정확히 무엇인지, 어떻게 그토록 빠른 속도를 내는지, 그리고 어떤 환경에서 실제로 도입해야 하는지를 자세히 살펴보겠습니다.
왜 지금 SPDK를 알아야 할까요
스토리지 하드웨어는 지난 10년간 극적으로 발전했습니다. 회전식 HDD에서 SATA SSD로, 다시 NVMe SSD로 넘어오면서 단일 디바이스의 처리 능력이 수백 배 이상 향상되었습니다. 그러나 운영체제의 I/O 스택은 여전히 HDD 시대에 설계된 구조를 그대로 사용하고 있습니다. 그 결과, 하드웨어는 빨라졌지만 소프트웨어가 발목을 잡는 역설이 발생합니다.
~10μs
커널 NVMe
I/O 지연
<1μs
SPDK NVMe
I/O 지연
10배+
코어당
IOPS 향상
일반적인 리눅스 커널 I/O 경로는 시스템 콜, VFS 계층, 파일시스템, 블록 레이어, 디바이스 드라이버까지 여러 단계를 거칩니다. 각 계층마다 컨텍스트 스위치, 메모리 복사, 락 경합이 발생하면서 지연이 누적됩니다. NVMe처럼 마이크로초 단위로 응답하는 디바이스에서는 이 오버헤드가 전체 성능을 좌우하게 됩니다.
SPDK란 정확히 무엇인가
SPDK는 Storage Performance Development Kit의 약자로, 인텔이 2015년경 공개한 오픈소스 프로젝트입니다. BSD 라이선스로 배포되며, 고성능 스토리지 애플리케이션을 사용자 공간(user space)에서 직접 개발할 수 있도록 다양한 라이브러리와 드라이버를 제공합니다. 네트워킹 분야의 DPDK(Data Plane Development Kit)와 같은 철학을 스토리지에 적용한 것으로 이해하면 됩니다.
핵심 아이디어는 단순합니다. "커널을 거치지 않고, 사용자 공간에서 NVMe 컨트롤러를 직접 제어하자"는 것입니다. 애플리케이션이 SPDK 라이브러리를 통해 PCIe 버스 위의 NVMe 디바이스와 직접 대화하므로, 시스템 콜과 인터럽트, 락 경합 같은 전통적인 오버헤드를 모두 제거할 수 있습니다.
전통 커널 경로 vs SPDK 경로
syscall
VFS
블록 레이어
NVMe 드라이버
NVMe HW
 
앱 + SPDK
NVMe HW
SPDK가 빠른 이유 - 3가지 핵심 원리
01
커널 우회 (Kernel Bypass)
SPDK는 VFIO 또는 UIO 메커니즘을 이용하여 NVMe 컨트롤러의 PCIe MMIO 영역을 사용자 공간으로 직접 매핑합니다. 시스템 콜이 사라지므로 컨텍스트 스위치 비용이 0이 되고, 데이터 복사도 발생하지 않습니다. 사용자 프로세스가 곧 드라이버가 되는 구조입니다.
02
폴링 모드 (Polled Mode I/O)
전통적인 시스템은 I/O 완료를 인터럽트로 통지받습니다. 그러나 인터럽트는 처리 비용이 높고 지연을 유발합니다. SPDK는 전용 CPU 코어가 NVMe 완료 큐를 끊임없이 폴링하여 I/O가 끝나는 즉시 즉각적으로 처리합니다. CPU 사용률은 100%에 근접하지만, 지연은 극도로 낮아집니다.
03
락 프리 (Lockless) 설계
SPDK는 코어당 단일 스레드가 모든 작업을 비동기로 처리하는 run-to-completion 모델을 채택합니다. 코어 간 자원 공유를 최소화하고 메시지 전달 방식으로 통신하므로, 멀티스레드 환경에서 흔히 발생하는 락 경합과 캐시 일관성 비용이 사라집니다.
⚡ 정리하면 커널 우회로 오버헤드 제거, 폴링으로 지연 단축, 락 프리 설계로 스케일 아웃 확보. 이 세 가지가 SPDK의 성능 비결입니다.
커널 스택 vs SPDK - 무엇이 다른가
전통 리눅스 커널 I/O
  • 시스템 콜로 커널 진입
  • VFS · 블록 레이어 거침
  • 인터럽트 기반 완료 통지
  • 락 경합 발생
  • 일부 데이터 복사 발생
  • 코어당 약 200~500K IOPS
SPDK 사용자 공간 I/O
  • 시스템 콜 없음
  • NVMe 큐와 직접 대화
  • 폴링 기반 즉시 처리
  • 락 프리 run-to-completion
  • 제로 카피 DMA
  • 코어당 100만+ IOPS 가능
SPDK 주요 컴포넌트 살펴보기
SPDK는 단일 라이브러리가 아니라 여러 컴포넌트의 모음입니다. 사용 목적에 따라 필요한 모듈만 선택하여 조합할 수 있습니다.
NVMe Driver
기반 드라이버
사용자 공간에서 동작하는 NVMe 컨트롤러 드라이버. SPDK의 가장 핵심적인 모듈로, PCIe NVMe SSD를 직접 제어합니다.
NVMe-oF Target
네트워크 스토리지
NVMe over Fabrics 타겟 구현체. RDMA, TCP, FC 트랜스포트를 지원하여 원격 NVMe 액세스를 제공합니다.
bdev Layer
블록 디바이스 추상화
SPDK의 블록 디바이스 추상화 계층. NVMe, malloc, AIO, RBD 등 다양한 백엔드를 동일한 인터페이스로 사용할 수 있게 합니다.
vhost Target
VM 스토리지
QEMU/KVM 가상 머신에 고성능 스토리지를 제공하는 타겟. virtio-scsi와 virtio-blk를 모두 지원합니다.
Blobstore
오브젝트 빌딩블록
파일시스템보다 가벼운 객체 저장소 빌딩 블록. 데이터베이스, 캐시 시스템 등의 기반 스토리지로 활용됩니다.
iSCSI Target
레거시 호환
기존 iSCSI 인프라와의 호환성을 위해 제공되는 고성능 iSCSI 타겟 구현체입니다.
SPDK 사용 예시 - NVMe 디바이스 등록
SPDK의 사용 흐름을 간단히 살펴보면 다음과 같습니다. 실제 애플리케이션은 SPDK가 제공하는 콜백 기반 비동기 API를 통해 NVMe 컨트롤러에 접근합니다.
// SPDK NVMe 컨트롤러 탐색 및 등록 (개념 예시) int main(void) { struct spdk_env_opts opts; spdk_env_opts_init(&opts); opts.name = "spdk_app"; // 1. SPDK 환경 초기화 (DPDK 기반) if (spdk_env_init(&opts) < 0) { return 1; } // 2. NVMe 컨트롤러 탐색 시작 // probe_cb / attach_cb 콜백을 통해 // 발견된 디바이스를 사용자 공간에 등록 spdk_nvme_probe(NULL, NULL, probe_cb, attach_cb, NULL); // 3. I/O 큐 페어 생성 후 비동기 read/write spdk_nvme_ns_cmd_read(ns, qpair, buffer, lba, count, cb_fn, NULL, 0); // 4. 폴링 루프 while (running) { spdk_nvme_qpair_process_completions(qpair, 0); } }
💡 주목할 점 모든 I/O가 비동기 콜백 기반이며, 별도의 인터럽트 핸들러 없이 폴링 함수를 직접 호출해야 한다는 점입니다. 이는 SPDK 애플리케이션 설계 방식의 핵심 차이점입니다.
실전 활용 사례
클라우드 스토리지 백엔드
알리바바 클라우드, 텐센트 클라우드 등 대형 클라우드 사업자가 자체 블록 스토리지 서비스의 핵심 데이터 경로에 SPDK를 활용합니다. 단일 호스트에서 수백만 IOPS를 처리해야 하는 환경에서 필수적인 기술입니다.
🗄
All-Flash 스토리지 어레이
엔터프라이즈 스토리지 벤더들이 자사 All-Flash 어레이의 컨트롤러 소프트웨어 스택에 SPDK를 통합합니다. NVMe-oF 타겟으로 활용되어 패브릭 너머의 클라이언트에 초저지연 스토리지를 제공합니다.
VM 및 컨테이너 스토리지
SPDK vhost 타겟은 KVM 가상 머신과 컨테이너에 베어메탈에 가까운 스토리지 성능을 제공합니다. 클라우드 게이밍, VDI 등 지연에 민감한 워크로드에서 차이를 만들어냅니다.
🧠
AI · 데이터베이스 워크로드
대규모 학습 데이터 로딩이나 OLTP 데이터베이스의 트랜잭션 로그 영역처럼 극단적인 처리량과 낮은 지연이 동시에 요구되는 환경에서 SPDK 기반 사용자 공간 스토리지가 활용되고 있습니다.
SPDK의 한계와 도입 시 고려사항
SPDK가 만능 해법은 아닙니다. 강력한 성능 이점만큼이나 명확한 트레이드오프가 존재합니다.
CPU 자원 점유
폴링 모드는 본질적으로 CPU 코어를 100%로 점유합니다. 워크로드가 적은 시간대에도 폴링 코어는 계속 돌아가기 때문에, 전력 효율이 중요한 환경에서는 신중히 설계해야 합니다. 일반적으로 SPDK 애플리케이션은 일부 코어를 dedicated 자원으로 격리하여 사용합니다.
애플리케이션 재설계 필요
기존 POSIX 파일 I/O 기반 애플리케이션을 그대로 SPDK 위에 올릴 수는 없습니다. 비동기 콜백 모델로 코드를 재구성해야 하며, 이로 인한 학습 곡선과 개발 비용이 발생합니다.
메모리 관리
SPDK는 DPDK의 hugepage 기반 메모리 풀에서 동작합니다. 시스템 부팅 시 hugepage를 미리 할당해야 하며, 일반 malloc 메모리는 DMA용으로 사용할 수 없습니다. 이는 시스템 운영 관점에서 추가 고려사항이 됩니다.
생태계 도구의 차이
fdisk, mkfs, df 같은 전통적인 리눅스 도구들은 커널 디바이스 노드를 전제로 동작합니다. SPDK가 디바이스를 점유하면 이 도구들이 보이지 않게 되므로, 운영 모니터링과 관리 워크플로우를 SPDK 자체 도구로 다시 구축해야 합니다.
언제 SPDK를 도입해야 할까요
모든 환경에 SPDK가 필요한 것은 아닙니다. 다음과 같은 조건이 충족될 때 가장 큰 효과를 얻을 수 있습니다.
도입을 적극 검토할 환경
  • NVMe SSD 기반 고성능 시스템
  • 마이크로초 단위 지연이 중요
  • 코어당 수십만 IOPS 이상 필요
  • NVMe-oF 타겟 구축
  • 자체 스토리지 제품 개발
도입이 부적합한 환경
  • 일반 웹/앱 서버 워크로드
  • HDD/SATA SSD 중심 시스템
  • CPU 자원이 빠듯한 환경
  • 기존 코드 수정이 어려운 경우
  • 운영 인력의 학습 여력 부족
마치며 - 사용자 공간 스토리지의 시대
SPDK는 단순한 성능 최적화 라이브러리를 넘어, 스토리지 소프트웨어 패러다임의 전환을 상징합니다. 하드웨어가 충분히 빨라진 시대에는 운영체제의 추상화 비용 자체가 새로운 병목이 되며, 이를 우회하기 위한 사용자 공간 스택이 점점 더 중요해지고 있습니다. NVMe-oF, 차세대 분산 스토리지, AI 인프라가 본격 확산되는 환경에서 SPDK가 제공하는 성능 이점은 더욱 부각될 것입니다. 기술적으로 까다로운 부분이 적지 않지만, 한 번 익혀두면 스토리지 시스템을 바라보는 시야 자체가 달라지는 강력한 도구입니다.
TAGS
#SPDK #StoragePerformanceDevelopmentKit #NVMe #커널바이패스 #사용자공간드라이버 #NVMeoF #고성능스토리지 #DPDK #스토리지엔지니어링 #리눅스I/O스택