IOMMU(=VT-d), pcie passthrough, sriov

호두·2026년 2월 22일
  1. IOMMU = VT-d : PCI 디바이스 passthrough를 위한 하드웨어 유닛
  2. PCIe passthrough는 가상 네트워크 인터페이스가 물리 인터페이스에 직접 연결된 것처럼 보이게 하는 기술 (1:1 매핑)
  3. SR-IOV는 물리 인터페이스를 다수개의 가상 네트워크 인터페이스가 공유해서 사용할 수 있는 기술 (1:n 매핑)

AMD IOMMU, Intel VT-d

가상머신(Virtual machine, VM)에서 Host 상의 PCI 디바이스 (ex, GPU, NIC, etc.)에 직접 접근(pass-through)하기 위해서 필요한 기술.

IOMMU는 Input/Output Memory Management Unit을, VT-d는 Virtualization Technology for Directed I/O를 의미하며, 둘 다 같은 기능을 수행하는 하드웨어 유닛으로 제품을 만든 회사에 따라 다른 이름으로 불린다.

결국 IOMMU = VT-d

IOMMU는 DMA(Direct Memory Access) 가능한 입출력 버스와 주기억장치를 연결하는 메모리 관리 장치(MMU, Memory Management Unit)

MMU는 CPU가 보내는 virtual accress가 input이었다면, IOMMU는 PCI디바이스 정확히는 DMA(Direct Memory Access)가 보내는 virtual address라는 점에 차이가 있다.

PCI 장치는 DMA를 통해 직접 시스템 메모리 장치에 데이터를 쓰거나 읽을 수 있는데 IOMMU없이 DMA를 실행하려면 PCI 장치가 시스템 메모리 장치의 physical address space 정보를 직접 알고 있어야 한다.

또한 원하는 만큼의 데이터를 읽기 위해 그 만큼의 연속적인 공간이 비워져 있어야 한다.

IOMMU는 MMU와 같이 동작하며 이러한 문제를 해결한다. IOMMU를 통해 가상머신의 OS가 PCI장치에게 가상주소로 DMA를 요청하더라도 IOMMU를 통해 실제 물리 주소로 변환되어 정상 작동하게 된다.

이렇게 하면 가상머신이 하이퍼바이저의 도움없이도 직접 PCI장비에 접근할 수 있게 되는데 이를 PCI Pass-through라고 한다.

그럼 PCI Pass-through에 대해서 좀 더 자세히 알아보자.

우선 PCI pass-through가 없는 상태에서의 패킷 플로우를 살펴보자.

  1. pNIC는 데이터 트래픽을 수신하여 Rx큐(링 버퍼)에 저장
  2. pNIC는 DMA(직접 메모리 접근)를 통해 패킷을 메인 메모리 버퍼로 전달. 패킷에는 메모리 위치와 패킷 크기를 포함하는 패킷 정보를 함께 제공.
  3. pNIC는 CPU에 인터럽트 요청(IRQ)을 보냄
  4. CPU는 IRQ를 처리하는 pNIC 드라이버에 제어권을 넘깁니다. pNIC 드라이버는 패킷을 수신하여 네트워크 스택으로 이동시킵니다. 그런 다음 패킷은 소켓에 도달하여 소켓 수신 버퍼에 저장됩니다.
  5. 패킷이 Open vSwitch(OVS) 가상 스위치로 복사됩니다.
  6. 패킷은 OVS에서 처리된 후 VM으로 전송됩니다. 이 과정에서 패킷은 커널 공간과 사용자 공간 사이를 오가며, 상당한 CPU 자원을 소모합니다.
  7. 패킷은 vNIC에서 수신되어 Rx 큐에 배치됩니다.
  8. vNIC는 DMA를 통해 패킷과 패킷 디스크립터를 가상 메모리 버퍼로 전달합니다
  9. vNIC는 가상 CPU(vCPU)에 IRQ(간섭 요청)를 보냅니다.
  10. vCPU는 IRQ를 처리하는 vNIC 드라이버에 제어권을 넘깁니다. vNIC 드라이버는 패킷을 수신하여 네트워크 스택으로 이동시킵니다. 마지막으로 패킷은 소켓에 도착하여 소켓 수신 버퍼에 저장됩니다.
  11. 그런 다음 패킷 데이터가 복사되어 VM 애플리케이션으로 전송됩니다.

수신된 패킷은 위와 같은 절차를 거치며 빈번한 CPU 인터럽트가 발생하여 VNF(가상화 네트워크) 기능에 상당한 오버헤드를 발생.

이 과정에서 PCI Passthrough가 등장.

PCI passthrough는 VNF가 물리 PCI장치에 직접 접근할 수 있도록 하며, 마치 해당 장치가 VNF에 물리적으로 연결된 것처럼 동작하게 함. PCI passthrough를 사용하면 물리 네트워크 인터페이스 카드를 단일 VNF에 매핑하여 VNF가 물리 인터페이스에 직접 연결된 것처럼 보이게할 수 있음.

하지만 하나의 물리 네트워크 인터페이스 전체가 단일 VNF과 1:1로 매핑되어 전용으로 사용되게 되면서, 다른 VNF와 물리 인터페이스 공유가 불가 -> VNF는 물리 인터페이스 수만큼만 사용할 수 있게됨.

여기서 SR-IOV가 등장.

SR-IOV는 여러 VNF가 동일한 물리 인터페이스를 공유할 수 있도록 한 PCI passthrough 기능임.

SR-IOV는 물리 네트워크 인터페이스와 같은 PCIe장치를 단일 PCIe 장치에서 에뮬레이션 하는데, 이렇게 에뮬레이션 된 장치를 VF(Virtual Function)이라 한다.

그럼 결과적으로 IOMMU(VT-d)는 pci passthrough를 가능하게 하기 위해 CPU에 내장된 하드웨어 기능. (cpu의 mmu와 같이 i/o에 대한 mmu역할을 수행 즉, 가상 장치들이 메모리에 접근할 때 주소를 변환하고 격리하는 역할을 함.).

sr-iov는 pci passthrough 기능 중 하나로 물리 pcie장치를 여러 가상 장비에서 공유해서 사용할 수 있도록 해줌.

서버에서 iommu(vt-d)를 활성화 하기 위해서는 intel_iommu=on 이라는 커널 파라메터를 추가해야 함.

iommu를 활성화 하게 되면 모든 메모리 접근 요청들이 iommu를 거치게 된다. 심지어 호스트 OS는 이미 신뢰할 수 있는 영역인데, 호스트 장치들까지 매번 주소 변환을 하게 되게 때문에 오버헤드로 인해 CPU 자원을 낭비하고 성능이 떨어지게 된다.

이 때 iommu=pt 이 커널 파라메터를 사용하면 가상 장치들이 메모리 접근을 요청하는 경우에는 iommu를 거치게 하고 호스트 장치의 메모리 접근 요청 시에는 iommu를 통과(passthrough)할 수 있게 하는 설정이다.

이를 통해 iommu 기능은 활성화하되, 호스트 성능 저하는 방지할 수 있다.

profile
Whatever you're not changing, you're choosing

0개의 댓글