Этот проект продолжит предыдущий, где я рассматривал настройку 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)
F1eex
25.10.2021 16:51+1Интегрированную графику Ryzen 7 5700G пробовали пробрасывать? Тоже интересный и полезный обществу опыт )
Programmer74
26.10.2021 14:39Если это не сарказм, то буквально предыдущая статья об этом
F1eex
26.10.2021 16:46+1Предыдущая о том, как используя AMD Ryzen 7 5700G APU были проброшены Nvidia GT 710 и AMD RX 570. Проброса встроенной Radeon RX Vega 8 там вроде как не было.
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
.
Isalight
26.10.2021 11:41Для Radeon (как и для Nvidia) можно использовать альтернативу Gamestream. Это Sunshine. Работает также на Linux и никаких зависимостей от посторонних сервисов. У Parsec (как и у других альтернатив которые я пробовал - Rainway, Reemo), например, не всегда хорошая работа с Vulkan и DirectX 12 играми.
khajiit
28.10.2021 13:28+1Использовать плату с большим количеством слотов SATA или M.2. Это существенно упрощает проброс устройств хранения данных
Не нужно.
настроить с помощью Samba общий доступ к виртуальной машине с NAS и разместить на ней библиотеку Steam с прочими игровыми файлами
Очень тормозно.
У вас же ZFS? iSCSI+zvol+unmap+volblocksize=64k+UNIT=64k(NTFS)=== charm.
Можно включить дедупликацию, если есть возможность пожертвовать десяток ГБ ОЗУ на DDT — для двух реальных компов и одной виртуалки это работало более чем.
dvrpd
В virt-manager количество потоков — оно на каждое ядро, а не общее, так что предполагаю, что виртуалка начала эмулировать все 32 потока.
zstas
по умолчанию qemu создает отдельные cpu, но есть вариант сделать с ядрами, например: