
virtio-nvgpu дає гостьовим системам KVM майже нативний доступ до GPU NVIDIA
Команда Nestri опублікувала експериментальний пристрій virtio-nvgpu: він пересилає ioctl драйвера NVIDIA на рівні ABI, тож гостьова система KVM працює з картою майже як без віртуалізації, разом із кодуванням NVENC усередині ВМ.
Команда Nestri, авторів відкритого стека для хмарного геймінгу nesbox, опублікувала експериментальний пристрій virtio-nvgpu. Він дає гостьовій системі Linux під KVM майже нативний доступ до відеокарти NVIDIA. Замість трансляції викликів графічного API модуль пересилає ioctl ядерного драйвера NVIDIA між гостем і хостом на рівні driver ABI, тож у гості незміненими працюють власні драйвери NVIDIA, а ті самі Vulkan і NVENC спілкуються з тією самою картою.
Цільове навантаження це потокова передача без дисплея (headless streaming): композитор усередині віртуальної машини рендерить, збирає та кодує кадри на GPU, а назовні йде лише стиснене відео. Монітора у ВМ немає, а карта залишається в хоста.
Передавати драйвер, а не API
Гостьовий модуль ядра реєструє /dev/nvidiactl, /dev/nvidia0...N і /dev/nvidia-uvm. Кожен ioctl серіалізується в чергу virtqueue, компонент у VMM, який знає ABI, транслює його й виконує вже проти файлів пристроїв хоста, а виклики mmap підключають спільне вікно пам'яті. Друга черга у зворотному напрямку повідомляє гостя, коли GPU готовий, тож чекати можна у сні, а не в циклі опитування.
Оскільки користувацький драйвер у гості будує командні буфери GPU локально, окремі draw call-и взагалі не перетинають межу віртуалізації: на одному повному прогоні гість намалював 813 691 кадр, а бекенд обслужив лише 13 792 повідомлення, приблизно одне перетинання на 59 кадрів.
Цифри
Вимірювання проводили на RTX 3060 із драйвером 595.99.02: хост Ubuntu 26.04 на Ryzen 7 9850X3D, гість із 2 vCPU і Linux 7.2. На кадрах, важчих за приблизно 2 мс, різниця з тією самою машиною без віртуалізації лишається в межах 2%: кадр на 39 мс у гості виявився на 0,4% швидшим, а кадр на 2 мс на 1,7% повільнішим. Дуже легкі кадри втрачають більше (7,1% на 0,5 мс), бо пробудження коштує близько 0,02 мс незалежно від кадру.
Витрати CPU такі самі, як без віртуалізації: 0,37 секунди проти 0,40 за ті самі 12 секунд рендерингу без обмеження частоти. Чотири гостьові системи ділять одну карту рівно: разом 103,7 fps проти 102,9 в однієї, і всі чотири одночасно кодують H.264 у стабільні 60 Hz.
Чого ще немає
Автори прямо описують поверхню безпеки: між GPU-роботою гостьової системи та хостом немає межі IOMMU, карта належить драйверу хоста, тож драйвер NVIDIA входить до довіреної обчислювальної бази. Ioctl, яких немає в описі ABI-профілю, відхиляються, а не пересилаються; у README це названо зменшенням поверхні атаки, а не апаратною ізоляцією. Для взаємно недовірених орендарів сильнішим рішенням залишається VFIO або vGPU.
Пісочниця isolate для кожного гостьового процесу лише спроєктована; CUDA пересилається, але перевірена тільки до переліку пристроїв; MIG і SR-IOV поза межами проєкту. Підтримка драйверів явна: три ABI-профілі (535.129.03, 580.178.04 і 595.71.05). Структура репозиторію повторює gVisor nvproxy і chromeos/virtio-media.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.