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%+ 절감)
단계별 이해
- Legacy 모드 이해
기존 SR-IOV 방식. VF는 독립 PCI 함수로 동작하고, PF의 스위칭 기능은 VLAN 태깅만 지원합니다. (자세히 보기) - switchdev 전환
devlink를 통해 eSwitch를 switchdev 모드로 전환하면 PF가 브릿지 역할을 하고, VF가 포트로 동작합니다. (자세히 보기) - Representor 생성
각 VF에 대응하는 representor netdev가 생성됩니다. 호스트에서 이 포트를 통해 VF 트래픽을 제어합니다. - TC flower 규칙 설치
tc 명령어로 representor에 필터 규칙을 설치하면, 드라이버가 이를 eSwitch HW로 변환합니다. - 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가 실제 환경(하이퍼바이저)에서 어떻게 동작하는지 보여줍니다.
- Representor는 Host OS (커널)에 있음 — VF를 나타내는 "가상의 케이블"
- VF ↔ Representor는 1:1 매핑 — PCIe 버스로 연결됨
- tc 규칙을 representor에 설치 → 드라이버가 VF의 ASIC 테이블에 저장
- eSwitch (ASIC) — VF/PF 간 패킷 스위칭을 하드웨어에서 수행
eSwitch는 두 가지 운영 모드를 지원합니다:
- Legacy 모드: 기존 SR-IOV 방식. VF는 독립 PCI 함수로 동작하고, PF의 스위칭 기능은 기본적인 VLAN 태깅만 지원합니다. (자세히 보기)
- Switchdev 모드: PF를 브릿지처럼 운영하면서 VF/SF 간 트래픽을 eSwitch 하드웨어에서 스위칭합니다. TC(traffic control) 규칙의 하드웨어 오프로드가 핵심입니다.
eSwitch 아키텍처
eSwitch 아키텍처는 호스트 커널, 드라이버, NIC 펌웨어의 3계층으로 구성됩니다. 각 계층이 역할을 분담하여 하드웨어 오프로드를 가능하게 합니다.
아키텍처 개요
eSwitch/switchdev는 다음 3계층 구조로 구성됩니다. 각 벤더는 동일한 아키텍처를 따르지만, 드라이버와 구현은 다릅니다.
NVIDIA/Mellanox (mlx5) 상세 아키텍처
mlx5 드라이버의 상세 구성 요소입니다.
| 컴포넌트 | 설명 | 커널 경로 |
|---|---|---|
| mlx5_core | NIC 기본 드라이버, firmware 관리 | drivers/net/ethernet/mellanox/mlx5/core/ |
| mlx5e | 이더넷 netdev 드라이버 | drivers/net/ethernet/mellanox/mlx5/core/en_*.c |
| mlx5_eswitch | eSwitch 관리 (switchdev 모드) | drivers/net/ethernet/mellanox/mlx5/core/eswitch*.c |
| mlx5e_rep | Representor 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의 스위칭 기능은 다음으로 제한됩니다:
- VLAN 태깅: IEEE 802.1Q VLAN 헤더의 추가/제거만 HW에서 처리
- 기본 필터링: MAC 주소 기반 필터링 ( whitelist)
- MTU 설정: VF별 최대 전송 단위 관리
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 모드는 다음과 같은 상황에서 여전히 유용합니다:
- 단순 VM 네트워크: 각 VM이 외부 네트워크와만 통신하고, VM 간 통신이 필요 없는 경우
- RDMA 직접 할당: VM에 VF를 직접 할당하여 RDMA를 사용해야 하는 경우 (GPUDirect RDMA)
- 기존 호환성: 기존 SR-IOV 설정을 유지하고 싶은 경우 (마이그레이션 호환)
- 제한된 NIC: eSwitch를 지원하지 않는 오래된 NIC에서 SR-IOV를 사용하는 경우
- 빠른 배포: 복잡한 설정 없이 SR-IOV를 빠르게 구성해야 하는 경우
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 규칙에 기반한 필터링과 포워딩이 가능합니다.
- 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 관여 없이 하드웨어에서 직접 처리됩니다:
- 패킷 수신: NIC가 패킷을 버퍼에 수신
- Flow Table 조회: ASIC의 플로우 테이블에서 매칭 규칙 검색 (src/dst IP, port, VLAN, protocol 등)
- 액션 수행: 매칭된 규칙의 액션(drop, redirect, vlan-modify 등)을 HW에서 직접 실행
- 포워딩: 해당 포트로 패킷 전송 (VF, PF, 또는 다른 representor)
Slow-Path (소프트웨어 처리)
플로우 테이블에 규칙이 없거나, 복잡한 액션이 필요한 경우 패킷이 소프트웨어로 전송됩니다:
- 테이블 미스: 플로우 테이블에 매칭 규칙이 없는 경우
- CPU 인터럽트: NIC가 CPU로 패킷을 전송 (MSI-X 인터럽트)
- 커널 처리: softirq 컨텍스트에서 네트워크 스택 처리
- 플로우 학습: OVS/브릿지가 플로우를 분석하여 TC 규칙 생성
- 규칙 설치: 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 |
basic | VXLAN, 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
- 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
- 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
- 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
벤더별 기능 비교
| 기능 | 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는 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(소프트웨어에서 처리)로 나뉩니다.
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 액션이 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
- 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
VXLAN와 Geneve는 데이터센터에서 가장 널리 사용되는 네트워크 가상화 터널 프로토콜입니다. eSwitch는 이러한 터널의 캡슐화/해제를 하드웨어에서 처리할 수 있어 CPU 오버헤드를 크게 줄입니다.
VXLAN Offload 아키텍처
# ━━━ 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: 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 설정 ━━━
# 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
- 최적의 성능: 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
모범 사례
- VF MAC 고정: 마이그레이션 시 MAC 주소가 변경되지 않도록 VF MAC을 고정
- VLAN 일관성: Source/Destination 모두 동일한 VLAN 구성
- OVS 플로우 백업: 마이그레이션 전 OVS 플로우를 백업하고 복원
Multi-Host 시나리오 (EVPN-VXLAN)
대규모 데이터센터에서는 여러 호스트 간의 네트워크를 EVPN-VXLAN으로 구성합니다.
EVPN-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
- 스케일러블: 1600만 이상의 VM/VNI 지원
- 로드밸런싱: ECMP 기반 다중 경로 지원
- MAC Mobility: VM 이동 시 MAC 주소 자동 학습
- HW Offload: eSwitch에서 VXLAN/Tunnel Offload
참고자료
- NVIDIA Mellanox SwitchDev Mode Documentation
- Linux Kernel SwitchDev Documentation
- OVS Hardware Offload Guide
- Intel E810 eSwitch Configuration Guide
- Linux Kernel DSA Documentation
- Mellanox mlx5 Driver Source
- SmartNIC/DPU — DPU의 전체 아키텍처와 활용 시나리오
- DPDK — 데이터 평면 개발 키트
- TC (Traffic Control) — 리눅스 트래픽 제어
- Bridge/VLAN/Bonding — 가상 스위칭
관련 문서
- Netfilter Flowtable 심화 — Netfilter Flowtable SW/HW 오프로드 메커니즘, conntrack 대비
- NAT (Network Address Translation) — nf_nat 아키텍처, SNAT/DNAT/MASQUERADE, conntrack 연동, n
- eBPF 기반 보안 정책 — eBPF BPF LSM 보안 훅, cgroup_skb 컨테이너 방화벽, Seccomp-BP
- TPROXY 완전 실습 랩 — TCP·UDP·nftables·netns·C epoll 프록시·eBPF·Squid/Envo