Computing

[가상화] PCI Pass-through와 VFIO 본문

Cloud/개념

[가상화] PCI Pass-through와 VFIO

jhson989 2022. 10. 21. 22:22

가상머신(Virtual machin, VM)이 하이퍼바이저의 도움없이도 호스트에 설치된 I/O 디바이스(ex. GPU, NIC, etc.)에 직접 접근할 수 있는 기술을 Pass-through라고 한다. 이들 중 PCI 디바이스에 대한 VM의 직접 접근 기술을 PCI Pass-through라고 한다. PCI 디바이스의 경우 성능이 중시되는 기능에서 사용되는 경우(network, GPGPU 등)가 많은데, 따라서 DMA 기능, PCI 디바이스에 대한 배타적인 사용이 필요한 경우가 있다.

 

이번 포스터에서는 Pass-through와 그것을 가능하게 하는 VFIO(Virtual Function I/O[1]) framework에 대해서 정리하고자 한다.

 

 

Device Emulation vs Pass-through

Fig 1. Emulation 방식과 Pass-through 방식의 비교 [2]

 

Pass-through 기술 이전에는 Device emulation 방식을 이용해 PCI 디바이스를 가상머신이 사용할 수 있게 지원하였다. Fig 1.은 Emulation 방식과 Pass-through 방식을 비교한 것이다. VM이 GPU 디바이스를 사용하고자 할 때, emulation 방식과 passthrough 방식은 다음과 같이 작동한다.

 

Emulation 방식은 하이퍼바이저 내부에 해당 PCI 디바이스를 emulated한 디바이스 기능을 직접 구현해놓는다. VM의 GPU 디바이스 드라이버(Guest driver)는 emulated device를 실제 디바이스라고 생각하고 emulated device에 명령을 내린다. Emulated device은 VM의 명령을 해석해 실제 디바이스 드라이버에 전달, 실제 디바이스가 해당 명령에 따라 작동하게 된다.

 

Emulation 방식을 위해서는 Guest driver가 emulated device에 명령을 전달할 수 있도록 guest driver를 수정하거나 직접 만들어야 한다. 또한 디바이스에 대한 접근이 한 layer(하이퍼바이저)를 거쳐 이루어지면서 성능이 감소한다.

 

그에 반해, Pass-through 방식은 하이퍼바이저의 도움없이도 VM이 물리 디바이스에 직접 접근할 수 있도록 한다. 즉 중간에 어떠한 layer없이도, VM이 직접 물리 디바이스에 직접 명령어를 전달하여 물리 디바이스를 실행시킬 수 있다. 이를 통해 베어메탈 디바이스를 사용하는 수준의 성능을 달성할 수 있다. 또한 디바이스 드라이버를 수정할 필요가 없어진다.

 

VM이 물리 디바이스에 명령을 내리는 것은 VM의 Guest driver가 담당한다. 이게 어떻게 가능할까? Guest driver는 VM(VM이 유저가 실행한 프로세스이다) 내부에서 작동하는 코드이기에 user-space driver이다. 일반적으로 디바이스를 보호하기 위해 디바이스에의 접근은 kernel-space 상의 device driver 코드에 의해서만 가능하다. VFIO framework는 이 문제를 해결해준다.

 

추가적으로 VM의 OS는 실제 physical memory address에 대해 알지 못한다(Physical memory address space를 관리하는 것은 host의 OS이기 때문이다). 따라서 VM의 OS는 디바이스의 DMA 기능을 사용할 수 없다. VM의 OS가 디바이스에게 DMA를 통해 데이터를 전송하라고 명령하고 싶어도, physical memory address에 대해 알지 못하기에 어떤 주소로 데이터를 전송시켜야 할 지 결정할 수 없다. 이를 해결하기 위해 사용되는 기술이 IOMMU이다. IOMMU는 이전 포스터에서 간략히 정리하였다.

 

 

 

Virtual Function I/O

VFIO(Virtual Function I/O)는 userspace drivers를 위한 framework[1]이다. 기존에는, 디바이스에 접근하기 위해서는 디바이스 드라이버가 kernel space 상에 정의되어 있어야 했다(Privileged instruction여야 했다). VFIO를 통해 userspace 상의 코드도 디바이스에 접근할 수 있게 되어, userspace 상의 디바이스 드라이버를 만들 수 있게 되었다.

 

VFIO는 userspace code가 디바이스에 접근할 수 있게해주는 framework인 만큼 디바이스 접근을 위한 API를 제공한다. 

(The VFIO device API includes ioctls for describing the device, the I/O regions and their read/write/mmap offsets on the device descriptor, as well as mechanisms for describing and registering interrupt notifications[1]). 이러한 VFIO 기능을 사용하기 위해서는 물리 디바이스가 설치된 컴퓨터의 CPU와 칩셋이 지원하여야 한다[3]고 한다.

 

VFIO driver를 사용하면 가상머신은 직접 host에 설치된 물리 디바이스에 접근할 수 있다. 이러한 pass-through 방식을 통해 emulation 방식에서 발생하는 성능 저하와 driver 수정 문제를 해결할 수 있다. 다만 가상머신에서 한 물리 디바이스에 VFIO를 통한 pass-through 방식으로 할당될 경우, 해당 디바이스는 그 가상머신에서만 사용할 수 있을 뿐, 여러 VM 사이에서 공유될 수 없다고 한다[3].

 

 

Reference

[1] https://docs.kernel.org/driver-api/vfio.html

[2] https://www.researchgate.net/figure/Passthrough-within-the-hypervisor_fig2_326504242

[3] https://doc.opensuse.org/documentation/leap/virtualization/html/book-virtualization/chap-virtualization-introduction.html

 

'Cloud > 개념' 카테고리의 다른 글

[가상화] IOMMU와 VT-d (PCI Pass-through)  (0) 2022.10.19
libvirt 개념  (0) 2022.08.29
[클라우드] 가상화란? (Virtualization, Hypervisor)  (0) 2022.06.29