KVM 게스트에서 NVIDIA GPU에 직접 접근하는 Virtio-nvgpu
원제 Virtio-nvgpu: Near-native Nvidia GPU access inside a KVM guest
115 포인트댓글 47
Key Point
KVM 게스트 내 GPU 접근을 드라이버 수준에서 구현해 기존 방식(Venus)보다 VM 바운더리 크로싱을 ~100배 줄이면서도 베어메탈 성능의 98% 이상을 유지할 수 있는 기술적 가능성을 보여준다.
핵심 요약
- NVIDIA GPU에 KVM 게스트 내부에서 드라이버 수준으로 직접 접근하는 virtio-nvgpu 프로젝트로, 게스트 성능이 베어메탈의 98~100% 수준을 유지한다.
- 기존 virtio-gpu + Venus는 Vulkan/OpenGL 호출을 프레임당 2,000회 이상 직렬화하여 1~3ms의 지연을 발생시키지만, virtio-nvgpu는 ioctl 수준에서만 포워딩하여 프레임당 5~20회 VM 바운더리 크로싱만 필요하다.
- 게스트가 NVIDIA의 실제 사용자 드라이버를 변경 없이 실행하고 로컬에서 GPU 커맨드 버퍼를 생성하므로, NVENC 인코딩과 CUDA 제로카피 상호운용이 가능하다.
- RTX 3060에서 측정한 결과 게스트 프레임 시간은 39ms(베어메탈 대비 -0.4%), CPU 사용량은 동일하며, 813,691프레임 중 메시지 교차는 59프레임당 1회 정도로 대부분 장치 설정이다.
- 4개 게스트가 하나의 RTX 3060에서 동시에 실행 가능하며, 각각 39.16ms의 동일한 프레임 타임으로 H.264 인코딩을 수행한다.
- 호스트 NVIDIA 드라이버가 신뢰 경계에 포함되어 있고, 게스트는 GPU의 MMU 페이지 테이블로만 보호되므로, VFIO 패스스루보다 보안이 약하고 상호 신뢰할 수 없는 테넌트에는 vGPU 사용이 권장된다.
- 프로토콜 정의는 BSD-3-Clause, 게스트 드라이버는 GPL-2.0, 디바이스 crate는 Apache-2.0으로 라이선스되어 있다.
- NVIDIA 커널 드라이버 ABI가 드라이버 버전마다 변경되므로, 535.129.03부터 595.71.05까지의 명시적 프로필 범위를 지원하고, 범위 밖의 구 버전은 거부한다.
- NVIDIA 드라이버 ABI 정의는 공개된 open-gpu-kernel-modules에서 기계적으로 파생되며, nvproxy의 핸들러 로직과 aBI 정의를 참고한다.
- 게스트 절반은 GPL이어야 커널 심볼에 접근하고, 호스트 절반은 permissive 라이선스여야 다른 사람이 구축 가능하게 하며, 정의는 양쪽 모두 포함 가능해야 한다.
- VMM은 디스크립터 체인 Read/Write, 이벤트 큐, 게스트/호스트 메모리 매핑 같은 작은 특성 세트만 구현하면 전체 디바이스를 얻는다.
- 계획 중인 격리(isolate) 설계는 게스트 프로세스당 하나의 샌드박스 헬퍼가 실제 디바이스 파일 디스크립터를 보유하는 구조이지만, 현재는 VMM 프로세스 내에서 백엔드가 보유한다.
- Vulkan 렌더링, OpenGL 헤드리스 EGL, CUDA 장치 메모리 할당, NVENC/NVDEC이 지원되지만, cudaMallocManaged 통합 가상 메모리와 물리 디스플레이 출력은 범위 밖이다.