SmartNIC/DPU

Linux SmartNIC/DPU 하드웨어 가속 — DPU 아키텍처, devlink, Representor, OVS TC Offload, auxiliary_bus, IPsec/TLS 오프로드, 스토리지 오프로드 종합 가이드. 커널 내부 데이터 경로, 핵심 자료구조/API, 운영 환경 튜닝 포인트와 장애 디버깅 절차까지 실무 관점으로 다룹니다.

전제 조건: 네트워크 스택네트워크 디바이스 드라이버 문서를 먼저 읽으세요. 고성능 패킷 경로는 큐 구조, 메모리 배치, 드롭 위치가 성능을 좌우하므로 드라이버 경계를 먼저 이해하는 것이 중요합니다.
일상 비유: 이 주제는 고속 톨게이트 차선 분리와 비슷합니다. 일반 차선(커널 스택)과 하이패스 차선(XDP/DPDK)을 구분해 보면 왜 지연과 처리량이 달라지는지 명확해집니다.

핵심 요약

  • 패킷 수명주기 — ingress, 처리, egress 경로를 연결합니다.
  • 큐/버퍼 모델 — sk_buff와 큐 지점의 역할을 분리합니다.
  • 정책/데이터 분리 — 제어 평면과 데이터 평면을 구분합니다.
  • 성능 지표 — PPS, 지연, 드롭 원인을 함께 분석합니다.
  • 오프로딩 경계 — NIC/XDP/DPDK 경계를 명확히 유지합니다.

단계별 이해

  1. 경로 고정
    문제가 발생한 ingress/egress 지점을 먼저 특정합니다.
  2. 큐 관찰
    백로그와 드롭 위치를 계측합니다.
  3. 정책 반영 확인
    라우팅/필터 변경이 데이터 경로에 반영됐는지 봅니다.
  4. 부하 검증
    실제 트래픽 패턴에서 재현성을 확인합니다.
유저스페이스 프레임워크: DPDK에서 고성능 패킷 처리 프레임워크 (EAL, PMD, rte_mbuf, Ring, Mempool, AF_XDP, OVS-DPDK)를 확인하세요.
관련 표준: PCIe Base Specification, SR-IOV Specification — 하드웨어 가속 표준입니다. 종합 목록은 참고자료 — 표준 & 규격 섹션을 참고하세요.

SmartNIC / DPU 기반 네트워크 가속

DPU(Data Processing Unit)는 단순 NIC를 넘어 자체 프로세서(ARM SoC), 메모리, 스토리지 인터페이스, 하드웨어 가속기를 탑재한 독립적인 컴퓨팅 플랫폼입니다. 데이터센터의 네트워킹, 보안, 스토리지 처리를 호스트 CPU에서 DPU로 오프로드하여 인프라 오버헤드를 제거하고, 호스트 CPU를 애플리케이션 워크로드에 전용할 수 있습니다.

NIC vs SmartNIC vs DPU 비교

구분전통 NICSmartNICDPU
프로세서 없음 (고정 ASIC) FPGA 또는 NP ARM SoC + HW 가속
메모리 소량 SRAM (버퍼용) 수백 MB DRAM 수 GB~16GB+ DRAM
OS 실행 불가 제한적 (마이크로컨트롤러) 완전한 Linux 커널 구동
오프로드 범위 체크섬, TSO/GRO 패킷 분류, 필터링 네트워킹 + 스토리지 + 보안 전체
프로그래밍 펌웨어 업데이트만 P4, BPF offload 풀 SDK (DOCA, DPDK, BPF 등)
사용 사례 일반 서버 패킷 처리 가속 클라우드 인프라, bare-metal-as-a-service
대표 제품 Intel X710, Mellanox CX-5 Netronome NFP, Xilinx SN1000 BlueField-3, Intel IPU, AMD Pensando

DPU 하드웨어 아키텍처

DPU (Data Processing Unit) ARM SoC ARM Cortex-A78 Linux Kernel (독립 OS) DRAM 8~16GB eMMC / NVMe OOB Management (BMC/IPMI/NC-SI) Hardware Accelerators eSwitch (TC flower HW) Crypto Engine (IPsec/TLS) RegEx Engine (DPI/IDS) Compress/Decomp (zlib/LZ4) Programmable Pipeline (P4/RTC) Network Ports Port 0 100/200/400GbE Port 1 100/200/400GbE RoCE/RDMA Engine (GPUDirect, NVMe-oF) SR-IOV VF / VDPA / Virtio PCIe Gen4/5 x16 Interface (호스트 연결) PF0 (네트워크) | PF1 (RDMA) | VF0~VFn (SR-IOV) | SF0~SFn (Scalable Functions) Host CPU (x86/ARM) mlx5_core / ice 드라이버 VF Representor Ports OVS / TC flower VM / Container

DPU의 핵심 특징은 완전한 Linux 커널을 자체 ARM SoC에서 구동한다는 점입니다. 호스트와 독립적인 OS를 실행하면서 네트워크, 스토리지, 보안 서비스를 제공하고, 호스트에는 SR-IOV VF나 Virtio 디바이스만 노출합니다. 이로써 호스트 OS가 침해되더라도 인프라 서비스(방화벽, 암호화, 스토리지 가상화)의 무결성이 유지됩니다.

주요 DPU/IPU 제품군

제조사제품SoC네트워크커널 드라이버핵심 특징
NVIDIA BlueField-3 16x ARM A78 + HW 가속 2x400GbE mlx5_core DOCA SDK, OVS-DOCA offload, GPUDirect, Crypto, RegEx
Intel IPU E2000 (Mount Evans) 16x ARM Neoverse N1 + FPGA 2x200GbE idpf IPDK (Infrastructure PDK), P4 프로그래밍, QAT 연동
AMD Pensando DSC-200 ARM A72 + P4 파이프라인 2x200GbE ionic P4 기반 프로그래밍, flow-aware 가속, 하드웨어 방화벽
Marvell OCTEON 10 DPU 36x ARM N2 + 가속기 2x400GbE octeontx2 인라인 IPsec, MACsec, OVS offload, 저전력
Broadcom Stingray PS1100R 8x ARM A72 2x100GbE bnxt_en TruFlow, 하드웨어 OVS, 인라인 crypto
Intel E810 (고급 NIC) 4x100GbE / 2x100GbE ice DDP 파이프라인 확장, VXLAN/GENEVE tunnel offload, tc flower, SR-IOV 256 VF
E810 위치: Intel E810은 ARM SoC를 내장한 DPU가 아니라 고급 SmartNIC입니다. DDP(Dynamic Device Personalization)로 파서 파이프라인을 확장할 수 있어 일부 DPU 수준의 프로그래밍이 가능하며, VXLAN, GENEVE, GTP 등 터널 프로토콜의 하드웨어 encap/decap을 지원합니다. 완전한 DPU 기능이 필요한 경우 Intel IPU E2000(idpf)을 검토하세요.

DPU 오프로드 기능 상세

오프로드 기능설명성능 효과커널 인터페이스
OVS TC flower offload 가상 스위치 플로우 규칙을 NIC eSwitch로 이동 호스트 CPU ~90% 감소, 지연 ~5x 개선 tc flower + switchdev
IPsec inline crypto ESP 암호화/복호화를 NIC에서 수행 라인 레이트 IPsec (100Gbps+) xfrm_dev_offload
TLS/kTLS offload TLS 레코드 암호화를 NIC으로 오프로드 웹서버 TLS CPU 오버헤드 제거 TLS_TX_ZEROCOPY_RO
VXLAN/Geneve encap 터널 캡슐화/해제를 HW에서 수행 오버레이 네트워크 성능 향상 tc tunnel_key
Connection tracking conntrack을 NIC에서 처리 stateful 방화벽 CPU 오프로드 tc ct action
NVMe-oF / virtio-blk 원격 스토리지 접근을 DPU에서 처리 스토리지 가상화 오버헤드 제거 nvme-rdma / vhost
RegEx / DPI 정규식 매칭으로 딥 패킷 인스펙션 IDS/IPS 처리 가속 (400Gbps+) DOCA RegEx API
Compression 데이터 압축/해제 하드웨어 가속 스토리지/네트워크 데이터 압축 오프로드 DOCA Compress API

커널의 DPU 지원 서브시스템

리눅스 커널은 DPU를 지원하기 위해 여러 서브시스템을 활용합니다. 핵심은 devlink(디바이스 구성), switchdev(eSwitch 제어), representor port(VF/SF를 호스트에서 관리), auxiliary bus(다기능 디바이스 분할)입니다.

User Space devlink (iproute2) tc / OVS ip xfrm ethtool DOCA SDK Kernel Subsystems devlink switchdev (eSwitch 모드) TC subsystem (flower + ct) auxiliary_bus (SF, RDMA, vDPA) xfrm offload (IPsec HW) Representor Ports (PF rep, VF rep, SF rep) vDPA / virtio / vhost 서브시스템 DPU 드라이버 mlx5_core (NVIDIA) idpf (Intel IPU) ionic (AMD Pensando) octeontx2 (Marvell)

devlink은 DPU/SmartNIC를 관리하는 핵심 커널 인터페이스입니다. eSwitch 모드 전환, 포트 기능 설정, 리소스 할당, 펌웨어 관리, 헬스 리포터 등을 통합적으로 제어합니다.

# ━━━ devlink 기본 관리 ━━━

# DPU 디바이스 목록 조회
devlink dev show
# pci/0000:03:00.0: fw.mgmt 24.39.1002 fw.app 24.39.1002

# 펌웨어 버전 상세 조회
devlink dev info pci/0000:03:00.0
# driver: mlx5_core
# fw.mgmt: 24.39.1002
# fw.undi: 14.32.17
# fw.psid: MT_0000000835

# ━━━ eSwitch 모드 전환 ━━━

# legacy 모드 → switchdev 모드 (eSwitch 활성화)
# ⚠️ 모드 전환 시 네트워크 순간 단절 발생
devlink dev eswitch set pci/0000:03:00.0 mode switchdev

# eSwitch 인라인 모드 설정 (매칭 깊이)
devlink dev eswitch set pci/0000:03:00.0 inline-mode transport

# 현재 eSwitch 모드 확인
devlink dev eswitch show pci/0000:03:00.0
# mode switchdev inline-mode transport encap-mode basic

# ━━━ SR-IOV VF 관리 ━━━

# VF 생성 (PCIe SR-IOV)
echo 8 > /sys/class/net/enp3s0f0np0/device/sriov_numvfs

# VF의 MAC, VLAN, 대역폭 설정
ip link set enp3s0f0np0 vf 0 mac 00:11:22:33:44:55
ip link set enp3s0f0np0 vf 0 vlan 100
ip link set enp3s0f0np0 vf 0 max_tx_rate 10000  # Mbps

# VF representor 포트 확인 (switchdev 모드에서 자동 생성)
ip link show | grep "enp3s0f0np0_"
# enp3s0f0np0_0  ← VF0 representor
# enp3s0f0np0_1  ← VF1 representor

# ━━━ Scalable Functions (SF) ━━━

# SF 생성 (SR-IOV VF의 경량 대안, BlueField/ConnectX-7+)
devlink port add pci/0000:03:00.0 flavour pcisf pfnum 0 sfnum 88
devlink port function set pci/0000:03:00.0/32768 hw_addr 00:00:00:00:88:88 state active

# SF 포트 기능 설정
devlink port function set pci/0000:03:00.0/32768 \
    roce true \
    migratable true \
    ipsec_crypto true \
    ipsec_packet true

# SF의 auxiliary 디바이스 활성화
devlink port function set pci/0000:03:00.0/32768 state active

# 생성된 SF 확인
devlink port show pci/0000:03:00.0/32768
# pci/0000:03:00.0/32768: type eth netdev en3f0pf0sf88 flavour pcisf
#   controller 0 pfnum 0 sfnum 88 splittable false
#   function: hw_addr 00:00:00:00:88:88 state active opstate attached
SF vs VF:
  • VF(Virtual Function)는 PCIe SR-IOV 하드웨어 기반으로 생성 수가 제한적(보통 128~256개)이며, PCI 구성 공간을 소비합니다
  • SF(Scalable Function)는 소프트웨어 정의 방식으로 수천 개 생성 가능하며, 각 SF가 독립적인 네트워크 디바이스 + RDMA + crypto 기능을 가집니다
  • SF는 auxiliary_bus를 통해 커널에 등록되며, mlx5_core.sf.X 형태의 auxiliary 디바이스로 관리됩니다
  • 컨테이너 환경에서는 SF가 VF보다 유연하며, 마이그레이션 지원이 용이합니다

Representor Port 아키텍처

Representor port는 switchdev 모드에서 DPU가 호스트 측에 노출하는 가상 netdev입니다. 각 VF/SF에 대응하는 representor가 생성되어, 호스트에서 TC flower 규칙을 통해 VF/SF 트래픽을 제어할 수 있습니다. 이는 OVS offload의 핵심 메커니즘입니다.

/* drivers/net/ethernet/mellanox/mlx5/core/eswitch.h */
struct mlx5_eswitch_rep {
    struct mlx5_eswitch *esw;
    u16 vport;                      /* 연결된 VF/SF의 vport 번호 */
    u16 vlan;                       /* 기본 VLAN */
    struct net_device *netdev;       /* representor netdev */
    struct mlx5_flow_handle *send_to_vport_rule;
    struct mlx5e_rep_priv *rep_data;
};

/* Representor의 역할:
 * 1. VF/SF로 향하는 slow-path 패킷의 수신/송신 경로
 * 2. TC flower 규칙의 연결점 (representor에 규칙 설치 → eSwitch HW로 오프로드)
 * 3. OVS 브릿지의 포트로 연결 (ovs-vsctl add-port br0 enp3s0f0np0_0)
 * 4. conntrack offload의 앵커 포인트
 */

/* drivers/net/ethernet/mellanox/mlx5/core/en_rep.c */
static const struct net_device_ops mlx5e_netdev_ops_rep = {
    .ndo_open         = mlx5e_rep_open,
    .ndo_stop         = mlx5e_rep_close,
    .ndo_start_xmit   = mlx5e_xmit,           /* slow-path 송신 */
    .ndo_setup_tc     = mlx5e_rep_setup_tc,   /* TC flower 오프로드 진입점 */
    .ndo_get_stats64  = mlx5e_rep_get_stats,  /* HW 카운터 기반 통계 */
};

OVS TC Flower Offload 동작 원리

Open vSwitch(OVS)는 가상 스위칭의 표준이지만, 소프트웨어 처리로 인해 CPU 오버헤드가 큽니다. DPU의 eSwitch를 활용하면 OVS 플로우를 하드웨어로 오프로드하여 호스트 CPU 사용을 90% 이상 줄일 수 있습니다.

# ━━━ OVS-DPDK + TC Flower HW Offload 설정 ━━━

# 1. eSwitch를 switchdev 모드로 전환
devlink dev eswitch set pci/0000:03:00.0 mode switchdev

# 2. OVS에서 하드웨어 오프로드 활성화
ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
ovs-vsctl set Open_vSwitch . other_config:tc-policy=skip_sw

# 3. OVS 브릿지에 PF와 VF representor 연결
ovs-vsctl add-br br-int
ovs-vsctl add-port br-int enp3s0f0np0       # PF (uplink)
ovs-vsctl add-port br-int enp3s0f0np0_0     # VF0 representor
ovs-vsctl add-port br-int enp3s0f0np0_1     # VF1 representor

# 4. 오프로드 동작 흐름:
#   a) 첫 패킷: eSwitch → representor → OVS userspace → flow 결정
#   b) OVS가 TC flower 규칙을 representor에 설치
#   c) 드라이버가 TC flower → eSwitch HW 규칙으로 변환
#   d) 이후 패킷: eSwitch HW에서 직접 포워딩 (CPU 바이패스)

# 오프로드된 플로우 확인
tc -s filter show dev enp3s0f0np0_0 ingress
# filter protocol ip pref 2 flower chain 0
#   eth_type ipv4
#   src_ip 10.0.0.5
#   dst_ip 10.0.0.10
#   in_hw in_hw_count 1    ← HW 오프로드 확인
#     action order 1: mirred (Egress Redirect to device enp3s0f0np0_1)
#     hw_stats immediate

# OVS 오프로드 통계 확인
ovs-appctl dpctl/dump-flows type=offloaded
# recirc_id(0),in_port(2),eth(...),ipv4(src=10.0.0.5,dst=10.0.0.10,...)
# packets:1523400, bytes:97497600, used:0.001s, flags:SFPR
OVS Offload 제한사항:
  • 모든 OVS 액션이 HW 오프로드 가능한 것은 아닙니다. ct()(conntrack), output, set() 등 기본 액션은 지원되지만, learn(), clone() 등 복잡한 액션은 소프트웨어 폴백됩니다
  • eSwitch의 HW 플로우 테이블 크기가 유한합니다 (보통 수백만 엔트리). 초과 시 자동 소프트웨어 폴백
  • conntrack offload는 지원 연결 수와 타임아웃 동작이 소프트웨어 conntrack과 다를 수 있습니다
  • VXLAN/Geneve 등 오버레이 터널의 캡슐화/해제도 HW 오프로드 가능하지만, 드라이버와 펌웨어 버전에 따라 지원 범위가 다릅니다

auxiliary_bus: DPU 다기능 디바이스 분할

심화 문서: auxiliary_bus의 자료구조, 2단계 등록, 메모리 소유권 모델, 디버깅 기법 등을 상세히 다루는 Auxiliary Bus (보조 버스) 심화 페이지를 참고하세요.

auxiliary_bus는 하나의 PCIe 디바이스가 여러 기능(네트워크, RDMA, crypto, vDPA 등)을 독립적인 커널 드라이버에 분배하기 위한 메커니즘입니다. DPU처럼 다기능 디바이스에서 핵심적인 역할을 합니다.

/* include/linux/auxiliary_bus.h */
struct auxiliary_device {
    struct device dev;
    const char *name;   /* "mlx5_core.eth.0", "mlx5_core.rdma.0" 등 */
    u32 id;
};

struct auxiliary_driver {
    int (*probe)(struct auxiliary_device *adev,
                const struct auxiliary_device_id *id);
    void (*remove)(struct auxiliary_device *adev);
    const char *name;
    struct device_driver driver;
    const struct auxiliary_device_id *id_table;
};

/* mlx5 DPU에서 auxiliary_bus 활용 예시:
 *
 * mlx5_core (PCI 드라이버)
 *   ├── mlx5_core.eth.0     → mlx5e (이더넷 netdev)
 *   ├── mlx5_core.rdma.0    → mlx5_ib (RDMA/RoCE)
 *   ├── mlx5_core.vnet.0    → mlx5_vnet (vDPA - virtio 에뮬레이션)
 *   ├── mlx5_core.sf.88     → Scalable Function #88
 *   └── mlx5_core.crypto.0  → Crypto offload
 *
 * 각 기능이 독립 드라이버로 동작하며, 개별 로드/언로드 가능
 */

/* Scalable Function 등록 (drivers/net/ethernet/mellanox/mlx5/core/sf/) */
static int mlx5_sf_dev_probe(struct auxiliary_device *adev,
                             const struct auxiliary_device_id *id)
{
    struct mlx5_sf_dev *sf_dev = container_of(adev, struct mlx5_sf_dev, adev);
    struct mlx5_core_dev *mdev;

    mdev = mlx5_sf_dev_to_mdev(sf_dev);
    /* SF용 mlx5_core_dev 초기화 → 독립 netdev + RDMA + crypto 생성 */
    return mlx5_init_one(mdev);
}

IPsec / TLS 인라인 암호화 오프로드

DPU는 IPsec ESP와 TLS(kTLS)의 암호화/복호화를 하드웨어에서 수행하여 라인 레이트 암호화를 제공합니다. 커널의 xfrm_dev_offload 인터페이스를 통해 SA를 NIC에 직접 설치합니다.

/* include/net/xfrm.h — 하드웨어 오프로드 구조체 */
struct xfrm_dev_offload {
    struct net_device *dev;
    struct net_device *real_dev;  /* bond/vlan의 실제 HW 디바이스 */
    unsigned long offload_handle; /* 드라이버의 HW 오브젝트 핸들 */
    u8 dir : 2;                  /* XFRM_DEV_OFFLOAD_IN/OUT */
    u8 type : 2;                 /* CRYPTO (암호만) / PACKET (전체) */
    u8 flags : 2;
};

/* IPsec 오프로드 타입:
 * XFRM_DEV_OFFLOAD_CRYPTO — 암호화/복호화만 HW, 헤더 처리는 SW
 *   → ESP trailer/header는 커널이 추가, 암호 연산만 NIC 가속
 *   → 대부분의 NIC에서 지원 (ConnectX-6+, E810)
 *
 * XFRM_DEV_OFFLOAD_PACKET — 전체 IPsec 처리를 HW에서 수행
 *   → ESP 헤더 추가, SPI 매칭, anti-replay, 암호화 모두 NIC
 *   → 호스트 CPU 관여 0%. 최대 성능
 *   → BlueField-2/3에서 지원 (full offload)
 */

/* mlx5 드라이버의 IPsec offload 등록 */
/* drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c */
static const struct xfrmdev_ops mlx5e_ipsec_xfrmdev_ops = {
    .xdo_dev_state_add    = mlx5e_xfrm_add_state,    /* SA를 HW에 설치 */
    .xdo_dev_state_delete = mlx5e_xfrm_del_state,    /* HW SA 삭제 */
    .xdo_dev_state_free   = mlx5e_xfrm_free_state,   /* 리소스 해제 */
    .xdo_dev_offload_ok   = mlx5e_ipsec_offload_ok,  /* 오프로드 가능 여부 확인 */
    .xdo_dev_policy_add   = mlx5e_xfrm_add_policy,   /* SP를 HW에 설치 */
    .xdo_dev_policy_delete= mlx5e_xfrm_del_policy,
};
# ━━━ IPsec HW Offload 설정 예시 ━━━

# 1. 디바이스의 IPsec offload 지원 확인
ethtool -k enp3s0f0np0 | grep esp
# esp-hw-offload: on
# esp-tx-csum-hw-offload: on

# 2. IPsec SA 추가 시 offload 지정
ip xfrm state add \
    src 10.0.0.1 dst 10.0.0.2 \
    proto esp spi 0x1000 mode transport \
    aead "rfc4106(gcm(aes))" 0x$(openssl rand -hex 20) 128 \
    offload dev enp3s0f0np0 dir out   # ← HW offload 지정

ip xfrm state add \
    src 10.0.0.2 dst 10.0.0.1 \
    proto esp spi 0x2000 mode transport \
    aead "rfc4106(gcm(aes))" 0x$(openssl rand -hex 20) 128 \
    offload dev enp3s0f0np0 dir in

# 3. packet offload (full offload — BlueField-2/3)
ip xfrm state add \
    src 10.0.0.1 dst 10.0.0.2 \
    proto esp spi 0x3000 mode tunnel \
    aead "rfc4106(gcm(aes))" 0x$(openssl rand -hex 20) 128 \
    offload packet dev enp3s0f0np0 dir out  # ← packet 전체 오프로드

# 4. HW offload 상태 확인
ip xfrm state list
# ... offload type packet dev enp3s0f0np0 dir out ...

# 5. kTLS offload (TLS 1.3)
ethtool -k enp3s0f0np0 | grep tls
# tls-hw-tx-offload: on
# tls-hw-rx-offload: on
# tls-hw-record: on

# nginx에서 kTLS + HW offload 활용 (커널 5.2+)
# setsockopt(fd, SOL_TLS, TLS_TX, ...) → 커널이 자동 HW 오프로드

DPU 스토리지 오프로드

DPU는 네트워크뿐만 아니라 스토리지 가상화도 오프로드합니다. NVMe-oF(NVMe over Fabrics) 타겟을 DPU에서 실행하거나, virtio-blk 백엔드를 DPU의 ARM에서 처리하여 호스트 CPU를 완전히 해방시킵니다.

스토리지 오프로드동작 방식효과
NVMe-oF SNAP DPU가 NVMe-oF initiator를 에뮬레이트하여 호스트에 로컬 NVMe 디스크처럼 노출 원격 스토리지를 로컬처럼 사용, 호스트 드라이버 불필요
virtio-blk SNAP DPU ARM에서 virtio-blk 백엔드를 실행, 호스트 VM에 virtio 디스크 제공 QEMU vhost-user 불필요, 스토리지 I/O CPU 오버헤드 제거
RDMA/RoCE 가속 NVMe-oF RDMA 트랜스포트를 DPU RNIC에서 처리 제로카피 원격 스토리지 접근, μs 단위 지연
GPUDirect Storage GPU ↔ DPU 간 직접 DMA로 스토리지 데이터 전달 CPU/시스템 메모리 바이패스, AI/HPC 워크로드 최적화
# ━━━ NVMe-oF SNAP (BlueField DPU) ━━━

# DPU ARM 측에서 NVMe-oF SNAP 컨트롤러 생성
# → 호스트에 가상 NVMe 디바이스가 나타남

# 1. SNAP 서비스 시작 (DPU ARM에서)
snap_rpc.py controller_nvme_create \
    --pf_id 0 \
    --nqn nqn.2022-01.com.nvidia:subsys1

# 2. 원격 NVMe-oF 타겟 연결
snap_rpc.py subsystem_nvme_create \
    --nqn nqn.2022-01.com.nvidia:subsys1 \
    --trtype rdma \
    --traddr 192.168.100.10 \
    --trsvcid 4420

# 호스트에서 확인 (별도 드라이버 불필요)
nvme list
# /dev/nvme0n1  SNAP Virtual NVMe  1.95 TB

# ━━━ vDPA (virtio DataPath Acceleration) ━━━

# DPU에서 vDPA 디바이스 생성 → VM에 virtio-net HW 가속 제공
# 호스트 커널의 vDPA bus + vhost-vdpa로 QEMU에 연결

# 1. vDPA management 디바이스 확인
vdpa mgmtdev show
# auxiliary/mlx5_core.sf.4:
#   supported_classes net

# 2. vDPA 디바이스 생성
vdpa dev add name vdpa0 mgmtdev auxiliary/mlx5_core.sf.4 \
    mac 00:11:22:33:44:55 max_vqp 8

# 3. QEMU에서 vhost-vdpa 디바이스로 VM에 연결
# -netdev vhost-vdpa,vhostdev=/dev/vhost-vdpa-0,id=vdpa0
# -device virtio-net-pci,netdev=vdpa0

DPU 보안 아키텍처

DPU의 가장 중요한 가치 중 하나는 인프라 보안의 격리입니다. 호스트 OS와 독립된 신뢰 도메인에서 보안 서비스를 실행하여, 호스트가 침해되더라도 인프라 무결성을 유지합니다.

보안 기능설명구현
Hardware Root of Trust DPU 부팅 시 ROM → 부트로더 → OS까지 서명 체인 검증 Secure Boot + TPM 2.0 on ARM
호스트 격리 호스트 OS가 DPU의 ARM OS를 변조 불가 PCIe 기반 분리, restricted 모드
인라인 방화벽 모든 네트워크 트래픽이 DPU eSwitch를 통과 CT offload, TC flower, stateful FW
인라인 암호화 IPsec/TLS를 와이어 스피드로 처리 AES-GCM, ChaCha20 HW 엔진
DPI/IDS RegEx 엔진으로 패턴 매칭 가속 Hyperscan 호환 HW RegEx
감사 및 로깅 DPU에서 독립적으로 트래픽 미러링/로깅 sFlow, IPFIX HW export
# ━━━ BlueField DPU 보안 모드 설정 ━━━

# DPU 동작 모드 확인 (mlxconfig)
mlxconfig -d /dev/mst/mt41692_pciconf0 query | grep -i "internal_cpu"
# INTERNAL_CPU_MODEL = EMBEDDED_CPU(1)

# 호스트 권한 모드 설정
# Privileged:    호스트가 DPU PF를 직접 제어 (개발/테스트용)
# Restricted:    DPU ARM이 모든 제어권 보유, 호스트는 VF만 사용
# Restricted+:   호스트가 DPU 리셋/재부팅도 불가
mlxconfig -d /dev/mst/mt41692_pciconf0 set INTERNAL_CPU_PAGE_SUPPLIER=ECPF
mlxconfig -d /dev/mst/mt41692_pciconf0 set INTERNAL_CPU_ESWITCH_MANAGER=ECPF
mlxconfig -d /dev/mst/mt41692_pciconf0 set INTERNAL_CPU_OFFLOAD_ENGINE=ENABLED

# ━━━ DPU 기반 격리된 방화벽 ━━━

# DPU ARM에서 nftables 방화벽 실행 (호스트 독립)
# → eSwitch를 통과하는 모든 호스트 트래픽에 적용
# → 호스트 root 권한으로도 우회 불가
nft add table inet host_fw
nft add chain inet host_fw input { type filter hook ingress device enp3s0f0np0 priority 0 \; }
nft add rule inet host_fw input ip saddr != 10.0.0.0/8 drop

# DPU의 독립 로깅 (syslog → 중앙 서버)
# 호스트 침해 시에도 DPU 로그는 보존
DPU 보안 아키텍처의 핵심: Restricted 모드에서 호스트 OS는 DPU의 PF(Physical Function)를 직접 제어할 수 없으며, DPU ARM에서 할당한 VF/SF만 사용할 수 있습니다. 이는 클라우드 환경에서 bare-metal-as-a-service를 구현하는 핵심 메커니즘으로, 테넌트에게 bare metal 성능을 제공하면서도 인프라 보안(방화벽, 암호화, 네트워크 격리)은 DPU에서 강제 적용됩니다.

DPU 프로그래밍 모델

프로그래밍 방식대상장점단점
TC flower + switchdev eSwitch (패킷 분류/포워딩) 표준 커널 API, OVS 연동 매칭/액션 범위 제한적
XDP/BPF offload NIC의 BPF JIT 엔진 유연한 패킷 처리 로직 BPF 명령어 서브셋만 지원
P4 프로그래머블 파이프라인 파싱/매칭/액션 완전 커스텀 제조사별 P4 컴파일러 필요
DOCA SDK (NVIDIA) BlueField ARM + 가속기 고수준 API, RegEx/Compress/Crypto 통합 NVIDIA 전용, 벤더 종속
IPDK (Intel) Intel IPU P4 + DPDK 기반 오픈소스 Intel IPU 전용
ARM Linux 직접 프로그래밍 DPU ARM SoC 완전한 자유도 (임의 데몬/서비스) 직접 개발/유지보수 부담
/* P4 프로그래밍 예시 — DPU의 프로그래머블 파이프라인에서 실행
 * Intel IPU (IPDK) 또는 AMD Pensando에서 P4 컴파일러로 HW 테이블 생성
 */

/* 커스텀 헤더 파싱 및 매칭 */
header custom_header_t {
    bit<16> type_id;
    bit<32> tenant_id;
    bit<16> service_tag;
}

parser CustomParser(packet_in pkt, out headers_t hdr) {
    state start {
        pkt.extract(hdr.ethernet);
        transition select(hdr.ethernet.etherType) {
            0x8100: parse_vlan;
            0x0800: parse_ipv4;
            0xFE01: parse_custom;  /* 커스텀 프로토콜 */
            default: accept;
        }
    }
    state parse_custom {
        pkt.extract(hdr.custom);
        transition parse_ipv4;
    }
}

/* 매칭 테이블: tenant_id 기반 라우팅 */
table tenant_routing {
    key = {
        hdr.custom.tenant_id : exact;
        hdr.ipv4.dstAddr     : lpm;
    }
    actions = {
        forward_to_port;
        apply_encryption;
        drop;
    }
    size = 1048576;  /* 100만 엔트리 */
}

DPU 모니터링 및 디버깅

# ━━━ devlink 헬스 리포터 ━━━
# DPU 하드웨어 상태 모니터링

devlink health show pci/0000:03:00.0
# reporter fw_fatal:
#   state healthy error 0 recover 0
# reporter fw:
#   state healthy error 0 recover 0
# reporter vnic:
#   state healthy error 0 recover 0

# 헬스 리포터 상세 덤프
devlink health dump show pci/0000:03:00.0 reporter fw

# ━━━ eSwitch 플로우 카운터 ━━━
# HW 오프로드된 플로우의 패킷/바이트 통계

tc -s filter show dev enp3s0f0np0_0 ingress
# filter ... flower ...
#   Sent 98234567 bytes 1523400 pkt (hardware)
#   action ... mirred ... (hardware)
#     Sent 98234567 bytes 1523400 pkt

# ━━━ DPU 리소스 사용량 ━━━

# 사용 가능한 HW 리소스 조회
devlink resource show pci/0000:03:00.0
# name flow_table size 4194304 occ 152340
# name flow_counter size 16777216 occ 304680
# name encap_entries size 65536 occ 1024

# ━━━ ethtool 확장 통계 ━━━

ethtool -S enp3s0f0np0 | grep -E "offload|hw_"
# rx_vport_rdma_unicast_packets: 4523100
# tx_vport_rdma_unicast_packets: 3891200
# rx_hw_timestamp: 15234001

# ━━━ SF/VF 개별 통계 ━━━

# Scalable Function 상태 확인
devlink port function show pci/0000:03:00.0/32768
# function:
#   hw_addr 00:00:00:00:88:88 state active opstate attached
#   roce true migratable true ipsec_crypto true

# ━━━ 디버깅 팁 ━━━
# HW offload 문제 시: skip_hw → skip_sw 순서로 테스트
# 1단계: skip_hw로 SW 경로에서 규칙이 올바른지 확인
tc filter add dev rep0 ingress flower ... action ... skip_hw
# 2단계: skip_sw로 HW 전용으로 전환, in_hw 확인
tc filter add dev rep0 ingress flower ... action ... skip_sw

# 오프로드 실패 원인 확인 (커널 로그)
dmesg | grep -i "offload\|eswitch\|flower"
# mlx5_core: TC flower offload failed: -EOPNOTSUPP (지원 안 되는 액션)
# mlx5_core: flow table full, falling back to software
DPU 운영 시 주요 주의사항:
  • 펌웨어-드라이버 호환성 — DPU 펌웨어와 호스트 커널 드라이버 버전 불일치는 오프로드 실패의 주요 원인입니다. NVIDIA의 경우 MLNX_OFED/DOCA 버전 매트릭스를 확인하세요
  • eSwitch 모드 전환 — legacy ↔ switchdev 전환 시 수 초간 네트워크 중단 발생. 운영 중 전환은 유지보수 윈도우에서만 수행
  • DPU ARM OS 업데이트 — DPU의 ARM Linux 커널/rootfs 업데이트 시 DPU 재부팅 필요. 호스트와 독립적이지만 네트워크 경로 단절 발생
  • HW 플로우 테이블 한계 — eSwitch의 HW 플로우 테이블은 유한합니다(수백만 엔트리). microflow가 많은 환경에서는 aging/eviction 정책 조율 필요
  • 열 관리 — 400GbE DPU는 75W+ 전력을 소비합니다. 적절한 서버 냉각 확보 필수
  • CT offload 차이 — 하드웨어 conntrack은 소프트웨어 conntrack과 타임아웃, 최대 연결 수 등이 다를 수 있습니다. 사전 검증 필요
SmartNIC/DPU 선택 가이드:
  • 클라우드/가상화 환경 — NVIDIA BlueField DPU가 주류. OVS offload + DOCA SDK + GPUDirect 생태계가 가장 성숙
  • 통신사/네트워크 기능 — Intel IPU(P4 프로그래밍) 또는 AMD Pensando(하드웨어 P4 파이프라인)가 적합
  • 순수 패킷 처리 가속 — Netronome NFP(XDP HW offload)가 BPF 오프로드에 최적화
  • Intel 서버 통합 — Intel E810(ADQ + QAT 연동) 또는 IPU E2000
  • 저전력/고밀도 — Marvell OCTEON 10이 전력 효율 우수
관련 문서: DPDK에서 유저스페이스 고성능 패킷 처리 프레임워크 (EAL, PMD, rte_mbuf, Ring, Mempool, AF_XDP, OVS-DPDK) 관련 내용을 확인하세요.
필수 관련 문서: 참고 문서: