Как стать автором
Обновить

Комментарии 35

Может быть кому-то пригодится (заодно и себе заметочка будет). Как-то раз настраивал проброс двух PCIe WLAN адаптеров внутрь VM с установленной x86 OpenWRT. Один старенький 2.4 GHz Atheros из-за какого-то бага внутри себя не хотел пробрасываться. Решилось правкой конфига ВМ в двух местах, после чего всё заработало. Алиас ua-hostdev обязателен (другие запрещены к использованию).

<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
  </source>
  <alias name='ua-hostdev0'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</hostdev>
<qemu:commandline>
  <qemu:arg value='-set'/>
  <qemu:arg value='device.ua-hostdev0.x-msix-relocation=bar2'/>
</qemu:commandline>
очень жаль что вы не протестировали производительность в условиях прямой работы с картой и в режиме проброса

цифры были бы очень уместны.

я очень давно делал проброс со стареньким феномом fx6100 и amd gpu radeon 5xxx (linux, kvm), и получил в играх до 30% падения производительности, хотелось бы понять, сколько современные amd ryzen в таком режиме потребуют ресурсов.

на работе у меня много лет была проброшена видюха в вм с виндой (ради пары софтин), причём видеокарты регулярно менялись

по вашему вопросу: я делал некоторое кол-во тестов увы цифры я не сохранил, но синтетитика показывала совсем незначительную разницу между проброшенной в вм видеокартой и ей же но с системой на хосте (ЕМНИП меньше 10 процентов), а в реальных нагрузках (solid works, blender, и пара игр) разницы не было заметно глазу

так же многим может пригодится вот такая информация: для амд/радеон и невидия quadro вышеописаный рецепт работает, а для невидия geforce прийдётся залезть руками в xml конфиг виртуалки и сделать небольшой обман (драйвера невидии не позволяют работать потребительским видеокартам в виртуальных средах) чтобы ос и дрова невидии не знали что это виртуалка а не реальное железо

пункт 6.2 в моей записной книжке

хотя я уже больше года как освободился от этого ярма на шее (больше винда не нужна ни для работы ни для дома) насколько я знаю один мой коллега продолжает так работать и всё ок.

Раньше(полтора года назад) был прикол, что с подменой всяких там CPUID и прочих для обмана драйвера падала производительность CPU, потому что вырубались всякий фишки виртуализации. Лечилось просто патчингом драйвера и подписью self-signed сертификатом(предварительно врубив dev-mode). А сейчас с этим нормально уже?

евидия quadro вышеописаный рецепт работает, а для невидия geforce прийдётся залезть

Но в апреле была же новость, что жифорсы теперь можно habr.com/ru/news/t/550678

можно, все работает замечательно!

Года 3 как переехал в виртуалку, недавно настроил еще и ноутбук под это дело, но я пользуюсь ProxMox'ом.

Какие тесты Вас интересуют, завтра могу что-нибудь простое прогнать на своем железе, простое потому что ноут еще не до конца настроен, сравнивать могу железо под Виндой

а какой юзкейс использования виртуалки, если в наличии есть хостовая система?

на десктопе это игровая/рабочая виртуалки с настроенным софтом + виртуалка с файлохранилищем, локальными вебсервисами и настроенным бэкапом данных + резерв под тесты различных систем на "посмотреть и поковыряться". На ноутбуке мне критично защитить информацию, главным образом не от внешних атак, а от людей с кем работаю в коммандировке (заказчик, технадзор и просто неравнодушные люди), здесь главное что бы ушлые ручки за 10-30мин в вагончике не докопались до файлов. Виртуалка на хосте с Линуксом идеальное решение.

У меня тоже самое, и похожие юзкейсы. Хост-системой обычно не пользуюсь, там минималистичная система. Но не proxmox, обычный линукс.

Ryzen 1600 + 1050Ti/1066/1070 — полет нормальный.

Глупый вопрос, а звуковуха пробрасывается подобными методами в виртуалку? Естествеено не свежая а старая.

с интегрированной есть ряд вопросов, потому что если она в одной iommu группе с другим оборудованием, то могут быть проблемы, pci-e и usb обычно без проблем, но с usb проблемой будет микрофон, что бы уйти от наводок нужно пробрасывать контроллер, для звука достаточно пробросить usb-порт

если речь о звуке видеокарты с передачей его по hdmi/dp то проблем вообще никаких

pci старая.

Если звуковая карта PCI-E, то проблем возникнуть не должно, а вот если PCI, без Express...

после активации в файле grub опции iommu дайте две команды

lspci и find /sys/kernel/iommu_groups/ -type l

если в iommu_groups ваше устройство будет и будет изолировано от других устройств, то проблем с пробросом быть не должно. Обычно достаточно пробросить через настройку файла-конфигурации ВМ, загонять параметры как в случае с ВК в grub, не надо. По крайней мере так работает ProxMox... я пробросил на втором PCI-Express x16 Raid-контроллер SATA/SAS LSI 9211-8i, а вот с ВК пришлось повозится.

Мои статьи на эту тему (для ноутбука и для ПК):

https://habr.com/ru/post/575654/

https://habr.com/ru/post/437598/

Видеоролик с результатами проброса mobile GTX1660ti Max-Q в ноутбуке: https://www.youtube.com/watch?v=6pzdkXqI4sU

Видеоролик с результатами проброса GTX1070 на десктопе: https://www.youtube.com/watch?v=wjlmWHJiEug

Более странный случай: под DOS через порты ввода-вывода работает слот PCI (на материнке он всё равно подключен через PCI-PCI-E мост), не оформленный как устройство, т.е. не имеющий драйвера, VID/PID, с незаполненной таблицей параметров.
Есть ли шансы пробросить такой недослот в ВМ, желательно из Windows?

Есть ли шансы пробросить такой недослот в ВМ, желательно из Windows?

на самом деле пробрасывается не устройство, пробрасывается сам порт - пустой или с оборудованием.

На мой взгляд удобнее пробрасывать в ProxMox (надстройка над KVM+Debian Linux), я с Арч веткой не работал как и с чистым KVM+QEMU. Через WEB-интерфейс, на хост можно накатить GUI по вкусу.

https://pve.proxmox.com/wiki/Pci_passthrough

Если у вас на хосте в нативной системе в DOS/Windows порт работает корректно, то при пробросе, при условии, что порт пробросить возможно, см. мой предыдущий пост, иногда бывает что нельзя, все должно завестись и в госте.

Якобы Hyper-V умеет в проброс GPU, но я не пробовал. Я бросил эту затею на стадии Remote-FX.

Еще момент, для проброса PCI-E порта мать и ЦП должны поддерживать IOMMU + VT-d/AMD-Vi, для пробросы ВК требуется дополнительно поддержка VT-x для моделей на Интеле

Благодарю за ответ.
Ещё Oracle VirtualBox умеет, но для Windows хоста так и не сделали, хотя собирались.

ИМХО, KVM будет быстрее VB, да и возможностей/документации больше, как и куда посмотреть и подсмотреть. Ну да хозяин-барин. Под Винду если завезут такую штуку да еще и в пару кликов, то одназначно будет киллер фича.

насколько я помню, в версии 6,1 проброс выпилили.

Регресс, однако. Хотя даже в VB 6.1.22 для Windows в файле VBoxVMM.dll встречается упоминание IOMMU (ILLEGAL_IOMMU_PAGE_FAULT).

Не умеет. Потому и выпилили. Я пробовал VirtualBox 6.0 на Ubuntu 18 (поскольку VirtualBox 6.0 на Ubuntu 20.04 поставить не получилось), проброс RX560 не получился. Собственно как на сайте VirtualBox и написано, что потому и выпилили, т.к. не смогли доделать этот функционал.

Поправлю — VT-x является базовой виртуализацией, оно есть во всех процессорах Intel за последние много лет (кроме, может, Atom). А вот VT-d уже может отсутствовать.

верно. моя ошибка. ловите плюс

От себя добавлю, я хотел сделать возможность безпроблемного запуска win софта требующего opengl. особенностью было то, что виртуалку включил, поработал, что бы хост не перезагружать в win.

Проблемой стало то, что моя rx550 всё время, что не работает гость не крутила вентиляторами вообще. И почему то грелась. Обнаружил почти сразу, по запаху паленого текстолита. Выжила, тк обдувалась корпусным.

Так что на всякий случай проверьте свой вариант, мало ли что.

Чтобы такой проброс сделать, на физической машине достаточно 1-ой видеокарты? Или только если их больше, чем одна?

можно и с одной извернутся... но после пуска виртуальной машины на хосте пропадет картинка.

Обычно на интеграшку вешают хост, а дискретку пробрасывают в ВМ, либо на момент установки и настройки ставится вторая ВК и после настройки удаляется. Так тупо удобнее.

Только если больше чем одна. Железяка по сути «отвязывается» от хоста и «привязывается» в вм.
Помнится, я пытался извращаться с ребиндом девайса из вм назад в хост, но результат был не стабилен, и в итоге я забил. Но это было семь лет назад, может всё поменялось уже. В частности, появилась такая штука как VirGL, выглядела она вкусно, но я тогда уже перестал играться в pci passthrough в частности и попытки в линукс-гейминг в целом.
Для использования одного ускорителя на хосту и множества виртуальных машин — надо смотреть в сторону Nvidia vGPU, но производительность будет ниже само собой, ведь мощности ускорителя делятся на количество машин, плюс ещё дополнительные потери на некоторый код в драйверах систем.

Есть еще вариант со встроенной интеловской видяхой Intel GVT-g.

И еще - снимки состояния включенной машины при проброшенной видяхе не работают. Для Intel GVT-g это тоже справедливо. Но можно отправить машину в гибернацию, а уже после сделать снимок гибернизированной машины.

А вообще - немного поигрался с VmWare - там 3х мерное ускорение позволяет играть в игры (правда пробовал только старые). При этом задействуется хостовая видяха. Производительность процентов так на 30 меньше, чем натив. Если машин завпущено несколько, она судя по Furmarkу "разделяется" между ними.

Без проблем всё пробрасывается с одной видеокартой, 5 лет почти сидел на такой системе.

Не знаю как сейчас, но раньше достаточно было выгрузить родной драйвер GPU, отдетачить нулевую vtconsole и разбиндить efi-framebuffer. При этом монитор изчезает, отлаживать можно через ssh. Потом, для каждого пробрасываемого устройства, разбиндить его драйвер и сразу же забиндить vfio-pci модуль на этот vid:did.

Чтобы вернуться в хост, нужно повторить всё в обратном порядке. Раньше даже автодетект работал, не нужно было запоминать прошлый драйвер. Была одна лишь проблема: USB-контроллеры были у меня дванольные, а третьих не было, либо были какие-то драфтовые, без реализованного hci reset, который при возврате в хост происходит. Из-за этого какое-то устройство могло остаться в потустороннем мире до перезагрузки. Решалось перетыкиванием девайсов в те контроллеры, которые умели reset. Сейчас, подозреваю, везде уже xhci, с его возвратом из забвения в реальность проблем вроде как нет.

И, кстати, не нужно ничего хардкодить ни в ядро, ни патчить, всё без проблем динамически делается, в отличие от сказанного в статье. Достаточно разобраться в проблеме, а не нагрести с форумов копипаста, как сделал автор и запилить очередную говностатью.

По поводу производительности. Имелась в те времена карточка GTX1070. По тестам на ФПС при максимальном тюнинге всех возможных параметров были потери порядка 2-3%. Основная проблема была в инпут-лаге. Если задротить в компетишн шутеры, заметна была "аквариумность". Есть вероятность, что в соврмеренных процах поменьше VM-exit'ов происходит на каждый чих, поэтому лаг может быть чуть предсказуемее.

Статья так себе, если честно. Основной смысл работы в такой системе как раз в файн-тюнинге.

  1. Например, выделить память гостю можно через Huge Pages, чтоб поменьше дёргать страничный транслятор. Отключить merging страниц на худой случай, если huge pages против религии.

  2. Вынести IO в отдельный тред, и запинить афинити чтобы, хоть и редкими, но локами, не снижать latency.

  3. Отстроить маппинг очередей virtio-scsi, нативный TRIM, выключить промежуточные кеши. А ещё лучше заморочиться с vhost.

  4. И ещё несколько десятков оптимизаций, которые уменьшат суммарный оверхед до пары процентов.

  5. Для удобства выделения диска отлично подходит LVM thin provisioning: динамический ресайз, снапшоты и т. п. Хотя перформанс просаживал в несколько раз, когда юзал.

Хотел бы внести свои замечания и дополнения, не сочтите за грубость:

  • Правильные группы IOMMU изкоробки иметь приятно, но не обязательно, ведь есть патч ядра, который решает данную проблему.

  • Для античитов и драйверов нвидии в kvm есть скрытый режим. Благо нвидиа уже одумалась и разрешила ставить последние драйвера без танцев с бубном, но лично в моем случае производительность лучше именно в таком режиме.

  • Особо мощный ЦПУ не нужен, нужен современный, с хорошими возможностями виртуализации и количеством ядер больше 4х, если собираетесь играть. В моем случае ноутбук dell, i7 8750h, видеокарта внешняя GTX 1660, под VM выделено 12 Гб ОЗУ статически, 5 ядер процессора (10 потоков) с пиннингом, играю в киберпанк, ведьмак 3, производительность практически идентична реальному железу, фпс +- одинаковый.

  • Вывод звука через пульс аудио работает замечательно, но с usb микрофонами и звуковыми картами, подключенными в виртуальную машину, в играх могут быть проблемы. Полностью от проблем со звуком избавляет PCI usb контроллер, проброшенный в vm. Но в случае ноутбука с этим могут быть сложности, имейте в виду. Я столкнулся с проблемами в войс чате в Овервотч, игра временами подвисала, мой голос превращался в кашу, отключение войс чата полностью решало проблему. Для себя решил пока из виртуальной машины в играх микрофон не использовать.

У меня две виртуальных машины с проброшенными видеокартами одновременно крутятся под UnRaid (там та же технология, KVM/QEMU, VFIO) - я не очень замечаю разницы в именно по FPS. Может быть, там не 80 кадров, а 70 - это и некритично, и незаметно. А вот сами системы на поворотах подтормаживают - заметно, когда, например, Хром открываешь. Хотя их образы лежат SSD...

неважно где лежат образы, если речь про ISO образы систем

вероятно они работают на vdisk-файлах, что дает пенальти 30-50%, даже если этот SSD параллельно не используется кем-то другим (докером например)

хотите быстрый IO - пробрасывайте SSD в монопольное использование windows-виртуалки

Зачем такие сложности? Zvol + sata (с virtio так и не получилось наладить проброс trim, но дело было уже почти 6 лет назад)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий