커널 바이패스(Kernel Bypass)는 네트워크 패킷이나 메모리 접근 시 OS 커널을 거치지 않고 하드웨어에 직접 접근하여 레이턴시와 처리량을 극대화하는 기법이다.
DPDK (Data Plane Development Kit)
DPDK는 Intel이 주도한 고성능 패킷 처리 프레임워크로, 리눅스 네트워크 스택을 완전히 우회하여 사용자 공간에서 NIC를 직접 제어한다.
기존: NIC → 커널 드라이버 → 네트워크 스택 → 소켓 API → 애플리케이션
DPDK: NIC → Poll Mode Driver (PMD) → 사용자 공간 애플리케이션
DPDK 초기화 예시 (C)
c
# include <rte_eal.h>
# include <rte_ethdev.h>
# include <rte_mbuf.h>
# define RX_RING_SIZE 1024
# define TX_RING_SIZE 1024
# define NUM_MBUFS 8191
int main(int argc, char *argv[]) {
// EAL 초기화
int ret = rte_eal_init(argc, argv);
// 메모리 풀 생성
struct rte_mempool *mbuf_pool = rte_pktmbuf_pool_create(
"MBUF_POOL", NUM_MBUFS, 250, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id()
);
// 포트 설정
uint16_t port_id = 0;
rte_eth_dev_configure(port_id, 1, 1, &port_conf);
rte_eth_rx_queue_setup(port_id, 0, RX_RING_SIZE, rte_eth_dev_socket_id(port_id), NULL, mbuf_pool);
rte_eth_tx_queue_setup(port_id, 0, TX_RING_SIZE, rte_eth_dev_socket_id(port_id), NULL);
rte_eth_dev_start(port_id);
// 패킷 수신 루프 (폴링)
struct rte_mbuf *bufs[32];
while (1) {
uint16_t nb_rx = rte_eth_rx_burst(port_id, 0, bufs, 32);
for (uint16_t i = 0; i < nb_rx; i++) {
process_packet(bufs[i]);
rte_pktmbuf_free(bufs[i]);
}
}
}
RDMA (Remote Direct Memory Access)
RDMA는 네트워크를 통해 원격 서버의 메모리에 CPU 개입 없이 직접 읽고 쓰는 기술이다.
| 항목 | RDMA | TCP/IP | DPDK |
|---|
| CPU 오버헤드 | 거의 없음 | 높음 | 낮음 |
| 레이턴시 | ~1μs | ~50μs | ~5μs |
| 네트워크 요구 | InfiniBand/RoCE | 이더넷 | 이더넷 |
| 사용 사례 | HPC, 스토리지 | 범용 | 고성능 패킷처리 |
활용 사례
- •금융: 초저지연 트레이딩 시스템 (HFT)
- •통신: 5G 기지국 사용자 플레인 (UPF)
- •클라우드: SR-IOV 기반 가상 NIC
- •AI 클러스터: RDMA over Converged Ethernet (RoCE)으로 GPU 간 통신