eSwitch (Embedded Switch)

eSwitch(embedded Switch)는 SmartNIC/DPU에서 호스트와 VF/SF 간의 네트워크 트래픽을 하드웨어에서 직접 스위칭하는 기능을 제공합니다. switchdev 모드를 통해 TC flower 규칙의 하드웨어 오프로드가 가능하며, OVS-DPDK와 결합하여 가상 스위칭의 성능 병목 문제를 해결합니다. 커널 내부 데이터 경로, 핵심 자료구조/API, 운영 환경 튜닝 포인트와 장애 디버깅 절차까지 실무 관점으로 다룹니다.

전제 조건: 네트워크 스택네트워크 디바이스 드라이버 문서를 먼저 읽으세요. 고성능 패킷 경로는 큐 구조, 메모리 배치, 드롭 위치가 성능을 좌우하므로 드라이버 경계를 먼저 이해하는 것이 중요합니다.

핵심 요약

  • eSwitch — NIC에 내장된 하드웨어 스위치 (PF/VF/SF 간 패킷 라우팅)
  • switchdev 모드 — eSwitch를 커널 브릿지처럼 운영, TC 규칙 HW offload 지원
  • Representor — VF/SF를 나타내는 가상 netdev (호스트에서 제어 가능)
  • TC flower — 트래픽 분류 규칙 (eSwitch HW로 오프로드됨)
  • OVS HW offload — OVS 플로우를 eSwitch에서 직접 처리 (CPU 오버헤드 90%+ 절감)

단계별 이해

  1. Legacy 모드 이해
    기존 SR-IOV 방식. VF는 독립 PCI 함수로 동작하고, PF의 스위칭 기능은 VLAN 태깅만 지원합니다. (자세히 보기)
  2. switchdev 전환
    devlink를 통해 eSwitch를 switchdev 모드로 전환하면 PF가 브릿지 역할을 하고, VF가 포트로 동작합니다. (자세히 보기)
  3. Representor 생성
    각 VF에 대응하는 representor netdev가 생성됩니다. 호스트에서 이 포트를 통해 VF 트래픽을 제어합니다.
  4. TC flower 규칙 설치
    tc 명령어로 representor에 필터 규칙을 설치하면, 드라이버가 이를 eSwitch HW로 변환합니다.
  5. OVS offload 확인
    OVS에서_hw-offload=true 설정 후, ovs-appctl로 offloaded 플로우를 확인합니다.

eSwitch 개요

eSwitch (Embedded Switch)는 Mellanox(NVIDIA) SmartNIC와 DPU에 내장된 하드웨어 스위치입니다. 호스트 PCIe 버스 위에서 PF(Pysical Function)와 VF(Virtual Function), 그리고 SF(Scalable Function) 간의 패킷 스위칭을 NIC 자체에서 수행합니다. 이를 통해 소프트웨어 기반 가상 스위칭의 CPU 오버헤드를 대폭 줄이고, 라인 레이트(초당 패킷 처리) 성능을 달성할 수 있습니다.

실제 사용 시나리오: 하이퍼바이저 VM 네트워크

eSwitch가 실제 환경(하이퍼바이저)에서 어떻게 동작하는지 보여줍니다.

Host OS (커널) NIC Hardware (ASIC) VM 1 veth0 (가상 이더넷) virtio-net-pci VM 2 veth0 (가상 이더넷) vfio-pci veth pair veth pair OVS (Open vSwitch) 가상 스위치 / flow 규칙 저장 브릿지 + TC flower Representor (Host OS) enp3s0f0np0_0 VF0을 나타내는 netdev PCIe 버스 VF0 Virtual Function NIC 내부 PF0 Physical Function uplink (외부 네트워크) eSwitch (ASIC) 하드웨어 스위치 Flow Table TC flower 규칙 저장 External Network 인터넷/업링크 VF ↔ Representor 1:1 매핑 (PCIe) 데이터플로우
핵심 이해:
  • Representor는 Host OS (커널)에 있음 — VF를 나타내는 "가상의 케이블"
  • VF ↔ Representor는 1:1 매핑 — PCIe 버스로 연결됨
  • tc 규칙을 representor에 설치 → 드라이버가 VF의 ASIC 테이블에 저장
  • eSwitch (ASIC) — VF/PF 간 패킷 스위칭을 하드웨어에서 수행

eSwitch는 두 가지 운영 모드를 지원합니다:

eSwitch 아키텍처

eSwitch 아키텍처는 호스트 커널, 드라이버, NIC 펌웨어의 3계층으로 구성됩니다. 각 계층이 역할을 분담하여 하드웨어 오프로드를 가능하게 합니다.

아키텍처 개요

eSwitch/switchdev는 다음 3계층 구조로 구성됩니다. 각 벤더는 동일한 아키텍처를 따르지만, 드라이버와 구현은 다릅니다.

User Space: OVS, tc, iproute2, Network Apps Kernel: TC (Traffic Control) / Switchdev / Bridge / Netfilter OVS flow tc flower bridge NIC Driver (switchdev framework) mlx5 NVIDIA/Mellanox ice Intel rocker Broadcom mv88e6xxx Marvell (DSA) devlink Control Plane API NIC Hardware (eSwitch / Switch ASIC) PF Physical Fn VF0 Virtual Fn VF1...VFn Virtual Fn Representor Host netdev Hardware Switch Flow Table / FDB TC flower 규칙이 HW에 설치되는 공간 VF ↔ Representor 1:1 매핑 (switchdev 모드)

NVIDIA/Mellanox (mlx5) 상세 아키텍처

mlx5 드라이버의 상세 구성 요소입니다.

컴포넌트설명커널 경로
mlx5_coreNIC 기본 드라이버, firmware 관리drivers/net/ethernet/mellanox/mlx5/core/
mlx5e이더넷 netdev 드라이버drivers/net/ethernet/mellanox/mlx5/core/en_*.c
mlx5_eswitcheSwitch 관리 (switchdev 모드)drivers/net/ethernet/mellanox/mlx5/core/eswitch*.c
mlx5e_repRepresentor netdev 드라이버drivers/net/ethernet/mellanox/mlx5/core/en_rep.c

Legacy 모드

Legacy 모드는 eSwitch의 기본 운영 모드입니다. 이 모드에서 eSwitch는 기본적인 VLAN 태깅 기능을 제외한 대부분의 스위칭 기능을 비활성화하고, 전통적인 SR-IOV 방식처럼 VF(Virtual Function)를 독립된 PCI 함수로 동작시킵니다. 이는 하이퍼바이저 기반 가상화 환경에서 가장 일반적으로 사용되는 설정입니다.

Legacy 모드의 기본 동작

Legacy 모드에서 eSwitch는 "passthrough" 모드로 동작합니다. VF는 PF와 독립적으로 작동하며, 각 VF는 직접 PCIe 버스를 통해 호스트와 통신합니다. PF의 스위칭 기능은 다음으로 제한됩니다:

Legacy 모드 아키텍처

eSwitch Legacy 모드: Traditional SR-IOV Host OS (커널) VM 1 virtio-net-pci 또는 vfio-pci VM 2 vfio-pci VF0 직접 할당 PF Driver (mlx5e/ice) VF 관리, 기본 VLAN만 NIC Hardware (ASIC) PF Physical Function uplink 포트 VF0 Virtual Function VM1에 할당 VF1 Virtual Function VM2에 할당 eSwitch Legacy Mode VLAN만 지원 External Network 인터넷/스위치 Legacy 모드 데이터플로우 VF ↔ External: VF → PCIe → 외부 네트워크 (PF 우회) VF ↔ VF: VF0 ↔ PCIe ↔ VF1 (NIC 스위칭 없음, SW 브릿지 필요)
Legacy 모드 특징:
  • VF 직접 할당: VF가 VM에 직접 할당되어 PCIe 함수로 동작
  • 스위칭 없음: VF ↔ VF 통신 시 PF를 거치지 않으며, 호스트에서 소프트웨어 브릿지 필요
  • 제한된 HW 기능: VLAN 태깅만 HW에서 지원, TC 규칙 offload 불가
  • 단순한 설정: SR-IOV 활성화만으로 즉시 사용 가능

Legacy vs Switchdev 모드 비교

특징Legacy 모드Switchdev 모드
스위칭 방식Passthrough (VF ↔ PF 직접)eSwitch HW 스위칭
VF ↔ VF 통신SW 브릿지 필요 (CPU overhead)HW에서 직접 처리
TC Flower Offload❌ 미지원✅ HW offload 가능
VLAN 지원기본 VLAN만다양한 VLAN/VXLAN
Representor❌ 미생성✅ VF당 representor 생성
OVS Offload❌ SW 처리만✅ HW offload 가능
복잡도단순설정 복잡
성능 (VM↔VM)CPU 의존라인레이트
conntrack offload
RDMA 지원VF RDMA만VF RDMA + eSwitch

Legacy 모드 설정 명령어

# ━━━ Legacy 모드 확인 및 설정 ━━━

# 1. 현재 eSwitch 모드 확인 (기본값: legacy)
devlink dev eswitch show pci/0000:03:00.0
# pci/0000:03:00.0: mode legacy inline-mode transport encap mode: NOTSET

# 2. VF 생성 (Legacy 모드에서)
# Legacy 모드에서는 VF를 생성하면 바로 VM에 할당 가능
echo 4 > /sys/bus/pci/devices/0000:03:00.0/sriov_numvfs

# 3. VF 확인
lspci | grep -i "virtual function"
# 03:00.1 Virtual function
# 03:00.2 Virtual function
# 03:00.3 Virtual function

# 4. VF를 VM에 할당 (libvirt 예시)
<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/>
  </source>
</hostdev>

Legacy 모드 사용 시나리오

Legacy 모드는 다음과 같은 상황에서 여전히 유용합니다:

Legacy 모드가 적합한 경우:
  • 단순 VM 네트워크: 각 VM이 외부 네트워크와만 통신하고, VM 간 통신이 필요 없는 경우
  • RDMA 직접 할당: VM에 VF를 직접 할당하여 RDMA를 사용해야 하는 경우 (GPUDirect RDMA)
  • 기존 호환성: 기존 SR-IOV 설정을 유지하고 싶은 경우 (마이그레이션 호환)
  • 제한된 NIC: eSwitch를 지원하지 않는 오래된 NIC에서 SR-IOV를 사용하는 경우
  • 빠른 배포: 복잡한 설정 없이 SR-IOV를 빠르게 구성해야 하는 경우

Legacy 모드의 한계

Legacy 모드에서는 다음과 같은 기능이 제한됩니다:

Legacy 모드 제한사항:
  • TC Flower Offload 불가: 커널 TC 규칙을 HW로 오프로드할 수 없어 모든 패킷이 CPU를 경유
  • VM 간 통신 성능: VF ↔ VF 통신 시 호스트에서 소프트웨어 브릿지를 거치므로 CPU 오버헤드 발생
  • OVS 성능 병목: OVS-DPDK를 사용하더라도 VM ↔ VM 통신은 소프트웨어 처리
  • 제한된 네트워크 기능: VLAN만 지원하며, VXLAN, Geneve, conntrack offload 등 고급 기능 미지원
  • Representor 부재: VF를 제어할 수 있는 representator 포트가 없어 네트워크 정책 적용 어려움
  • 스케일링 제한: 많은 수의 VF를 관리할 때 CPU bottleneck 발생

Legacy 모드에서 Switchdev 모드로 전환

Legacy 모드의 한계를 극복하려면 switchdev 모드로 전환해야 합니다. 전환 과정은 다음과 같습니다:

# ━━━ Legacy → Switchdev 모드 전환 ━━━

# 1. Legacy 모드 상태 확인
devlink dev eswitch show pci/0000:03:00.0
# pci/0000:03:00.0: mode legacy

# 2. 모든 VF 삭제 (필수)
echo 0 > /sys/bus/pci/devices/0000:03:00.0/sriov_numvfs

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

# 4. 전환 확인
devlink dev eswitch show pci/0000:03:00.0
# pci/0000:03:00.0: mode switchdev

# 5. VF 다시 생성 (이제 representor 생성됨)
echo 4 > /sys/bus/pci/devices/0000:03:00.0/sriov_numvfs

# 6. Representor 확인
ip link show
# enp3s0f0np0      <-- PF (uplink)
# enp3s0f0np0_0    <-- VF0 representor
# enp3s0f0np0_1    <-- VF1 representor
전환 전 주의사항:
  • VF에 할당된 모든 VM을 종료해야 합니다
  • 전환 중 네트워크 서비스 중단이 발생합니다
  • VF의 MAC 주소가 변경될 수 있습니다
  • 전환 후 OVS/브릿지 재구성이 필요합니다

Switchdev 모드 전환

eSwitch를 switchdev 모드로 전환하면 PF가 브릿지 역할을 수행하고, 각 VF에 대응하는 representor 포트가 생성됩니다. 이 모드에서만 TC flower 규칙의 하드웨어 오프로드가 가능합니다.

# ━━━ switchdev 모드 전환 ━━━

# 1. 현재 모드 확인 (기본값: legacy)
devlink dev eswitch show pci/0000:03:00.0
# pci/0000:03:00.0: mode legacy inline-mode transport encap mode: NOTSET

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

# 3. 전환 후 모드 확인
devlink dev eswitch show pci/0000:03:00.0
# pci/0000:03:00.0: mode switchdev inline-mode transport encap mode: NOTSET

# 4. VF 생성 (기존 legacy 모드에서 생성된 VF가 있다면 먼저 삭제)
echo 0 > /sys/bus/pci/devices/0000:03:00.0/sriov_numvfs
echo 4 > /sys/bus/pci/devices/0000:03:00.0/sriov_numvfs

# 5. Representor 포트 확인
ip link show
# enp3s0f0np0      <-- PF (uplink)
# enp3s0f0np0_0    <-- VF0 representor
# enp3s0f0np0_1    <-- VF1 representor
# enp3s0f0np0_2    <-- VF2 representor
# enp3s0f0np0_3    <-- VF3 representor
전환 시 주의사항:
  • switchdev 모드 전환 전 모든 VF를 삭제해야 합니다. 기존 VF가 있으면 모드 전환이 거부됩니다.
  • 모드 전환은 네트워크 중단을 유발합니다. 유지보수 시간에 진행하세요.
  • switchdev 모드에서는 VF가 직접 PF의 브릿지 포트로 동작하므로, VF 간 통신이 eSwitch HW에서 처리됩니다.

Switchdev 모드 아키텍처

Switchdev 모드에서 eSwitch는 완전한 L2 스위치로 동작합니다. PF가 브릿지 역할을 수행하고, 각 VF와 SF는 브릿지의 포트로 연결됩니다. 이 구조에서 모든 패킷이 eSwitch 하드웨어를 통과하면서 TC flower 규칙에 기반한 필터링과 포워딩이 가능합니다.

eSwitch Switchdev 모드: Hardware Switching Host OS (커널) OVS (Software Control Plane) 플로우 규칙 관리 enp3s0f0np0_0 VF0 Representor enp3s0f0np0_1 VF1 Representor enp3s0f0np0 (PF) Uplink Representor NIC Hardware (ASIC) PF Physical Function uplink 포트 VF0 Virtual Function VM1에 할당 VF1 Virtual Function VM2에 할당 eSwitch Switchdev Mode Flow Table TC flower 규칙 FDB/VLAN Conntrack External Network 인터넷/스위치 Switchdev 모드 데이터플로우 VF ↔ VF: VF0 ↔ eSwitch(HW) ↔ VF1 (CPU 관여 없이 HW에서 직접 스위칭) VF ↔ External: VF ↔ eSwitch ↔ PF ↔ 외부 네트워크 TC flower 규칙이 eSwitch의 Flow Table에 설치되어 HW에서 패킷 분류/포워딩
Switchdev 모드 핵심 이해:
  • PF = 브릿지: PF가 브릿지 마스터 역할을 수행
  • VF = 포트: 각 VF가 브릿지의 포트로 연결
  • Representor: VF를 대표하는 호스트측 netdev (OVS에 연결)
  • Flow Table: TC flower 규칙이 저장되는 ASIC 테이블
  • HW 스위칭: 모든 패킷이 eSwitch HW를 통과하여 CPU 오버헤드 없음

Switchdev 내부 동작

Switchdev 모드에서 패킷이 어떻게 처리되는지 상세하게 살펴봅니다. 데이터플로우는 fast-path(하드웨어 처리)와 slow-path(소프트웨어 처리)로 나뉩니다.

Fast-Path (하드웨어 처리)

TC flower 규칙이 설치된 후, 매칭되는 패킷은 CPU 관여 없이 하드웨어에서 직접 처리됩니다:

  1. 패킷 수신: NIC가 패킷을 버퍼에 수신
  2. Flow Table 조회: ASIC의 플로우 테이블에서 매칭 규칙 검색 (src/dst IP, port, VLAN, protocol 등)
  3. 액션 수행: 매칭된 규칙의 액션(drop, redirect, vlan-modify 등)을 HW에서 직접 실행
  4. 포워딩: 해당 포트로 패킷 전송 (VF, PF, 또는 다른 representor)

Slow-Path (소프트웨어 처리)

플로우 테이블에 규칙이 없거나, 복잡한 액션이 필요한 경우 패킷이 소프트웨어로 전송됩니다:

  1. 테이블 미스: 플로우 테이블에 매칭 규칙이 없는 경우
  2. CPU 인터럽트: NIC가 CPU로 패킷을 전송 (MSI-X 인터럽트)
  3. 커널 처리: softirq 컨텍스트에서 네트워크 스택 처리
  4. 플로우 학습: OVS/브릿지가 플로우를 분석하여 TC 규칙 생성
  5. 규칙 설치: TC flower 규칙을 representor에 설치하면 HW로 오프로드
# ━━━ Fast-path vs Slow-path 확인 ━━━

# TC flower 규칙의 HW offload 상태 확인
tc -s filter show dev enp3s0f0np0_0 ingress

# 출력 예시 (HW 오프로드 성공):
# filter protocol ip pref 1 flower chain 0
#   eth_type ipv4
#   ip_proto tcp
#   dst_port 80
#   in_hw in_hw_count 1    <-- HW에서 처리됨
#   action order 1: gact action drop

# Slow-path 확인 (in_hw_count 0인 경우)
#   in_hw in_hw_count 0    <-- 소프트웨어에서 처리

Encapsulation Mode (캡슐화 모드)

Switchdev 모드에서 터널링(VXLAN, Geneve 등)을 사용할 때 캡슐화 모드를 설정합니다. 이 설정은 터널 헤더 처리를 하드웨어에서 수행할지 결정합니다.

# ━━━ Encapsulation Mode 설정 ━━━

# 캡슐화 미사용 (기본값)
devlink dev eswitch set pci/0000:03:00.0 encap mode none

# 기본 캡슐화 지원 (VXLAN, Geneve 등)
devlink dev eswitch set pci/0000:03:00.0 encap mode basic

# 캡슐화 모드 확인
devlink dev eswitch show pci/0000:03:00.0
# pci/0000:03:00.0: mode switchdev inline-mode transport encap mode: basic
모드설명사용 시나리오
none캡슐화 미지원, 일반 L2/L3 스위칭만단순 브릿징, VLAN
basicVXLAN, Geneve, NVGRE 등 기본 터널링 지원가상화, 오버레이 네트워크

vDPA (vhost Data Path Acceleration) 지원

mlx5 드라이버는 switchdev 모드에서 vDPA를 지원합니다. vDPA는 VM의 virtio-net 드라이버와 DPU/NIC 간의 데이터패스를 직접 연결하여 성능을 향상시킵니다.

# ━━━ vDPA 설정 (mlx5) ━━━

# 1. vdpa 도구 설치 확인
which vdpa

# 2. vDPA 장치 생성
vdpa mgmtdev show
vdpa dev add name vdpadev0 parent pci/0000:03:00.0

# 3. vDPA 장치 확인
vdpa dev show
# vdpadev0: dummy (0) virtio0: addresses=[58:a8:fa:00:00:01]

# 4. VM에 vDPA 장치 할당 (QEMU)
# -device vhost-vdpa-pci,vdpa=vdpadev0

# 5. vDPA 통계 확인
vdpa -s dev vdpadev0
vDPA 장점:
  • VM의 virtio-net 드라이버가 DPU의 직접 데이터패스에 연결
  • VF 할당 없이도 고성능 네트워킹 가능
  • 호스트 커널 오버헤드 없이 NIC에서 직접 패킷 처리
  • Live migration 지원 (vDPA 장치의 마이그레이션)

Scalable Function (SF)과의 통합

Switchdev 모드에서 SF(Scalable Function)를 사용할 수 있습니다. SF는 VF보다 가벼운 단위로, 더 많은 수의 네트워크 기능을 생성할 수 있습니다.

# ━━━ SF (Scalable Function) 생성 및 관리 ━━━

# 1. SF 영역(resource) 확인
mlxdevm resource show pci/0000:03:00.0 | grep -A5 sf

# 2. SF 생성
mlxdevm port add pci/0000:03:00.0 flavour pcivf vport_index 100

# 3. SF Representor 확인
ip link show
# enp3s0f0np0s0    <-- SF 0 representor
# enp3s0f0np0s1    <-- SF 1 representor

# 4. SF에 IP 주소 할당
ip addr add 10.0.0.1/24 dev enp3s0f0np0s0

# 5. TC flower 규칙 설치 (VF와 동일)
tc qdisc add dev enp3s0f0np0s0 ingress
tc filter add dev enp3s0f0np0s0 ingress protocol ip flower \
    dst_ip 10.0.0.5 action drop

# 6. SF 삭제
mlxdevm port del pci/0000:03:00.0/1

OVS Hardware Offload 상세 설정

Switchdev 모드에서 OVS의 하드웨어 오프로드를 설정하는 상세한 단계입니다.

# ━━━ OVS Hardware Offload 설정 ━━━

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

# 2. VF 생성
echo 4 > /sys/bus/pci/devices/0000:03:00.0/sriov_numvfs

# 3. OVS 데몬 시작 (DPDK 모드)
ovs-vsctl --no-wait set Open_vSwitch . ovs_version=
systemctl start openvswitch

# 4. HW Offload 활성화
ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
ovs-vsctl set Open_vSwitch . other_config:tc-policy=skip_sw
ovs-vsctl set Open_vSwitch . other_config:max-revalidator=100

# 5. 브릿지 생성
ovs-vsctl add-br br-int
ovs-vsctl set bridge br-int datapath_type=netdev

# 6. 포트 추가 (PF + VF Representor)
ovs-vsctl add-port br-int enp3s0f0np0
ovs-vsctl add-port br-int enp3s0f0np0_0
ovs-vsctl add-port br-int enp3s0f0np0_1

# 7. 흐름 규칙 추가
ovs-ofctl add-flow br-int "actions=output:2"
ovs-ofctl add-flow br-int "priority=100,tcp,actions=output:2"

# 8. Offloaded 플로우 확인
ovs-appctl dpctl/dump-flows type=offloaded
# recirc_id(0),in_port(2),eth(...),ipv4(...),packets:1000,bytes:64000,used:0.001s,flags:SFPR

# 9. SW (non-offloaded) 플로우 확인
ovs-appctl dpctl/dump-flows type=sw
# recirc_id(0),in_port(1),eth(...),packets:10,bytes:1280,flags:SP

Conntrack Offload

Switchdev 모드에서 conntrack(연결 추적)을 하드웨어로 오프로드할 수 있습니다. 이를 통해 Stateful firewall 기능을 HW 있습니다. 에서 처리할 수

# ━━━ Conntrack Offload 설정 ━━━

# 1. conntrack 모듈 로드 확인
lsmod | grep nf_conntrack

# 2. NF_CONNTRACK_OFFLOAD 커널 옵션 활성화 (이미 활성화되어 있을 수 있음)
# CONFIG_NF_CONNTRACK_OFFLOAD=y

# 3. Representor에서 conntrack 활성화
modprobe nf_conntrack
modprobe nf_conntrack_netlink

# 4. TC flower로 conntrack 상태 기반 필터링
# new 연결만 특정 VF로 리다이렉트
tc filter add dev enp3s0f0np0_0 ingress protocol ip \
    flower ct_state +trk+new \
    action mirred egress redirect dev enp3s0f0np0_1

# established 연결 허용
tc filter add dev enp3s0f0np0_0 ingress protocol ip \
    flower ct_state +trk+est \
    action mirred egress redirect dev enp3s0f0np0_1

# 5. conntrack 상태 확인
conntrack -L
# tcp      6 431999 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=12345 dport=80

# 6. HW offload 확인
tc -s filter show dev enp3s0f0np0_0 ingress
# ct_state 0x1/0x1 means NEW
# ct_state 0x2/0x2 means ESTABLISHED

VXLAN Offload

VXLAN(Virtual Extensible LAN) 터널의 캡슐화/디캡슐화를 하드웨어에서 처리할 수 있습니다.

# ━━━ VXLAN Offload 설정 ━━━

# 1. eSwitch에서 캡슐화 모드 활성화
devlink dev eswitch set pci/0000:03:00.0 encap mode basic

# 2. VXLAN 디바이스 생성
ip link add vxlan0 type vxlan id 1000 \
    dstport 4789 \
    local 10.0.0.1 \
    remote 10.0.0.2 \
    dev enp3s0f0np0

# 3. 브릿지에 VXLAN 포트 추가
ip link set vxlan0 master br-int

# 4. TC flower로 VXLAN VNI 기반 필터링
tc filter add dev enp3s0f0np0_0 ingress protocol 0x86dd \
    flower enc_src_ip 10.0.0.2 \
    enc_dst_ip 10.0.0.1 \
    enc_key_id 1000 \
    action tunnel_key set \
    src_ip 10.0.0.1 \
    dst_ip 10.0.0.2 \
    dst_port 4789 \
    id 1000 \
    action mirred egress redirect dev enp3s0f0np0_1

# 5. VXLAN offload 확인
ip -d link show vxlan0
# vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
#     vxlan id 1000 remote 10.0.0.2 local 10.0.0.1 srcport 4789 4790
#     noudp6zerocsumrx tx-udp_tnl-csum-segmentation rx-udp_tnl-segmentation

NIC 리소스 관리

Switchdev 모드에서 NIC의 다양한 리소스를 확인하고 관리하는 방법입니다.

# ━━━ NIC 리소스 확인 ━━━

# 1. 전체 리소스 확인
mlxdevm resource show pci/0000:03:00.0

# 2. Flow Table 리소스 확인
mlxdevm resource show pci/0000:03:00.0 | grep -A10 flow_table
# resource: flow_table
#   id: 0
#   size: 16384
#   used: 256
#   max_flows: 8192

# 3. 리소스 풀 확인
mlxdevm resource show pci/0000:03:00.0 | grep -A5 general
# resource: general
#   size: 1000
#   used: 500

# 4. vport 리소스 확인
mlxdevm resource show pci/0000:03:00.0 | grep -A5 vport
# resource: vport
#   size: 64
#   used: 8

# 5. NIC 포트 정보
devlink port show pci/0000:03:00.0
# pci/0000:03:00.0/0: type eth netdev enp3s0f0np0
#   flavor: physical
# pci/0000:03:00.0/1: type eth netdev enp3s0f0np0_0
#   flavor: vport
#   pfnum: 0
#   vport: 0

Failover 및 고가용성

Switchdev 모드에서 링크 failover와 고가용성 설정을 구성합니다.

# ━━━ Failover 설정 ━━━

# 1. Bonding 생성 (PF와 VF Representor)
ip link add bond0 type bond mode active-backup
ip link set enp3s0f0np0 master bond0
ip link set enp3s0f0np0_0 master bond0
ip link set bond0 up

# 2. Mellanox Team 드라이버 (mlx5 Bond)
# mlx5 드라이버는 네이티브 bond 지원
teamdctl bond0 state
# {
#     "runner": {"type": "activebackup"},
#     "link_watches": [ ... ]
# }

# 3. VF 링크 상태 모니터링
# VF 링크 장애 시 자동 리다이렉션 설정
tc qdisc add dev enp3s0f0np0_0 ingress
tc filter add dev enp3s0f0np0_0 ingress protocol all \
    flower action mirred egress redirect dev enp3s0f0np0_1

# 4. LACP (Link Aggregation)
# OVS에서 LACP 설정
ovs-vsctl add-br br-int
ovs-vsctl add-port br-int bond0 bond mode=balance-tcp lacp=active

보안 설정

Switchdev 모드에서 보안을 강화하기 위한 설정들입니다.

# ━━━ Switchdev 보안 설정 ━━━

# 1. VF MAC 주소 고정 ( Spoofing 방지)
ip link set enp3s0f0np0_0 address aa:bb:cc:dd:ee:ff
ip link set enp3s0f0np0_0 type vf mac aa:bb:cc:dd:ee:ff spoofchk on

# 2. VF VLAN 설정 (VLAN 기반 격리)
ip link set enp3s0f0np0_0 type vf vlan 100 qos 0

# 3. VF 트래픽률 제한 (Rate Limiting)
ip link set enp3s0f0np0_0 type vf rate 10000  # 10 Gbps

# 4. Trust 모드 설정 (VF가 보안 기능 우회)
ip link set enp3s0f0np0_0 type vf trust off

# 5. TC flower로 보안 필터링
# 특정 IP만 허용
tc filter add dev enp3s0f0np0_0 ingress protocol ip \
    flower src_ip 10.0.0.0/24 \
    action pass

# 다른 IP는 드롭
tc filter add dev enp3s0f0np0_0 ingress protocol ip \
    flower action drop

# 6. 미사용 VF 비활성화
echo 0 > /sys/bus/pci/devices/0000:03:00.0/sriov_numvfs

모니터링 및 성능 분석

Switchdev 모드의 성능을 모니터링하고 분석하는 도구들입니다.

# ━━━ 성능 모니터링 ━━━

# 1. Representor 통계
ip -s link show enp3s0f0np0_0
# RX: bytes packets errors dropped
# TX: bytes packets errors dropped

# 2. NIC 하드웨어 통계 (ethtool)
ethtool -S enp3s0f0np0_0 | grep -i "vf\|flow\|hw"
# hw_vf_rule_bytes: 123456
# hw_vf_rule_packets: 7890
# rx_vf_messages: 100

# 3. TC 통계
tc -s filter show dev enp3s0f0np0_0 ingress
# Packets: 1000000
# Bytes: 64000000

# 4. 드라이버 통계
cat /sys/class/net/enp3s0f0np0_0/statistics/*
# rx_bytes, rx_packets, rx_dropped, tx_bytes, tx_packets, tx_dropped

# 5. Flow table 사용률
devlink dev flowtable show pci/0000:03:00.0
# pci/0000:03:00.0/flowtable:0
#   size 8192
#   used 1024

# 6. NIC 벤치마크 (perftest)
perftest -z -n 3 -d mlx5_0 -f tx_mcast

Representor 포트

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

벤더별 eSwitch/switchdev 지원

eSwitch(embedded Switch) 및 switchdev 프레임워크는 Mellanox/NVIDIA뿐만 아니라 여러 벤더에서 지원합니다. 각 벤더별 특징과 지원 수준은 다음과 같습니다.

벤더드라이버ASIC/모델지원 레벨특징
NVIDIA/Mellanox mlx5 ConnectX-4/5/6/7, BlueField ⭐⭐⭐⭐⭐ 완전한 eSwitch 지원, SF, RDMA, vDPA 통합
Intel ice E810-XXV, E810-CQ ⭐⭐⭐⭐ eSwitch/switchdev, TC flower, bridge offload
Broadcom rocker Broadcom OF-DPA 호환 ⭐⭐⭐ switchdev 프로토타이핑, L2/L3 offload
Marvell mv88e6xxx 88E6xxx 시리즈 ⭐⭐⭐ DSA 기반, 스위치 칩 통합

Intel (ice 드라이버)

Intel Ethernet Controller E810 시리즈는 Mellanox mlx5 다음으로 eSwitch/switchdev를 지원하는 대표적인 랜카드입니다. ice 드라이버를 통해 TC flower 규칙의 하드웨어 오프로드가 가능합니다.

# ━━━ Intel E810 eSwitch 설정 ━━━

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

# 2. Representor 포트 확인
ip link show
# eth0, eth1, eth2, eth3  <-- VF representor

# 3. hw-tc-offload 활성화
ethtool -K eth0 hw-tc-offload on

# 4. TC flower 규칙 설치
tc qdisc add dev eth0 ingress
tc filter add dev eth0 ingress protocol ip flower \
    dst_ip 10.0.0.5 action drop

# 5. eSwitch 모드 확인
devlink dev eswitch show pci/0000:3b:00.0
# pci/0000:3b:00.0: mode switchdev
Intel E810 요구사항:
  • NVM 펌웨어 v2.50 이상
  • ice 드라이버 v1.5.8 이상
  • iavf (VF) 드라이버 v4.0.1 이상
  • Linux 커널 4.12+

Broadcom (rocker 드라이버)

rocker 드라이버는 Broadcom OF-DPA(Abstract Switch Specification) 기반으로 구현된 switchdev 프로토타이핑용 드라이버입니다. 실제 하드웨어 ASIC 없이도 QEMU에서 테스트가 가능하며, L2 브릿징과 L3 라우팅 offload를 지원합니다.

# ━━━ Broadcom rocker 스위치 설정 ━━━

# rocker 포트 확인 (일반적으로 swp0, swp1, ...)
ip link show
# swp0  <-- 스위치 포트 1
# swp1  <-- 스위치 포트 2

# 브릿지 생성 및 포트 연결
ip link add br0 type bridge
ip link set swp0 master br0
ip link set swp1 master br0

# FDB offload 확인
bridge fdb show
rocker 특징:
  • QEMU 기반 에뮬레이션 지원 (소프트웨어 스위치)
  • Broadcom OF-DPA 스펙 기반
  • L2 브릿지, L3 라우팅 offload 지원
  • 실제 하드웨어 없이 switchdev 테스트 가능

Marvell (DSA/mv88e6xxx)

Marvell 88E6xxx 시리즈는 DSA(Distributed Switch Architecture)를 사용하여 네트워크 스위치 칩을 Linux에 통합합니다. eSwitch와는 slightly 다른 접근 방식이지만, similar 한 기능(포트 representor, TC offload)을 제공합니다.

# ━━━ Marvell mv88e6xxx DSA 설정 ━━━

# DSA 포트 확인 (일반적으로 lan1, lan2, ... 또는 swp0, swp1)
ip link show
# lan1  <-- DSA 포트 1
# lan2  <-- DSA 포트 2
# lan0  <-- CPU 포트 (uplink)

# VLAN 설정
ip link add link lan1 name lan1.10 type vlan id 10
bridge vlan add vid 10 dev lan1

# TC offload (일부 모델만 지원)
ethtool -K lan1 hw-tc-offload on
DSA vs eSwitch: DSA는 스위치 칩이 프로세서에 직접 연결된 임베디드 시스템(라우터, 공유기 등)에서 주로 사용되고, eSwitch는 PCIe 랜카드에 내장된 하드웨어 스위치입니다. 둘 다 switchdev 프레임워크를 통해 통합됩니다.

벤더별 기능 비교

기능mlx5 (NVIDIA)ice (Intel)rocker (Broadcom)mv88e6xxx (Marvell)
switchdev 모드DSA
VF Representor✅ ( DSA)
TC Flower Offload제한적제한적
Bridge Offload
L3 Routing Offload제한적
RDMA/RoCE
vDPA
Scalable Function
VXLAN Offload
Conntrack 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의 앵커 포인트
 */
코드 설명
  • 3-9행 mlx5_eswitch_rep 구조체는 각 representor를 나타냅니다. vport 번호로 실제 VF/SF를 식별하고, netdev 포인터로 호스트의 네트워크 인터페이스에 연결됩니다.
  • 4행 vport는 NIC 내부의 가상 포트 번호로, VF 생성 시 할당됩니다. representor는 이 vport 번호를 통해 실제 VF와 매핑됩니다.
  • 6행 netdev는 호스트에서 보이는 네트워크 인터페이스입니다. enp3s0f0np0_0 형태로 명명됩니다.
  • 12행 TC flower 규칙이 representor에 설치되면, 드라이버가 이를 eSwitch HW의 플로우 테이블에 설치합니다. 이후 해당 트래픽은 CPU 관여 없이 HW에서 처리됩니다.
/* 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_rep_xmit,         /* slow-path 송신 */
    .ndo_setup_tc     = mlx5e_rep_setup_tc,     /* TC flower offload 진입점 */
    .ndo_get_stats64  = mlx5e_rep_get_stats,    /* HW 카운터 기반 통계 */
    .ndo_set_rx_mode  = mlx5e_rep_set_rx_mode,  /* unicast/multiucast 필터 */
};

Representor 이해하기: "가상의 케이블"

Representor는 가장 중요한 개념 중 하나입니다. "가상의 케이블"로 생각하면 이해하기 쉽습니다.

Representor: "가상의 케이블" Host OS (커널 공간) Representor Netdev enp3s0f0np0_0 ( VF0을 나타내는 "가상의 케이블" ) VM1 (vfio-pci 또는 virtio) VF 연결 NIC Hardware ( ASIC) VF0 Virtual Function ( 실제 PCIe 가상 디바이스 ) 1:1 매핑 관계 VF를 나타내는 representor VF ↔ Representor = 같은 토폴로지 네트워크 tc filter를 representor에 설치 → 드라이버가 VF의 ASIC 테이블에 같은 규칙 생성
핵심 이해:
  • Representor는 VF의 "호스트측 복사본"입니다
  • VF로 가는 트래픽을 호스트에서 모니터링/제어할 수 있게 해줍니다
  • tc filter를 representor에 설치하면 실제 VF의 ASIC에 규칙이 들어갑니다
  • VM이 직접 VF를 사용해도, representor를 통해 네트워크를 제어할 수 있습니다

TC Flower Offload

TC flower는 Linux 트래픽 제어(traffic control)의 필터 매칭 규칙입니다. switchdev 모드에서는 이 규칙이 eSwitch 하드웨어로 오프로드되어, CPU 처리 없이 NIC에서 직접 패킷을 분류하고 액션을 수행합니다.

# ━━━ TC Flower Offload 설정 예시 ━━━

# 1. 기본 ingress qdisc 설정 (필수)
tc qdisc add dev enp3s0f0np0_0 ingress

# 2. TC flower 규칙 추가 (VLAN 필터링 + VLAN 태그 제거 후 다른 VF로 포워딩)
tc filter add dev enp3s0f0np0_0 ingress \
    protocol 802.1Q \
    flower \
    vlan_id 100 \
    action vlan pop \
    action mirred egress redirect dev enp3s0f0np0_1

# 3. IP/Port 기반 필터링 (L4 액션)
tc filter add dev enp3s0f0np0_0 ingress \
    protocol ip \
    flower \
    ip_proto tcp \
    dst_port 80 \
    action drop

# 4. conntrack 상태 기반 필터링
tc filter add dev enp3s0f0np0_0 ingress \
    protocol ip \
    flower \
    ct_state +trk+new \
    action mirred egress redirect dev enp3s0f0np0_1

# 5. 오프로드 상태 확인 (in_hw_count가 1이면 HW 오프로드 성공)
tc -s filter show dev enp3s0f0np0_0 ingress
# filter protocol ip pref 1 flower chain 0
#   eth_type ipv4
#   ip_proto tcp
#   dst_port 80
#   in_hw in_hw_count 1    <-- HW 오프로드 확인
#   action order 1: gact action drop

TC Offload 처리 흐름

TC flower 규칙이 설치된 후, 패킷은 fast-path(하드웨어에서 직접 처리)와 slow-path(소프트웨어에서 처리)로 나뉩니다.

TC Flower Offload: Fast-Path vs Slow-Path 1. Rule Install tc filter add ... 2. Driver ndo_setup_tc() 3. HW Table Flow 설치 Packet Processing FAST PATH (HW Offload) 패킷 수신 NIC HW가 패킷 버퍼에 수신 Flow Table Lookup TC flower 규칙과 매칭 src_ip, dst_ip, port, vlan... ✅ 매칭됨! HW에서 직접 action 수행 (drop/redirect/vlan-modify) SLOW PATH (Software) ❌ 매칭 안됨 테이블에 규칙 없음 CPU로 전송 kernel softirq에서 처리 소프트웨어 스택으로 라우팅 OVS/Kernel flow 설치 결정 CPU 사용 없음 (라인레이트) CPU overhead 발생
핵심: TC flower offload의 목표는 가능한 많은 트래픽을 fast-path에서 처리하여 CPU overhead를 줄이는 것입니다. 첫 번째 패킷은 항상 slow-path를 통과하면서 flow를 학습하고, 이후 패킷은 HW에서 직접 처리됩니다.

OVS Hardware 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 오프로드 가능하지만, 드라이버와 펌웨어 버전에 따라 지원 범위가 다릅니다

Inline Mode 설정

eSwitch의 inline 모드는 패킷 헤더 처리를 호스트와 NIC 간 어떻게 분담할지를 결정합니다. 모드에 따라 메타데이터의 위치와 CPU 관여 수준이 달라집니다.

# ━━━ Inline Mode 종류 ━━━

# none (기본): 메타데이터 없음, 완전한 패킷만 전송
devlink dev eswitch set pci/0000:03:00.0 inline-mode none

# transport: 메타데이터를 PCIe transport 레이어에 포함 (즉시 처리)
devlink dev eswitch set pci/0000:03:00.0 inline-mode transport

# network: 메타데이터를 네트워크 헤더에 포함 (터널 시나리오)
devlink dev eswitch set pci/0000:03:00.0 inline-mode network

# 현재 설정 확인
devlink dev eswitch show pci/0000:03:00.0
# pci/0000:03:00.0: mode switchdev inline-mode transport encap mode: NOTSET
모드설명사용 시나리오
none메타데이터 없음, 완전한 패킷만 전송기본 브릿징, VLAN
transport메타데이터를 PCIe transport 레이어에 포함TC offload, conntrack offload
network메타데이터를 네트워크 헤더에 포함VXLAN/Geneve 터널 오프로드

Scalable Function (SF)

Scalable Function (SF)은 VF보다 더 가벼운 단위의 가상 기능입니다. VF가 PCIe 함수인 반면, SF는 PCIe 리소스를 공유하면서도 더 작은 세분화로 생성하고 관리할 수 있습니다. DPU에서 다수의 마이크로서비스를 위한 네트워크 기능을 제공할 때 사용됩니다.

# ━━━ SF (Scalable Function) 생성 및 관리 ━━━

# 1. SF 영역 확인
mlxdevm resource show pci/0000:03:00.0 | grep -A5 sf

# 2. SF 생성
mlxdevm port add pci/0000:03:00.0 flavour pcivf vport_index 88

# 3. SFRepresentor 확인
ip link show
# enp3s0f0np0s0    <-- SF 0 representor
# enp3s0f0np0s1    <-- SF 1 representor

# 4. SF 삭제
mlxdevm port del pci/0000:03:00.0/1

디버깅 및 트러블슈팅

eSwitch 관련 문제 발생 시 다음 명령어로 상태를 진단할 수 있습니다.

# ━━━ eSwitch 디버깅 명령어 ━━━

# 1. eSwitch 상태 확인
devlink dev eswitch show pci/0000:03:00.0
devlink dev info pci/0000:03:00.0

# 2. Representor 통계 확인
ip -s link show enp3s0f0np0_0
ethtool -S enp3s0f0np0_0 | grep -i rep

# 3. HW 플로우 테이블 상태
devlink dev flowtable show pci/0000:03:00.0

# 4. 드라이버 로그에서 eSwitch 이벤트 확인
dmesg | grep -i "eswitch\|switchdev\|rep"
# [12345.678901] mlx5_core 0000:03:00.0: eSwitch: switchdev mode enabled
# [12345.678902] mlx5_core 0000:03:00.0: eSwitch: representor enp3s0f0np0_0 created

# 5. VF와 representor 매핑 확인
cat /sys/class/net/enp3s0f0np0_0/phys_switch_id
cat /sys/class/net/enp3s0f0np0_0/phys_port_name

# 6. TC offload 실패 시 소프트웨어 폴백 확인
tc -s filter show dev enp3s0f0np0_0 ingress | grep -i "hw\|sw"
# in_hw_count 0: 소프트웨어에서 처리 중
# in_hw_count 1: 하드웨어에서 처리 중

# 7. 드라이버 health 상태 확인
devlink health show pci/0000:03:00.0 reporter eswitch
일반적인 문제 및 해결:
  • 모드 전환 실패: VF가 활성화되어 있으면 실패합니다. 먼저 모든 VF를 삭제하세요.
  • TC offload 안됨: 드라이버 로그에서 "cannot offload" 메시지 확인. 드라이버/펌웨어 호환성 문제일 수 있습니다.
  • representor 생성 안됨: firmware에서 sriov_en=true 설정 확인.
  • 플로우 테이블 초과: "Failed to create flow: table full" 오류 시 불필요한 규칙 정리.

커널 설정

eSwitch/switchdev를 사용하기 위해 필요한 커널 설정 옵션들입니다. 사용하는 NIC에 따라 해당 드라이버를 활성화하세요.

# ━━━ 커널 설정 옵션 ━━━

# =============================================
# 공통: TC flower offload (모든 벤더에 필요)
# =============================================
CONFIG_NET_SCHED=y
CONFIG_NET_CLS=y
CONFIG_NET_CLS_FLOWER=y
CONFIG_NET_ACT_POLICE=y

# Conntrack offload (mlx5, ice 지원)
CONFIG_NF_CONNTRACK=y
CONFIG_NF_CONNTRACK_OFFLOAD=y

# OVS-DPDK (선택)
CONFIG_OPENVSWITCH=y
CONFIG_DPDK=y

# =============================================
# Mellanox/NVIDIA (mlx5)
# =============================================
CONFIG_MLX5_CORE=y
CONFIG_MLX5_MDEV=y          # SF(Scalable Function) 지원
CONFIG_MLX5_ESWITCH=y       # eSwitch 지원 - 필수
CONFIG_MLX5_EN_ETHERNET=y   # 이더넷 드라이버
CONFIG_MLX5_INFINIBAND=y    # RDMA/RoCE 지원
CONFIG_MLX5_VDPA=y          # vDPA 지원

# =============================================
# Intel (ice)
# =============================================
CONFIG_ICE=y

# =============================================
# Broadcom (rocker)
# =============================================
CONFIG_ROCKER=y

# =============================================
# Marvell (DSA)
# =============================================
CONFIG_NET_DSA=y
CONFIG_NET_DSA_MV88E6XXX=y
CONFIG_NET_DSA_MV88E6XXX_PTP=y  # PTP 지원

Performance Tuning

eSwitch의 성능을 최적화하기 위해 고려해야 할 주요 튜닝 포인트들입니다. 올바른 설정을 통해 라인레이트(초당 패킷 처리)에 근접한 성능을 달성할 수 있습니다.

Receive Queue (RSS) 튜닝

VF의 RSS(Receive Side Scaling) 설정을 통해_multiple CPU 코어에서 패킷을 병렬 처리할 수 있습니다.

# ━━━ RSS (Receive Side Scaling) 튜닝 ━━━

# 1. VF의 RSS 해시 키 확인
ethtool -x enp3s0f0np0_0
# RX flow hash indirection table for enp3s0f0np0_0:
# Table size: 128
# Layout: context=default
# RX queue: 0 1 2 3 4 5 6 7 ...

# 2. RSS 큐 수 설정 (CPU 코어 수와 일치)
ethtool -L enp3s0f0np0_0 combined 8

# 3. RSS 해시 설정 (L3/L4 해시 활성화)
ethtool -N enp3s0f0np0_0 rx-flow-hash udp4 tcp4 tcp6 udp6 sge

# 4. Large RX 버퍼 설정 (대용량 패킷 처리용)
ethtool -G enp3s0f0np0_0 rx 4096 tx 4096

# 5. RSS 해시 결과 확인
ethtool -n enp3s0f0np0_0

Buffer Tuning

NIC 버퍼 크기를 조정하여 버스트 트래픽 처리 능력을 향상시킬 수 있습니다.

# ━━━ Buffer 튜닝 ━━━

# 1. 현재 버퍼 상태 확인
ethtool -g enp3s0f0np0_0

# 2. RX/TX Ring 크기 증가
ethtool -G enp3s0f0np0_0 rx 4096 tx 4096

# 3. Interrupt Coalescing 설정
ethtool -C enp3s0f0np0_0 rx-usecs 64 tx-usecs 64

# 4. Flow Director 설정 (Intel 랜카드)
ethtool -K enp3s0f0np0_0 ntuple on

NVIDIA/mlx5 특화 튜닝

mlx5 드라이버의 특화된 튜닝 파라미터들입니다.

# ━━━ mlx5 특화 튜닝 ━━━

# 1. eSwitch 모드에서 페이로드 크기 설정
ip link set enp3s0f0np0 mtu 9000

# 2. Flow 테이블 크기 확인
mlxdevm resource show pci/0000:03:00.0 | grep -A10 flow_table

# 3. Representor의 RSS 설정
mlxreg -d /dev/mst/mt4123_pciconf0 --reg_name RSS --set rss_xj=1,hash_field=1 --yes

# 4. 드롭 패킷 모니터링
ip -s link show enp3s0f0np0_0 | grep -i "drop\|error"

벤치마크 방법

eSwitch offload 성능을 측정하는 표준적인 벤치마크 방법입니다.

# ━━━ 벤치마크 ━━━

# 1. pktgen으로 패킷 생성
modprobe pktgen
pgset "count 0"
pgset "delay 0"
pgset "pkt_size 64"
pgset "dst 10.0.0.5"
pgset "start"

# 2.iperf3으로 대역폭 측정
iperf3 -s -p 5201
# 클라이언트:
iperf3 -c 10.0.0.5 -p 5201 -t 30 -P 8

# 3. mpstat로 CPU 사용률 확인
mpstat -P ALL 1
성능 기대치 (NVIDIA ConnectX-6 Dx 기준):
  • 64B 패킷: ~100Mpps (라인레이트)
  • 1500B 패킷: ~14.8Mpps (~100Gbps)
  • TC flower offload 시 CPU 사용: 0% (HW 처리)
  • Latency: ~1-2μs (HW 경유)

보안 고려사항

eSwitch를 활용한 네트워크 구성에서 고려해야 할 보안 요소들입니다.

VF 간 격리

switchdev 모드에서 VF 간 통신은 eSwitch HW에서 처리됩니다. 올바른 VLAN/VNI 설정이 필수입니다.

# ━━━ VF 격리 설정 ━━━

# 1. VF별 VLAN 설정
ip link set enp3s0f0np0_0 master br0
bridge vlan add dev enp3s0f0np0_0 vid 100 pvid untagged
ip link set enp3s0f0np0_1 master br0
bridge vlan add dev enp3s0f0np0_1 vid 200 pvid untagged

# 2. VF 간 통신 차단
ip link add br-isolated-1 type bridge
ip link add br-isolated-2 type bridge
ip link set enp3s0f0np0_0 master br-isolated-1
ip link set enp3s0f0np0_1 master br-isolated-2

# 3. TC flower로 VF 간 통신 제어
tc filter add dev enp3s0f0np0_0 ingress protocol all flower \
    action drop

MAC/ARP 필터링

Representor에서 MAC 주소 필터링을 통해 비정상적인 트래픽을 차단할 수 있습니다.

# ━━━ MAC/ARP 필터링 ━━━

# 1. 허용된 MAC 주소만 수신
ip link set enp3s0f0np0_0 address 00:00:00:00:00:05
ip link set enp3s0f0np0_0 type bridge_setlink brport restricted 1

# 2. TC flower로 특정 MAC 필터링
tc filter add dev enp3s0f0np0_0 ingress protocol all flower \
    dst_mac 00:11:22:33:44:55 \
    action drop

Trusted VF 설정

보안이 검증된 VF에는 트러스트 플래그를 설정하여 추가 권한을 부여할 수 있습니다.

# ━━━ Trusted VF 설정 ━━━

# 1. VF를 Trusted로 설정
ip link set enp3s0f0np0_0 type vf trust on

# 2. VF별 VLAN 태그 허용/차단
ip link set enp3s0f0np0_0 type vf vlan 100 qos 5

# 3. VF MAC 주소 고정
ip link set enp3s0f0np0_0 type vf mac 00:00:00:00:00:05

# 4. VF별 최대 대역폭 설정
ip link set enp3s0f0np0_0 type vf rate 10000
보안 권장사항:
  • VF 트러스트: 필요한 VF만 trust=on으로 설정
  • MAC 주소 고정: VF의 MAC 주소를 고정하여 ARP 스푸핑 방지
  • VLAN 격리: 서로 다른 테넌트의 VF는 반드시 다른 VLAN/VNI에 배치
  • 펌웨어 업데이트: 보안 패치가 포함된 최신 펌웨어 사용

VXLAN/Geneve Offload

VXLANGeneve는 데이터센터에서 가장 널리 사용되는 네트워크 가상화 터널 프로토콜입니다. eSwitch는 이러한 터널의 캡슐화/해제를 하드웨어에서 처리할 수 있어 CPU 오버헤드를 크게 줄입니다.

VXLAN Offload 아키텍처

VXLAN Offload: HW Encapsulation/Decapsulation VM/Container (Tenant A, VNI 1000) VM1 10.0.1.10 VM2 10.0.1.20 Tenant 내부 통신 VXLAN VTEP 192.168.1.1 eSwitch HW (ASIC) VXLAN Encapsulation Outer Header 추가 UDP:4789, IP:192.168.1.1 VNI: 1000 Flow Table VNI 매핑 Inner IP → VNI VTEP Lookup PF/Uplink 물리적 네트워크 egress to Spine/ToR Physical Network (Underlay) VXLAN Outer Packet: UDP+VXLAN Header + Inner Ethernet + IP
# ━━━ VXLAN Offload 설정 ━━━

# 1. VXLAN 디바이스 생성 (HW offload 활성화)
ip link add vxlan0 type vxlan id 1000 \
    dstport 4789 \
    local 192.168.1.1 \
    remote 192.168.1.2 \
    dev enp3s0f0np0 \
    external

# 2. 브릿지에 VXLAN 포트 추가
ip link set vxlan0 master br-vxlan

# 3. eSwitch에서 VXLAN offload 활성화
devlink dev eswitch set pci/0000:03:00.0 encap mode enable

# 4. VXLAN VNI ↔ 브릿지 매핑
bridge vlan add dev vxlan0 vid 1000

Geneve Offload

Geneve는 VXLAN보다 유연한 확장성을 제공하는 터널 프로토콜입니다.

# ━━━ Geneve Offload 설정 ━━━

# 1. Geneve 디바이스 생성
ip link add geneve0 type geneve id 2000 \
    remote 192.168.2.1 \
    dev enp3s0f0np0 \
    external

# 2. Geneve + TC flower 규칙
tc qdisc add dev enp3s0f0np0_0 ingress
tc filter add dev enp3s0f0np0_0 ingress protocol all flower \
    enc_src_port 6081 \
    enc_dst_port 6081 \
    enc_key_id 2000 \
    action mirred egress redirect dev geneve0
VXLAN vs Geneve:
  • VXLAN: 24비트 VNI (1600만 VM), UDP 포트 4789, 광범위한 하드웨어 지원
  • Geneve: 24비트 VNI + TLV 확장, UDP 포트 6081, 유연한 메타데이터 전송

QoS 및 Rate Limiting

eSwitch에서 QoS와 Rate Limiting을 통해 트래픽을 제어할 수 있습니다.

QoS Offload

# ━━━ QoS 설정 ━━━

# 1. 우선순위 큐 (Priority Queue) 설정
tc qdisc add dev enp3s0f0np0_0 root mqprio \
    num_tc 4 \
    map 0 1 2 3 \
    queues 4@0 4@4 4@8 4@12 \
    hw 1

# 2. VF별 대역폭 제한
ip link set enp3s0f0np0_0 type vf rate 10000

# 3. TC로 상세 QoS 규칙
tc qdisc add dev enp3s0f0np0_0 handle 800: parent root htb default 10
tc class add dev enp3s0f0np0_0 parent 800: classid 800:10 htb rate 5gbit burst 15k

vDPA (vhost Data Path Acceleration)

vDPA는 DPU/이더넷 카드의 하드웨어 가속을 VM 또는 컨테이너의 virtio 드라이버에 제공하는 프레임워크입니다.

vDPA 아키텍처

vDPA Architecture: Virtio Frontend → HW Backend VM (QEMU/KVM) virtio-net-pci (virtio frontend) vhost-vdpa (Kernel) Control Path (ioctl) mlx5_vdpa (HW Backend) Data Path (DMA, HW Offload) DPU/NIC (Hardware) Control Plane Device Config, Virtio Spec Virtio-net Driver vDPA Driver eSwitch Flow Table VXLAN Offload virtio descriptor vhost-protocol DMA, Packet Processing
# ━━━ vDPA 설정 ━━━

# 1. vDPA 디바이스 생성 (mlx5의 경우)
vdpa mlx5 add -n vhost0 -k 16 -m 4

# 2. vDPA 디바이스 확인
vdpa dev show

# 3. QEMU에서 vDPA 사용
qemu-system-x86_64 \
    -m 8G \
    -drive file=vm.qcow2,if=virtio \
    -netdev type=vhost-vdpa,id=vdpa0,vhostdev=/dev/vhost-vdpa-0 \
    -device virtio-net-pci,netdev=vdpa0,mac=00:00:00:00:00:05
vDPA 장점:
  • 최적의 성능: virtio 규약을 준수하면서 HW 가속
  • eSwitch 통합: VXLAN, TC flower offload와 완벽히 통합
  • 표준 인터페이스: Linux vDPA 프레임워크 기반

Live Migration 시나리오

VM의 Live Migration 시 eSwitch 환경에서 고려해야 할 사항들입니다.

마이그레이션 도전과제

# ━━━ Live Migration 준비 ━━━

# 1. Source Host: VF 할당 확인
virsh dumpxml vm1 | grep -A10 "interface"

# 2. Destination Host: 동일한 VF 구성
echo 4 > /sys/bus/pci/devices/0000:03:00.0/sriov_numvfs
devlink dev eswitch set pci/0000:03:00.0 mode switchdev

# 3. Destination Host: Representor 준비
ip link show | grep enp3s0f0np0_

# 4. OVS 플로우 복제
ovs-ofctl dump-flows br0 > /tmp/flows.txt

모범 사례

Multi-Host 시나리오 (EVPN-VXLAN)

대규모 데이터센터에서는 여러 호스트 간의 네트워크를 EVPN-VXLAN으로 구성합니다.

EVPN-VXLAN 개요

EVPN-VXLAN Multi-Host Architecture Host A (DPU 1) VM1 (VNI:1000) VM2 (VNI:1000) eSwitch (VXLAN VTEP) Host B (DPU 2) VM3 (VNI:1000) VM4 (VNI:1001) eSwitch (VXLAN VTEP) Host C (DPU 3) VM5 (VNI:1001) VM6 (VNI:1002) eSwitch (VXLAN VTEP) Underlay Network (L3 Fabric) 10.0.0.0/24 - Spine/Leaf Switches EVPN Control Plane (BGP EVPN) MAC/IP Advertisement, IP Prefix, ETREE Traffic Flow: VM1 ↔ VM3 (VNI 1000, Same Subnet via VXLAN)
# ━━━ EVPN-VXLAN 설정 ━━━

# 1. BGP EVPN 피어 설정
router bgp 65001
  neighbor 10.0.0.2 remote-as 65001
  address-family l2vpn evpn
    neighbor 10.0.0.2 activate
  exit-address-family

# 2. VXLAN 브릿지 도메인 설정
bridge vlan del dev br0 vid 1 self
bridge vlan add dev br0 vid 1000

# 3. eSwitch에서 EVPN 활성화
devlink dev eswitch set pci/0000:03:00.0 mode switchdev
devlink dev eswitch set pci/0000:03:00.0 encap mode enable

# 4. EVPN VNI 매핑
bridge fdb add 00:00:00:00:00:05 dev vxlan0 self static vni 1000
EVPN-VXLAN 장점:
  • 스케일러블: 1600만 이상의 VM/VNI 지원
  • 로드밸런싱: ECMP 기반 다중 경로 지원
  • MAC Mobility: VM 이동 시 MAC 주소 자동 학습
  • HW Offload: eSwitch에서 VXLAN/Tunnel Offload

참고자료

다음 학습:
필수 관련 문서: 참고 문서: