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

Облачный гейминг?


Запуск игр в облаке становится все более популярен при том, что Microsoft, Google, Nvidia и другие компании предлагают услуги потоковой передачи игрового процесса на ваше устройство. Подобные конфигурации, как правило, опираются на мощный сервер в датацентре, который обрабатывает саму игру, отправляя сжатый видеопоток на устройство пользователя. Работает такая технология на удивление хорошо, но ввиду высокой стоимости, низкой скорости интернета во многих регионах планеты и сложностей с лицензированием, такой вариант подойдет не для всех.

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

Вот некоторые варианты:

  • Steam remote play: работает для игр, запущенных через Steam.
  • Parsec: может стримить весь десктоп, включая игры.
  • Moonlight: то же самое, но работает только на хостах с Nvidia GPU, так как в основе реализации лежит протокол Nvidia GameStream.

В прошлом я добивался неплохих результатов со Steam remote play, но ограничивающим фактором выступала зависимость от Steam. Недавно же я купил пару игр от GOG, в которые наверняка можно играть удаленно, запустив их через Steam, но мне не хочется с этим возиться.

В конкретно данной конфигурации я предпочел использовать Parsec. Он не идеален, но для наших целей вполне сойдет. Используемая видеокарта, а именно Radeon RX570, также вносит свои ограничения, поскольку с Moonlight работать не может.

Для начала Parsec необходимо установить на клиентскую и хост машины. У меня в роли клиента выступает возвращенный с того света Lenovo ThinkPad X230. Он не блещет быстродействием, но все же может выполнять аппаратное декодирование H.264 и в состоянии покоя использует всего 12Вт энергии, что делает его идеальным кандидатом для подобного тестирования. Также отмечу, что обе машины я подключил к локальной сети через Ethernet, чтобы исключить возможные проседания в скорости из-за WiFi.

VFIO, игры и Вы


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

Благодаря отличному руководству Arch я придумал много вариантов, которые потенциально способны повысить быстродействие этой виртуальной машины для гейминга.

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

Что я в итоге проделал:

  • Установил модель CPU в virt-manager как host-passthrough.
  • Использовал динамическое изолирование ядер CPU, привязанных к VM, чтобы исключить использование этих ядер ОС хоста и другими VM.
  • Настроил CPU governor (диспетчер выбора частоты процессора) на повышение быстродействия изолированных ядер, чтобы исключить проблемы с недостаточной частотой и переключением между режимами ожидания/работы: echo performance > /sys/devices/system/cpu/cpu[4-7]/cpufreq/scaling_governor.
  • Включил статический пул HugePages для исключения проблем с низкой скоростью обработки памяти.
  • Отключил SMT в настройках UEFI, устранив одну дополнительную переменную.
  • Установил комплект 64Гб DDR4-3600, чтобы выделить больше памяти для VM (16Гб), оставив достаточно для хоста и других служб.

Золотое правило при отладке конфигурации — это менять по одному параметру за раз, сопоставляя полученные результаты с исходными. Не каждое из сделанных мной изменений оказалось положительным. Например, при настройке VM на использование 4 ядер и 8 потоков вместо просто 4 ядер, частота кадров в GTA V упала вдвое. Предполагаю, что VM рассматривала “SMT ядра” как реальные, сбивая планировщика Windows с толку.

Поэкспериментировав с этой настройкой и применив перечисленные приемы, я смог избавиться от большинства проблем, получив уже более плавный геймплей. Наконец-то, при игре на виртуальной машине стало чувствоваться, что под капотом у нее 4 ядра, 16Гб RAM и RX570.


Результат теста производительности CPU в Passmark до доработок


Тот же тест Passmark после доработок


Результат теста быстродействия памяти в Passmark до доработок


Тот же тест Passmark после доработок

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

Проблемы с видеокартой


Parsec и другие аналогичные решения кодируют изображение в видеопоток посредством энкодера на самом кристалле видеокарты. В настройках это может обозначаться, как hardware encoding (аппаратное кодирование). Я же до сборки этой конфигурации не знал, что энкодеры видеокарт AMD славятся своей слабостью:

Если на хосте установлена карта от AMD, то кодирование обычно выполняется намного медленнее, чем на картах Nvidia и даже Intel. Хотя при низких разрешениях проблем наблюдаться не должно. Если все гости поддерживают кодек H.265, то при его включении производительность будет выше.

И это ощутимо. При попытке стримить игры с разрешением 1080p результатом стала непоследовательная лагающая неразбериха. Представьте, что пытаетесь играть примерно на 30фпс, а график частоты кадров напоминает мониторинг сердечного ритма – именно так это ощущалось. При 720p процесс уже был намного плавнее. Да, качество изображения в этом случае страдает, но уже можно хоть как-то играть.

Я также решил попробовать сменить кодек с H.264 на H.265. Результат я протестировал в Dirt Rally ввиду наличия в этой игре режима зацикливания бенчмарка. При использовании H.264 задержка кодирования составляла около 10мс. В случае с H.265 ее показатель сократился до 8мс. Не особо впечатляет, но все же на 20% лучше. Недостатком этого приема для моей конфигурации было то, что клиентский ноутбук просто не поддерживает аппаратно-ускоренное декодирование H.265, поддержка которого появилась во встроенных GPU Intel, начиная с процессоров 7-го поколения.

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

Еще одна проблема, замеченная с помощью MSI Afterburner, заключалась в нестабильности фреймрейта в некоторых играх, например в GTA V. Уже после всех исправлений и доработок все равно продолжали возникать небольшие фризы, даже при включении vsync. Я решил пройтись по настройкам AMD Radeon, чтобы понять, не вызывает ли какая-нибудь из фич драйвера побочный эффект.

У меня был выбран режим Gaming, ведь именно для этого видеокарта и использовалась, но в итоге я решил изменить его на Standard. И тут волшебным образом фризы пропали! Подозреваю, что причиной могла быть опция Radeon Anti-Lag, поскольку это одна из основных настроек, которые оказались отключены после переключения на Standard.

Стоит ли оно того?


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

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

Если готовить машину конкретно для такой рабочей нагрузки, то я бы посоветовал изменить следующее:

  • Заменить гибридный процессор на стандартный, например Ryzen 9 5950X. Благодаря физически разделенной компоновке ядер можно присвоить один их сегмент игровой VM, а остальные оставить хосту. Эти процессоры также имеют большой объем L3 кэша, что окажется кстати в нагрузках, требующих низкую задержку, в тех же играх.
  • Если вы собираетесь делать сборку для стриминга, то лучше начать с видеокарты Nvidia. Ошибки 43 уже нет, так что эти GPU стали вполне пригодны для таких решений, как Moonlight.
  • Использовать плату с большим количеством слотов SATA или M.2. Это существенно упрощает проброс устройств хранения данных.

Дальнейшие планы


На этом мое приключение не заканчивается. Недавно я решил подыскать видеокарту Nvidia, чтобы провести сравнение с моей RX570. В итоге мне попалась GTX1060, которая происходит из той же эпохи и имеет примерно схожие характеристики производительности. Думаю, получится неплохой проект сравнения этих карт в сценариях Parsec vs Parsec и Parsec vs Moonlight.

Также надеюсь, что все же мне удастся перейти к использованию более современного клиентского ПК, который будет поддерживать H.265 и более высокие разрешения вывода. Да, 4K при 60Гц – это излишне накладно для ноутбука из 2012. Если же учесть, что речь идет о ThinkPad, то случится это где-то после 2025.

Что касается конфигурации хранилища, то приятель посоветовал мне настроить с помощью Samba общий доступ к виртуальной машине с NAS и разместить на ней библиотеку Steam с прочими игровыми файлами. В конце концов, скорость передачи по виртуальной LAN в ходе тестирования достигала 2-3ГГбит/с. А учитывая наличие в ZFS 2.0 постоянного кэша L2ARC, я смогу воспользоваться и этим (если мне вообще понадобится L2ARC, так как и ARC весьма эффективен). Сейчас NAS и игровая виртуальные машины синхронизированы просто через Syncthing, то есть, как минимум, базовый бэкап всех игр у меня имеется.

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


  1. dvrpd
    25.10.2021 16:35

    Например, при настройке VM на использование 4 ядер и 8 потоков вместо просто 4 ядер, частота кадров в GTA V упала вдвое. Предполагаю, что VM рассматривала “SMT ядра” как реальные, сбивая планировщика Windows с толку.

    В virt-manager количество потоков — оно на каждое ядро, а не общее, так что предполагаю, что виртуалка начала эмулировать все 32 потока.


    1. zstas
      25.10.2021 18:46

      по умолчанию qemu создает отдельные cpu, но есть вариант сделать с ядрами, например:

      -smp 4,sockets=1,cores=4,threads=1,maxcpus=4


  1. F1eex
    25.10.2021 16:51
    +1

    Интегрированную графику Ryzen 7 5700G пробовали пробрасывать? Тоже интересный и полезный обществу опыт )


    1. Programmer74
      26.10.2021 14:39

      Если это не сарказм, то буквально предыдущая статья об этом


      1. F1eex
        26.10.2021 16:46
        +1

        Предыдущая о том, как используя AMD Ryzen 7 5700G APU были проброшены Nvidia GT 710 и AMD RX 570. Проброса встроенной Radeon RX Vega 8 там вроде как не было.


    1. khajiit
      28.10.2021 13:38

      Если она не загрузочная, то должна пробрасываться нормально: в районе 4000G, емнип, на процах со встройкой починили iommu-группы (где-то в недрах реддита попадался вывод с системы с 4600G).


      Посмотреть группы можно таким скриптом:


      $ cat bin/lsiommu 
      #!/bin/bash
      shopt -s nullglob
      for d in /sys/kernel/iommu_groups/*/devices/*; do
          n=${d#*/iommu_groups/*}; n=${n%%/*}
          printf 'IOMMU Group %02g ' "$n";
          lspci -nns "${d##*/}"
      done;

      Для вящего перфекционизму можно запайпить вывод в sort.


  1. Isalight
    26.10.2021 11:41

    Для Radeon (как и для Nvidia) можно использовать альтернативу Gamestream. Это Sunshine. Работает также на Linux и никаких зависимостей от посторонних сервисов. У Parsec (как и у других альтернатив которые я пробовал - Rainway, Reemo), например, не всегда хорошая работа с Vulkan и DirectX 12 играми.


  1. khajiit
    28.10.2021 13:28
    +1

    Использовать плату с большим количеством слотов SATA или M.2. Это существенно упрощает проброс устройств хранения данных

    Не нужно.


    настроить с помощью Samba общий доступ к виртуальной машине с NAS и разместить на ней библиотеку Steam с прочими игровыми файлами

    Очень тормозно.


    У вас же ZFS? iSCSI+zvol+unmap+volblocksize=64k+UNIT=64k(NTFS)=== charm.
    Можно включить дедупликацию, если есть возможность пожертвовать десяток ГБ ОЗУ на DDT — для двух реальных компов и одной виртуалки это работало более чем.