Проброс видеокарты с помощью VFIO может быть знаком немногим, но по факту является очень удобным способом решить ряд насущных задач и упростить рабочий процесс в целом. В этом проекте мы настроим нужную конфигурацию из под Fedora 34 и поочередно пробросим две разные видеокарты в VM, попутно оценив полученную производительность.

Вступление


Прежде чем перейти ко всем подробностям, хочу вкратце описать, с чем вообще мы будем иметь дело, так как эти темы могут оказаться для вас незнакомыми. Технология VFIO является достаточно нишевой, и о ней мало кто знает.

  • Проброс GPU: процесс, в котором виртуальной машине (VM) предоставляется в пользование выделенная видеокарта. Это позволяет выполнять внутри VM рабочие нагрузки, ориентированные на GPU, например, игры или иные задачи, опирающиеся на производительность GPU.
  • VFIO: фреймворк, позволяющий выполнить эту операцию.
  • IOMMU: аппаратная особенность, которая все это поддерживает.
  • virt-manager: приложение GUI, через которое я управляю VM.

Какой вообще смысл заморачиваться и реализовывать подобное?

  • Вы пользуетесь Linux, но хотите иногда запускать игры без перезагрузки под Windows.
  • Вы хотите выполнять все рабочие, игровые и серверные процессы на одной машине.
  • Вы просто не хотите собирать выделенный ПК под игры и предпочтете задействовать имеющиеся ресурсы на основной машине.
  • Вам нужно больше контроля над установкой Windows, потому что Microsoft вы не доверяете.
  • Вам нужно больше контроля над установкой Windows, а также возможность возвращать этот процесс к более ранней точке, используя файловую систему с поддержкой снимков состояния (BTRFS, ZFS).
  • У вас есть несколько отдельных VM для разных целей, но вы хотите задействовать один GPU для всех.

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

  • Видеокарта, которую вы хотите пробросить, должна поддерживать UEFI. Ускорители, выпущенные в течение последних пяти лет, должны такую поддержку иметь. Если же у вас старенькая модель, которую вы хотите использовать для тестирования, то она может показать себя недостаточно хорошо.
  • Вам понадобится достаточно мощный CPU и большой объем RAM, так как, по сути, вы будете запускать отдельный ПК внутри основного.
  • Материнская плата должна поддерживать IOMMU и иметь группы IOMMU, позволяющие изолировать GPU и передать в распоряжение VM только его. Ребята на канале Level1Techs делают много обзоров на материнские платы, и Венделл, в том числе, обсуждает группы IOMMU, а также пригодность плат для VFIO. Также не будет лишним поискать в интернете энтузиастов, которые уже купили такую плату. Есть вероятность, что они поделились информацией о поддержке в ней IOMMU. Вот неплохой скрипт, который позволит выполнить проверку доступности групп IOMMU.
  • Некоторые игры могут накладывать бан, если обнаружат запуск из-под VM. Это здорово, что в них реализована защита от читерства, но, к сожалению, пользователи VFIO в данном случае страдают несправедливо.

Так что, если вы много играете в соревновательные игры, то лучше прояснить этот момент заранее.

Надеюсь, что данное введение помогло вам понять, что к чему. Теперь же окунемся в сам процесс.

Настройка


Мы будем тестировать эту конфигурацию на оборудовании, о котором я уже писал. Особенность данной конфигурации в том, что мы используем AMD Ryzen 7 5700 APU на материнской плате mITX и один выделенный GPU. Это дает нам большие возможности в малых масштабах.

Да, существуют конфигурации, в которых можно реализовать VFIO с помощью одного GPU и пробросить его между основной ОС и VM, но такой конфиг будет сложновато использовать.

В качестве ОС у меня стоит Fedora 34. Для того чтобы все наладить, я воспользовался несколькими ресурсами:


Тестирование


Начальное тестирование я решил произвести с Nvidia GT710. Она медленная, плохо работает под Linux с опен-сорсными драйверами Nouveau, но зато оказалась под рукой. Еще я недавно услышал, что Nvidia все-таки повернулись лицом к клиентам, позволив использовать видеокарты GeForce в VM Windows 10 без костылей.

Сам процесс тестирования относительно прост. Единственные сложности, с какими я столкнулся – это проблемы PEBCAK. Возможно, причина была в том, что тестированием я занимался уже после работы. Основная проблема – это небольшие опечатки в конфигурации dracut или ошибки в ID устройств, добавляемых в параметры загрузки ядра. Когда я это выяснил и исправил, процесс пошел как по маслу.

Все руководство я здесь переписывать не стану – если вас заинтересуют дополнительные детали, прошу обратиться к приведенным выше ресурсам. К тому же эти ресурсы наверняка будут оперативнее обновляться в случае каких-либо нововведений или появления дополнительных возможностей.

Что касается самого процесса, то в общих чертах нужно проделать следующее:

  • Убедится, что IOMMU активирована в настройках UEFI. По умолчанию эта опция наверняка установлена на auto, так что обязательно переключите на enabled.
  • Установить видеокарту, которую планируете пробрасывать, и подключить к ней монитор.
  • Установить в Fedora пакеты виртуализации: sudo dnf install @virtualization.
  • Включить IOMMU и предварительно загрузить модуль ядра VFIO, добавив в параметры загрузки amd_iommu=on rd.driver.pre=vfio-pci.
    • Я использую GRUB2, так что эти параметры находятся в /etc/sysconfig/grub.
    • Для применения изменений нужно повторно сгенерировать конфигурацию GRUB. Из-под Fedora это делается с помощью grub2-mkconfig -o /etc/grub2-efi.cfg
  • Получить ID устройств для видеокарты и связанного аудиоустройства, которые планируется пробрасывать.
    • Чтобы просмотреть устройства и их ID, выполните lspci -nnk. ID будут выглядеть как 1002:aaf0.
  • Привяжите GPU к vfio-pci, чтобы избежать перехвата драйвером видеокарты управления ей. В противном случае пробросить видеокарту в VM не удастся.
    • Я решил пойти простым путем и добавил ID устройств в параметры ядра: vfio-pci.ids=1002:67df,1002:aaf0.
    • В связи с этим мне пришлось еще раз сгенерировать конфигурацию GRUB.
  • Убедитесь, что initramfs загружает необходимые драйверы vfio на ранней стадии загрузки.
    • В случае с Fedora 34 это означает создание файла /etc/dracut.conf.d/10-vfio.conf с содержимым add_drivers+=" vfio_pci vfio vfio_iommu_type1 vfio_virqfd ".
    • Убедитесь в отсутствии опечаток.
    • Повторно сгенерируйте initramfs: dracut -f.
  • Перезагружайте!
  • Используя virt-manager, выберите VM, которой хотите пробросить видеокарту, и добавьте два устройства PCIe: видеокарту и связанное с ней аудиоустройство.
    • Если VM у вас еще не настроена, то перейдите к стандартной установке пока без проброса. Не забудьте создать UEFI VM, иначе могут возникнуть проблемы. Настроить это можно в разделе "_Overview_" virt-manager путем выбора чипсета Q35 и установки прошивки на OVMF_CODE.df.
    • Если вы пробросили GPU, то не забудьте удалить из VM устройство Display Spice.
    • Если вам также нужен контроль над VM, то нужно дополнительно пробросить USB-устройства, например, беспроводной приемник Logitech.
  • Запустите VM и можете быть довольны, если на экране подключенного к проброшенной видеокарте монитора появится эмблема TianoCore.



Если вы это видите, значит, проброс выполнен успешно. Поздравляю!

Результаты для Nvidia GT 710


Начальное тестирование с Nvidia GT710 прошло успешно. Под «успешно» я подразумеваю, что видеокарта вывела изображение без автоматической установки своих драйверов.


Печально известный код ошибки Nvidia: 43

Чтобы исправить эту проблему, я скачал последние официальные драйверы Nvidia, чего оказалось достаточно – ошибка 43 исчезла.


Если ваша видеокарта исправно отображается в Device Manager, то все в порядке.

Однако веселья поубавилось, когда стало очевидно, что моя видеокарта слаба. Очень слаба. Несмотря на это, я решил продемонстрировать ее вычислительную удаль, скачав демку Art of Rally.

Примечание: игра просто улетная, обязательно попробуйте!

И демка запустилась! Не идеально, но все же запустилась.


Не передается: ужасная частота кадров.

Удовлетворенный результатами, я решил пойти до конца и заменить эту карту на AMD RX570, которую «одолжил» у недавно собранного ПК.

Результаты для AMD RX 570


Переставив видеокарту, я поменял ID устройств на новые значения и продолжил приключение с VFIO. На этот раз Windows автоматически установила драйверы видео, и все заработало сходу. Хотя это меня удивило, так как в моем опыте всегда что-то да идет не так. Всегда.

Я установил последние драйверы с сайта AMD и продолжил тестирование.

Furmark? Работает ожидаемым образом.


VM слева, показатели быстродействия VM справа, куча кабелей повсюду

GTA IV? Лагает не по-детски, но работает.


Слева: GTA IV напрямую с GPU. Справа: стриминг GTA IV через Parsec

В этой ситуации VM получила 4 ядра CPU, и я не делал ни привязки потоков к процессору, ни каких-либо оптимизаций, так что результат получился неплохой.

Хранилище


Так как я собрал этот конфиг на своей текущей рабочей/серверной машине, ситуация с хранилищем оказалась витиеватой. Другая VM, которая выполняет все службы, имеет полный доступ к двум дискам по 12Тб, а сетевое хранилище мне настраивать не хотелось. Единственными свободными точками у меня были:

  • Раздел 120Гб на NVMe SSD. Достаточно для хранения системных файлов Windows 10.
  • 2 раздела по 250Гб на SATA 1TB SSD. Как раз впору для хранения моих недавних игр, но не более. Настроены в чередующейся конфигурации под Windows.

Позже я решил расширить разделы под хранение игр до 375Гб, для чего потребовалось избавиться от дополнительного резервного пространства. Такая настройка вполне неплоха, но я теряю некоторые выгоды от виртуализации Windows.

Относительно передачи этого хранилища VM у меня было два варианта:

  • Продолжить использовать виртуальный диск SATA: работает из коробки, но может проседать в производительности.
  • Использовать virtio: необходимо вручную загрузить и установить драйверы для распознания этих дисков Windows, хотя быстродействие должно оказаться выше, чем в случае с SATA.

Я начал с SATA и провел сравнение с virtio при помощи CrystalDiskMark.


Слева: SATA. Справа: virtio

Virtio несколько вырвался вперед в этих сравнениях, но меня бы наверняка устроила и производительность SATA.

Заключение


Одна из основных причин, по которым я настраиваю подобные сборки – это сам процесс воплощения технической идеи. Звучит странно, но иногда меня больше радует сам факт успешного завершения технической части и реализация чего-то нового, чем реальное дальнейшее использование этого.

Ранее я получил смешанный результат проброса видеокарты на ноутбуке ThinkPad T430 с eGPU, умудрившись запустить на виртуальной машине GTA V, хотя в другой тестовой сессии возникли проблемы, вызванные, как оказалось, дефектом CPU (множество ошибок PCIe).

В дальнейшем я планирую продолжить подобные эксперименты. Хочу задействовать эту VM в качестве игровой, чтобы стримить с нее игры через Parsec на любое устройство. Один из вариантов – это использовать Nvidia Shield TV в качестве маломощного блока, способного выполнять стриминг. В качестве альтернативы можно сделать сборку на базе миниатюрного ПК Dell/Lenovo/HP, который имеет достаточно мощи для работы с 4K дисплеем, потребляя при этом не так много энергии. Подробнее об этом в будущих постах.

Что касается хранилища, то я планирую его скорый апгрейд. Либо поменяю только диски, либо обновлю всю сборку, так как ATX-платы поддерживают больше SATA подключений и карт расширений. Если еще вписать все это в корпус типа Masterbox Q500L, снарядив его хорошим БП, то даже тогда получится все еще относительно небольшая конфигурация.

Комментарии (33)


  1. redneko
    24.10.2021 18:16
    +6

    Может быть кому-то пригодится (заодно и себе заметочка будет). Как-то раз настраивал проброс двух 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>


  1. rPman
    24.10.2021 18:48
    +1

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

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

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


    1. 13werwolf13
      24.10.2021 19:58
      +2

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

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

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

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

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


      1. loltrol
        24.10.2021 20:47

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


      1. bilayan
        25.10.2021 19:18

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

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


        1. LuchS-lynx
          25.10.2021 22:27

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


    1. LuchS-lynx
      24.10.2021 20:16

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

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


      1. hMartin
        24.10.2021 22:48

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


        1. LuchS-lynx
          24.10.2021 22:57
          +2

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


          1. sHaggY_caT
            26.10.2021 19:54

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


    1. khajiit
      28.11.2021 23:32

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


  1. ZekaVasch
    25.10.2021 01:10

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


    1. LuchS-lynx
      25.10.2021 07:22

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

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


      1. ZekaVasch
        25.10.2021 07:23

        pci старая.


        1. LuchS-lynx
          25.10.2021 08:21
          +1

          Если звуковая карта 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


          1. drWhy
            25.10.2021 10:15

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


            1. LuchS-lynx
              25.10.2021 11:06
              +1

              Есть ли шансы пробросить такой недослот в ВМ, желательно из 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 для моделей на Интеле


              1. drWhy
                25.10.2021 11:13

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


                1. LuchS-lynx
                  25.10.2021 11:16
                  +1

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


                1. lost55
                  25.10.2021 11:32
                  +1

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


                  1. drWhy
                    25.10.2021 11:53

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


                1. F1eex
                  25.10.2021 16:20

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


              1. DaemonGloom
                25.10.2021 14:20
                +1

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


                1. LuchS-lynx
                  25.10.2021 14:43

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


  1. lost55
    25.10.2021 05:55
    +1

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

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

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


  1. OZR
    25.10.2021 11:45

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


    1. LuchS-lynx
      25.10.2021 12:01
      +1

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

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


    1. nev3rfail
      25.10.2021 12:12
      +1

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


    1. Fenex
      25.10.2021 14:24

      Для использования одного ускорителя на хосту и множества виртуальных машин — надо смотреть в сторону Nvidia vGPU, но производительность будет ниже само собой, ведь мощности ускорителя делятся на количество машин, плюс ещё дополнительные потери на некоторый код в драйверах систем.


    1. F1eex
      25.10.2021 16:29

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

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

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


    1. TrueBers
      26.10.2021 15:47
      +2

      Без проблем всё пробрасывается с одной видеокартой, 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: динамический ресайз, снапшоты и т. п. Хотя перформанс просаживал в несколько раз, когда юзал.


  1. ChepKun
    26.10.2021 01:40
    +2

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

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

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

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

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


  1. StarJohn
    26.10.2021 08:10

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