Третья, заключительная часть серии, посвященной пробросу видеокарт в виртуальную машину и организации облачной игровой системы для удаленного подключения по локальной сети с различных устройств.
Если вы читали мою предыдущую статью на эту тему, то знаете, что у меня уже налажена весьма деликатная конфигурация для «облачного» гейминга. Состоит она из одного мощного настольного ПК, одной виртуальной машины с проброшенной GPU и клиентских машин, которые можно использовать для стриминга игр. Из соображений простоты (и низкой скорости интернета) я делал стриминг только по локальной сети.
И все же в этой конфигурации есть слабые места:
- Медленный энкодер видеокарты AMD. Достойную производительность мне удалось получить только при разрешении потокового видео 720p.
- VM Windows 10 иногда не могла запустить энкодер хоста, и драйверы видеокарты выдавали ошибки. Это исправлялось парой перезагрузок VM, и, как мне кажется, было связано с известной проблемой перезапуска (reset bug), которой в мире VFIO славятся карточки AMD – разбираться конкретнее мне не захотелось.
- Иногда потоковая передача либо обрывалась, либо тормозила. Это может быть вызвано картой AMD или самим Parsec.
Я много читал по этой теме и выяснил, что в большинстве случаев для получения оптимального игрового опыта рекомендуют использовать связку Nvidia GPU и Moonlight. Так что, было решено найти подходящую карту.
Видеокарта
На дворе 2021. Мир сходит с ума, и цены на видеокарты просто нереальные. В связи с этим я поумерил свой аппетит и склонился к простому варианту: GTX 1060 6G от MSI. Эта карта скромна, относительно современна для интересующих меня игр и обошлась примерно в ту же цену, сколько стоила новая 5 лет назад, то есть 260 евро. На лучшее в это коварное время рассчитывать не приходится.
Но, тем не менее, она работает! Проведенное в первом проекте тестирование показало, что Nvidia отключили в драйверах намеренный выброс ошибки error code 43
, что и сделало этот вариант возможным. Сама замена видеокарты проблем не вызвала. Нужно было лишь исправить ID PCI-устройств и через virt-manager
изменить закрепленные за VM Windows устройства, все.
Parsec: AMD vs NVIDIA
Поскольку конфигурация для стриминга с помощью Parsec уже была настроена, я решил провести небольшой тест, чтобы понять разницу между этими двумя карточками.
Предыдущая – это AMD Radeon RX570 4Gb от Sapphire. Эти две карты находятся в одном классе производительности, что весьма удачно для сравнения.
Вот некоторые результаты из двух кратких сессий тестирования в Dirt Rally. Прошу сделать на них скидку, так как проводились они без соблюдения каких-либо стандартов. Я просто выбрал одинаковые настройки графики и поиграл с запущенным окном статистики Parsec.
H.264
AMD RX 570: 10мс
NVIDIA GTX 1060: 3мс
H.265
AMD RX 570: 8мс
NVIDIA GTX 1060: 3мс
Разница в скорости кодирования просто огромна, особенно с учетом того, что время между двух кадров составляет 16.6мс при потоке 60fps. Часть задержки относится к передаче по сети и декодированию на клиенте, то есть, чем меньше время кодирования, тем лучше.
Parsec показал себя хорошо, но при этом возникли проблемы с выполнением GPU-декодирования на клиентах Linux. К тому же, в нем отсутствует клиент для iOS. И если последнюю проблему можно проигнорировать, то первую определенно нет.
Moonlight: опенсор-сокровище
Moonlight является альтернативой Parsec. В нем реализован протокол Nvidia GameStream и присутствуют клиенты для большинства популярных платформ. Тестирование я проводил на клиентах Linux (Fedora 34), ноутбуке с Windows 10 (ThinkPad X230), iPhone SE 2020 и старом Google Nexus 5. Я даже попытался запустить клиента Moonlight на Raspberry Pi 1 B+, но, по всей видимости, он для него староват, что привело к ошибке при запуске.
GTA V на Google Nexus 5? Куда реальнее, чем можно подумать
Для настройки Moonlight я открыл клиента и попробовал выполнить автоматическое обнаружение по сети – к сожалению, безуспешно. Так что пришлось ввести IP-адрес VM Windows вручную. Сработало. Инициировался процесс сопряжения, который нужно было продолжить с помощью Parsec, так как необходимо ввести код на машине хоста. После из Parsec я вышел и потоковую передачу начал уже через Moonlight.
Хотя не прям сразу. Moonlight может обнаруживать установленные в систему игры, но для получения такого же опыта удаленной работы с десктопом, какой обеспечивает Parsec, нужно проделать небольшой твик.
В самом начале я заметил, что качество изображения на десктопе хуже, чем в случае с Parsec. Однако в ходе игры это с лихвой компенсируется. Moonlight просто работает. При этом есть очень много опций, включая изменение качества изображения путем настройки разрешения, частоты кадров и ограничения скорости сети.
Лично для меня Moonlight подходит больше, поскольку клиент Linux, упакованный как Flatpak, может выполнять аппаратное декодирование через видеокарту. Играется на машине с Linux просто отлично, что нельзя назвать стандартным случаем. Даже старенький контроллер Xbox One при подключении по Bluetooth через Moonlight работает прекрасно.
Вообще, при использовании Moonlight единственная проблема была связана с сетью. Это хорошо заметно в поле Network jitter
встроенной статистики, которую можно вызвать комбинацией Ctrl + Alt + Shift + S
. После отключения нескольких сетевых служб эта проблема исчезла.
Конфигурация: месяц спустя
По итогам месяца использования я внес в конфигурацию некоторые изменения. Виртуальная машина у меня была запущена постоянно, и я в любой момент мог просто переключиться на нее, чтобы поиграть. Однако в связи с твиком, который я применил для повышения игровой производительности, половина ядер процессора оказались недоступны для других задач, например для повторного индексирования проекта в IntelliJ.
В итоге я решил включать VM, только если реально соберусь поиграть, хотя пока оптимального способа делать это еще не нашел. Я даже назначал запуск/остановку VM на клавишу калькулятора, но потом GNOME начала игнорировать эту привязку и все равно открывать калькулятор, так что проработал этот прием недолго.
Более же серьезным изменением стало сохранение всех игр в пуле ZFS, находящемся в другой VM. Для этого я настроил цель ISCSI, взяв за основу это руководство. При этом я использовал пакет tgt
. Все сработало на удивление хорошо, но цель ISCSI не хочет корректно подключаться в виртуальной машине Windows при первой загрузке, что несколько раздражает.
Позже я понял, что слабым местом являются HDD, и просто расширил SSD-хранилище. В противном случае другие процессы NAS могли нарушать игровой процесс в требовательных играх типа GTA V. Проявлялись проблемы в виде длительной загрузки и прорисовки объектов с запозданием – то есть при разъездах по карте буквально отсутствовала половина дорог и зданий.
Решение с ISCSI также дополнительно обеспечивает бэкап всех игр. Если Windows вдруг в очередной раз решит покончить с собой, и у меня не будет готов бэкап VM, то я просто ее переустановлю, не беспокоясь о скачивании и повторной установке всех игр.
Вердикт
В целом этой конфигурацией я очень доволен. Пользуюсь я ей не очень часто, но все равно круто иногда запустить Art of Rally или BeamNG.drive на любом из своих устройств.
В перспективе здесь, конечно, есть над чем задуматься, особенно касательно более высоких системных требований Windows 11 и современных игр. Сейчас же все работает отлично, и пока я ничего менять не собираюсь.
Автор: Дмитрий Брайт