О технологии RemoteFX от Майкрософт, которая повышает качество работы в режиме удалённого рабочего стола, известно давно. В интернете хватает материалов, демонстрирующих её эффективность. Но большинство оценок носят качественный характер: «вот играем в %game_name%, fps в норме», «вот запустили 3D софт, как будто локально работает! Скриншот здесь, видео там».
В данном исследовании мы разберёмся, как перейти от «попугаев» к конкретным метрикам, чтобы количественно оценить эффективность технологии и объективно сравнить её использование с обычным режимом RDP.
Содержание
-
Кратко о RemoteFX
-
Конфигурация тестовой среды
-
Сервер
-
Клиент
-
-
Выбор показателей для измерений
-
Методика тестирования
-
Тест #1: ввод текста
-
Тест #2: ввод текста + 3D BenchMark
-
Тест #3: ввод текста + просмотр локальных видеофайлов
-
Тест #4: ввод текста + просмотр youtube-ролика
-
-
Обработка данных и построение графиков
-
Анализ результатов и наиболее интересные графики
-
Задержки при обработке ввода от пользователя
-
Частота кадров
-
Общие сетевые метрики
-
Загрузка центрального процессора
-
Загрузка видеокарты
-
-
Выводы
-
Что дальше
-
Список источников
-
Приложения
-
Переопределение групп сбора данных: _1_task_define.cmd
-
Принудительная остановка записи данных: _1_task_breake.cmd
-
Конвертация двоичных данных в CSV: blg2csv.cmd
-
Нормализация заголовков CSV: blg2csv.ps1
-
Jupiter Notebook: импорт данных
-
Jupiter Notebook: отрисовка одной метрики на диаграмму
-
Jupiter Notebook: отрисовка всех метрик на одной диаграмме
-
Диаграмма со всеми графиками
-
Кратко о RemoteFX
Традиционный RDP работает так, чтобы как можно больше работы по отрисовке окна удалённого рабочего стола переложить на клиента: по сети передаются графические примитивы и инструкции, которые должна выполнить клиентская видеокарта. Такой подход, в случае показа видео или использования интерфейса Windows Aero, требует поддержки со стороны клиента. Иначе вместо Aero будет использована упрощённая схема, а обработанный CPU сервера видеопоток передан клиенту в виде растровой графики, производительность отрисовки при этом может оказаться просто неприемлемой. Поэтому приходилось выбирать: либо использовать традиционный RDP только в связке с достаточно производительным клиентским железом, либо отказываться от сложной графики.
При включении RemoteFX клиенту по сети по прежнему передаются растровые кадры. Но есть два существенных отличия от традиционного RDP. Во-первых, вся подготовка и обработка графики перекладывается на GPU сервера, это происходит намного быстрее и разгружает CPU. А во-вторых, используется сжатие кадра, которое выполняет кодек RemoteFX. Это существенно снижает объём передаваемых по сети данных, тем самым разгружая канал связи. Это существенно снижает требования к клиентскому железу, но сохраняет достаточный уровень отрисовки и отзывчивости удалённого рабочего стола.
Конфигурация тестовой среды
Сервер
-
2 vCPU Intel(R) Xeon(R) CPU E5-2696 v4 @ 2.20GHz
-
8 GB RAM
-
GPU NVIDIA GRID M60-1Qб, Dedicated Memory 929 MB, Shared Memory 4095 MB
-
гостевая ОС Windows Server 2019 Standart x64 1809 (Version 10.0.17763.1577), DirectX 12
-
network in/out rate limit 50 Mbps
Клиент
-
Intel(R) Core(TM) i5-7600K CPU @ 3.80GHz, 3801 МГц, ядер: 4, логических процессоров: 4
-
16 GB RAM
-
network in/out rate limit 100 Mbps
-
OS Windows 10 Pro 2004 (Version 10.0.19041.685), DirectX 12
-
настройки RDP-сеанса
-
1920 x 1080 (32 bit) (32Hz)
-
на вкладке «Взаимодействие» выбрано «Локальная сеть (10 Мбит/с и выше)»
-
Выбор показателей для измерений
Качество и производительность удалённого рабочего стола нужно оценить с точки зрения как пользователя, так и потребления облачных ресурсов. Будем собирать данные о частоте кадров отрисовки, задержках отклика на ввод данных, сетевом трафике и загрузке CPU/GPU/RAM. Метрики выбраны с учётом официальных рекомендаций по диагностике.
Замеры выполним с помощью стандартного средства Системный монитор
. Для этого на каждый тест определим свой сборщик данных, который в течении двух минут будет каждую секунду фиксировать в двоичном blg-файле журнала показания счётчиков:
Показания
-
Графика RemoteFX(*)Качество кадра
-
Графика RemoteFX(*)Исходящих кадров в секунду
-
Графика RemoteFX(*)Входящих кадров в секунду
-
Графика RemoteFX(*)Среднее время кодирования
-
Графика RemoteFX(*)Коэффициент сжатия графических данных
-
Графика RemoteFX(*)Пропущено кадров в секунду — у сервера недостаточно ресурсов
-
Графика RemoteFX(*)Пропущено кадров в секунду — недостаточно сетевых ресурсов
-
Графика RemoteFX(*)Пропущено кадров в секунду — у клиента недостаточно ресурсов
-
Задержка ввода данных пользователем на сеанс(Max)Максимальная задержка ввода
-
Сведения о процессоре(_Total)% загруженности процессора
-
NVIDIA GPU(*)% Video Decoder Usage
-
NVIDIA GPU(*)% Video Encoder Usage
-
NVIDIA GPU(*)% GPU Memory Usage
-
NVIDIA GPU(*)% GPU Usage
-
NVIDIA GPU(*)% FB Usage
-
Сеть RemoteFX(*)Потери
-
Сеть RemoteFX(*)Общая скорость отправки
-
Сеть RemoteFX(*)Общая скорость приема
-
Сеть RemoteFX(*)Скорость отправки TCP-данных
-
Сеть RemoteFX(*)Скорость отправки UDP-данных
-
Сеть RemoteFX(*)Общая скорость приема
-
Сеть RemoteFX(*)Скорость получения TCP-данных
-
Сеть RemoteFX(*)Скорость получения UDP-данных
-
Сеть RemoteFX(*)Пропускная способность текущего TCP-подключения
-
Сеть RemoteFX(*)Пропускная способность текущего UDP-подключения
-
Память% использования выделенной памяти
-
ПамятьДоступно байт
PS. По непонятной причине данные по оперативной памяти не сохранялись в журнал при выполнении задания группы сбора, хотя «вживую» Системный монитор
нормально строил графики по обоим показателям. Сброс кэша счётчиков не помог.
Методика тестирования
Чтобы оценить эффективность использования выделенной видеокарты на облачным сервере, нужно провести две серии одинаковых тестов: до и после включения отрисовки удалённого рабочего стола на GPU.
В каждой серии выполним следующие тесты:
-
ввод текста
-
ввод текста + 3D BenchMark
-
ввод текста + просмотр локальных видеофайлов
-
ввод текста + просмотр youtube-ролика
Для оценки влияния теста на задержку обработки ввода от пользователя поверх основной программы открывается стандартный Блокнот
и зажимается произвольная клавиша. Окно редактора на протяжении теста будет постоянной частью всех кадров, поэтому исказит результат в лучшую сторону. Чтобы снизить эффект, размер окна уменьшим до 122*156% 99% кадра будут меняться и визуально будет видно, что имитация активности пользователя работает.
Тест #1: ввод текста
В качестве тестов рекомендуется «использовать любые приложения, которые плотно работают с графикой (например, потоковое видео), приложения, использующие DirectX». Результаты первого теста, с точки зрения пользователя (частота кадров и задержка ввода), практически одинаковые. Поэтому строить графики и анализировать их нет особого смысла. Такой тест больше пригодится для диагностики RemoteFX.
Тест #2: ввод текста + 3D BenchMark
Выполнялся при помощи FurMark в полноэкранном режиме.
Тест #3: ввод текста + просмотр локальных видеофайлов
Локальные видеофайлы воспроизводились в Windows Media Player, равёрнутом на весь экран, без установки каких-либо дополнительных кодеков, по кругу в следущем порядке:
-
«Ants carrying dead spider»: 1920 x 1080, 10667 кбит/с, 19 секунд, 29.97 fps
-
«Flying Through Forest 1»: 1920 x 1088, 48072 кбит/с, 9 секунд, 25 fps
-
«Low Angle Of Pedestrians Walking In Busy Street, Daytime»: 4096 x 2160, 31721 кбит/с, 13 секунд, 25 fps
Единственным критерием отбора была динамичность ролика: видеоряд должен был как можно сильнее нагрузить кодек RemoteFX. Но ролик «Flying Through Forest 1» оказался в этом плане интересной находкой: выходной FPS заметно проседал, а входной от запуска к запуску был сильно выше или ниже среднего! Его влияние на различные метрики будет заметно на графиках, которые будут ниже.
Тест #4: ввод текста + просмотр youtube-ролика
В качестве youtube-теста был выбран чудесный ролик «Коста-Рика», который проигрывался в качестве 1080p60
в браузере Firefox, режим «киоск».
Обработка данных и построение графиков
Файлы журналов — blg
— имеют двоичный формат: легко открываются в родной программе, графики всех счётчиков на одной шкале, можно выключать/включать/масштабировать/etc. Но чтобы работать с данными из нескольких файлов, нужно другое решение.
Сначала конвертируем двоичные файлы в csv (см. Приложение) с помощью стандартной утилиты reglog
и очистим их заголовки (см. Приложение).
Затем в Jupiter
-блокноте при помощи библиотек pandas
и matplotlib
прочитаем csv
(см. Приложение, Jupiter Notebook: импорт) и построим графики (см. Приложение, Jupiter Notebook: одна метрика — одна диаграмма).
Анализ результатов и наиболее интересные графики
Задержки при обработке ввода от пользователя
До включения групповых политик сильнее всего на обработке ввода сказалось проигрывание локальных видеофайлов: в среднем 45 мс при рекомендованных 33 мс.
Включение отрисовки через GPU в групповых политиках стабилизировало этот показатель во всех сценариях.
Частота кадров
После включения GPU ускорения ситуация явно становится лучше, особенно в 3D тесте. Результаты двух других тестов хоть и демонстрируют улучшение, но недостаточно: провалы на графиках соответствуют визуальным «рывкам» при просмотре.
Воспроизведение «Flying Through Forest 1» (1920 x 1088, 48072 кбит/с, 9 секунд, 25 fps): от запуска к запуску на вход кодека RеmoteFX поступало либо повышенное либо пониженное количество кадров. Возможно, причина в перекодировке из формата QuickTime, «лишних» 8 пикселях ширины кадра или битрейте.
«Коста-Рика» также вызвал «проседание» FPS у RemoteFX: его проигрывание в браузере в 1080p60
ложилось на центральный процессор. Возможно, он просто не успевал перекодировать из 60fps и подготовить нужный кадр для RemoteFX.
Общие сетевые метрики
При включении GPU ускорения происходит рост сетевого трафика, который зависит от сценария теста.
Видно, что самым тяжёлым для кодека RemoteFX опять оказался тот же самый видеофайл, «Flying Through Forest 1». Первый запуск этого теста, когда наблюдается провал входящих кадров, также видим скачки трафика до 60 Мбит/с и потери до 30% — 40%.
Загрузка центрального процессора
Включение GPU ускорения практически вдвое разгружает центральный процессор, за исключением youtube-теста. И даже здесь удалось уйти от периодической 100% загрузки.
Загрузка видеокарты
Возможно, разгадка странного поведения второго ролика кроется в графике 17: входящих для RemoteFX кадров было больше, когда видеокарта была больше загружена кодированием.
Выводы
В RDP протоколе частота кадров ограничена 30-ю кадрами в секунду. Со стороны сервера увеличить лимит FPS можно, но бессмысленно: на практике терминальная сессия перестала отрисовывать окно и реагировать на действия как раз при проигрывании «того самого» видеофайла :).
Итоги в цифрах:
-
Частота кадров стабилизируется почти на максимально возможном для протокола уровне: 29-30 FPS в среднем вместо 25 или даже 15 FPS
-
Отзывчивость удалённого рабочего стола также стабилизируется, при этом возрастая в несколько раз
-
Заметно, на 20-50 %, разгружается центральный процессор
-
Немного возрастает утилизация канала связи, на 3-6 Мбит/сек
-
Утилизация GPU составила до 20%
Результат действительно очень хороший: RemoteFX значительно увеличивает качество работы в терминальной сессии — плавность отрисовки окна и отклик на действия пользователя сравнимы с локальным режимом. Даже «тяжёлые» сценарии показывают в этом плане заметный прирост.
Тесты, конечно, носят искусственный характер: выбором способа нагрузки на кодек RemoteFX можно как «завалить» так и «подтянуть» его результаты. Возможно, более релевантным было бы проведение чего-то вроде «конфетти-теста», например, такого.
Что дальше
Так как на этом этапе тесты проводились для одной сессии и при включении лишь рекомендованных настроек, то далее имеет смысл протестировать производительность:
-
при одновременной работе нескольких пользователей
-
при включении в групповых политиках различных дополнительных настроек кодека
Список источников
Приложения
Переопределение групп сбора данных: _1_task_define.cmd
@echo off
setlocal EnableDelayedExpansion
@REM для сбора используются счётчики, перечисленные в _1_counters.cfg
@REM счётчики называются только на английском, на русском это просто описание
@REM
@REM запуск сбора данных:
@REM при каждом входе на удалённый рабочий стол исправить _1_counters.cfg:
@REM 1) посмотреть номер своей терминальной сессии консольной командой
@REM query session
@REM
@REM 2) вписать этот номер в _1_counters.cfg, например, RDP-Tcp 9
@REM
@REM 3) перерегистрировать сброщик запуском данного файла
@REM
@REM 4) замер производительности производится запуском _2_task_run_X.cmd и длится 2 минуты
@REM
@REM удаление старого сборщика данных
logman delete -n RemoteFX_1
logman delete -n RemoteFX_2
logman delete -n RemoteFX_3
logman delete -n RemoteFX_4
logman delete -n RemoteFX_5
for /F "usebackq delims= " %%a IN (`query session ^| find "Administrator"`) DO (
set "x=%%a"
set "x=!x:~9,10!"
echo !x!
type NUL>_1_counters.cfg
echo ^NVIDIA GPU^(^*^)^%% Video Decoder Usage>>_1_counters.cfg
echo ^NVIDIA GPU^(^*^)^%% Video Encoder Usage>>_1_counters.cfg
echo ^NVIDIA GPU^(^*^)^%% GPU Memory Usage>>_1_counters.cfg
echo ^NVIDIA GPU^(^*^)^%% GPU Usage>>_1_counters.cfg
echo.>>_1_counters.cfg
echo ^Processor Information^(_Total^)^%% Processor Time>>_1_counters.cfg
echo.>>_1_counters.cfg
echo ^RemoteFX Network^(RDP-Tcp !x!^)^Loss Rate>>_1_counters.cfg
echo ^RemoteFX Network^(RDP-Tcp !x!^)^Current TCP Bandwidth>>_1_counters.cfg
echo ^RemoteFX Network^(RDP-Tcp !x!^)^Current UDP Bandwidth>>_1_counters.cfg
echo.>>_1_counters.cfg
echo ^RemoteFX Network^(RDP-Tcp !x!^)^Total Sent Rate>>_1_counters.cfg
echo ^RemoteFX Network^(RDP-Tcp !x!^)^TCP Sent Rate>>_1_counters.cfg
echo ^RemoteFX Network^(RDP-Tcp !x!^)^UDP Sent Rate>>_1_counters.cfg
echo.>>_1_counters.cfg
echo ^RemoteFX Network^(RDP-Tcp !x!^)^Total Received Rate>>_1_counters.cfg
echo ^RemoteFX Network^(RDP-Tcp !x!^)^TCP Received Rate>>_1_counters.cfg
echo ^RemoteFX Network^(RDP-Tcp !x!^)^UDP Received Rate>>_1_counters.cfg
echo.>>_1_counters.cfg
echo ^RemoteFX Graphics^(^*^)^Output Frames/Second>>_1_counters.cfg
echo ^RemoteFX Graphics^(^*^)^Input Frames/Second>>_1_counters.cfg
echo.>>_1_counters.cfg
echo ^RemoteFX Graphics^(^*^)^Frames Skipped/Second - Insufficient Server Resources>>_1_counters.cfg
echo ^RemoteFX Graphics^(^*^)^Frames Skipped/Second - Insufficient Network Resources>>_1_counters.cfg
echo ^RemoteFX Graphics^(^*^)^Frames Skipped/Second - Insufficient Client Resources>>_1_counters.cfg
echo ^RemoteFX Graphics^(^*^)^Frame Quality>>_1_counters.cfg
echo ^RemoteFX Graphics^(^*^)^Average Encoding Time>>_1_counters.cfg
echo ^User Input Delay per Session^(Max^)^Max Input Delay>>_1_counters.cfg
echo.>>_1_counters.cfg
echo ^RemoteFX Graphics^(^*^)^Graphics Compression ratio>>_1_counters.cfg
echo ^NVIDIA GPU^(^*^)^%% FB Usage>>_1_counters.cfg
@REM счётчик памяти не работает, сброс кэша счётчиков также не помог
@REM https://docs.microsoft.com/ru-ru/troubleshoot/windows-server/performance/manually-rebuild-performance-counters
echo ^Memory^%% Committed Bytes In Use>>_1_counters.cfg
echo ^Memory^Available Bytes>>_1_counters.cfg
)
@REM и регистрация нового сборщика
logman create counter -n RemoteFX_1 -f bin -max 10 -si 00:00:01 -rf 00:02:00 --v -o "%~dp0logstest #1 void GPO X" -cf "%~dp0_1_counters.cfg"
logman create counter -n RemoteFX_2 -f bin -max 10 -si 00:00:01 -rf 00:02:00 --v -o "%~dp0logstest #2 3D GPO X" -cf "%~dp0_1_counters.cfg"
logman create counter -n RemoteFX_3 -f bin -max 10 -si 00:00:01 -rf 00:02:00 --v -o "%~dp0logstest #3 wmp GPO X" -cf "%~dp0_1_counters.cfg"
logman create counter -n RemoteFX_4 -f bin -max 10 -si 00:00:01 -rf 00:02:00 --v -o "%~dp0logstest #4 youtube GPO X" -cf "%~dp0_1_counters.cfg"
logman create counter -n RemoteFX_5 -f bin -max 10 -si 00:00:01 -rf 00:02:00 --v -o "%~dp0logstest #5 webGL GPO X" -cf "%~dp0_1_counters.cfg"
@REM pause
@REM exit
Принудительная остановка записи данных: _1_task_breake.cmd
@REM запускаем сбор данных
logman stop RemoteFX_1
logman stop RemoteFX_2
logman stop RemoteFX_3
logman stop RemoteFX_4
logman stop RemoteFX_5
Конвертация двоичных данных в CSV: blg2csv.cmd
@echo off
@REM смена кодировки нужна для powershell-скрипта "%~dpn0.ps1"
chcp 65001
@REM работаем в текущей папке скрипта
cd "%~dp0logs"
@REM включаем расширения для переопределения переменных в цикле
setlocal EnableDelayedExpansion
@REM цикл по двоичным файлам мониторинга
FOR /F "usebackq delims=." %%a IN (`dir *.blg /b`) DO (
set "blg=%%a.blg"
set "csv=%%a.csv"
@REM convert binary to csv
relog "!blg!" -f csv -o "!csv!" -y
)
@REM имена cmd и powershell скриптов должны совпадать
start "%~dpn0.ps1" /WAIT /B pwsh.exe -Command "& {%~dpn0.ps1 -en:$False}"
@REM справка reglog - утилиты работы с журналами производительности
@REM https://docs.microsoft.com/ru-ru/windows-server/administration/windows-commands/relog
Нормализация заголовков CSV: blg2csv.ps1
Заголовки столбцов содержат различные уникальные данные (id терминальной сессии или оборудования), которые будут несовпадать из-за применения групповых политик и выхода-входа на терминальный сервер. Приводим к единому виду с помощью PowerShell-скрипта:
[CmdletBinding()]
param (
[switch] $en = $False # substitute ru alias of counters by real en name
)
$WorkDir = $MyInvocation.MyCommand.Definition | Split-Path -Parent
$LogsDir = Join-Path -Path $WorkDir -ChildPath 'logs'
$EncodeFrom = [System.Text.Encoding]::GetEncoding(1251)
$EncodeTo = New-Object System.Text.UTF8Encoding $False
$names = @(
New-Object psobject -Property @{ 'ru' = 'Задержка ввода данных пользователем на сеанс(Max)Максимальная задержка ввода' ; 'en' = 'User Input Delay per SessionMax Input Delay'}
New-Object psobject -Property @{ 'ru' = 'Графика RemoteFXВходящих кадров в секунду' ; 'en' = 'RemoteFX GraphicsInput Frames/Second'}
New-Object psobject -Property @{ 'ru' = 'Графика RemoteFXИсходящих кадров в секунду' ; 'en' = 'RemoteFX GraphicsOutput Frames/Second'}
New-Object psobject -Property @{ 'ru' = 'Графика RemoteFXСреднее время кодирования' ; 'en' = 'RemoteFX GraphicsAverage Encoding Time'}
New-Object psobject -Property @{ 'ru' = 'Графика RemoteFXКачество кадра' ; 'en' = 'RemoteFX GraphicsFrame Quality'}
New-Object psobject -Property @{ 'ru' = 'Графика RemoteFXКоэффициент сжатия графических данных' ; 'en' = 'RemoteFX GraphicsGraphics Compression ratio'}
New-Object psobject -Property @{ 'ru' = 'Сеть RemoteFXОбщая скорость отправки' ; 'en' = 'RemoteFX NetworkTotal Sent Rate'}
New-Object psobject -Property @{ 'ru' = 'Сеть RemoteFXОбщая скорость приема' ; 'en' = 'RemoteFX NetworkTotal Received Rate'}
New-Object psobject -Property @{ 'ru' = 'Сеть RemoteFXПотери' ; 'en' = 'RemoteFX NetworkLoss Rate'}
New-Object psobject -Property @{ 'ru' = 'Графика RemoteFXПропущено кадров в секунду — недостаточно сетевых ресурсов' ; 'en' = 'RemoteFX GraphicsFrames Skipped/Second - Insufficient Network Resources'}
New-Object psobject -Property @{ 'ru' = 'Графика RemoteFXПропущено кадров в секунду — у сервера недостаточно ресурсов' ; 'en' = 'RemoteFX GraphicsFrames Skipped/Second - Insufficient Server Resources'}
New-Object psobject -Property @{ 'ru' = 'Графика RemoteFXПропущено кадров в секунду — у клиента недостаточно ресурсов' ; 'en' = 'RemoteFX GraphicsFrames Skipped/Second - Insufficient Client Resources'}
New-Object psobject -Property @{ 'ru' = 'Сведения о процессоре(_Total)% загруженности процессора' ; 'en' = 'Processor Information(_Total)% Processor Time'}
New-Object psobject -Property @{ 'ru' = 'NVIDIA GPU% GPU Usage' ; 'en' = 'NVIDIA GPU% GPU Usage'}
New-Object psobject -Property @{ 'ru' = 'NVIDIA GPU% GPU Memory Usage' ; 'en' = 'NVIDIA GPU% GPU Memory Usage'}
New-Object psobject -Property @{ 'ru' = 'NVIDIA GPU% Video Decoder Usage' ; 'en' = 'NVIDIA GPU% Video Decoder Usage'}
New-Object psobject -Property @{ 'ru' = 'NVIDIA GPU% Video Encoder Usage' ; 'en' = 'NVIDIA GPU% Video Encoder Usage'}
New-Object psobject -Property @{ 'ru' = 'NVIDIA GPU% FB Usage' ; 'en' = 'NVIDIA GPU% FB Usage'}
New-Object psobject -Property @{ 'ru' = 'Сеть RemoteFXПропускная способность текущего UDP-подключения' ; 'en' = 'RemoteFX NetworkCurrent UDP Bandwidth'}
New-Object psobject -Property @{ 'ru' = 'Сеть RemoteFXПропускная способность текущего TCP-подключения' ; 'en' = 'RemoteFX NetworkCurrent TCP Bandwidth'}
New-Object psobject -Property @{ 'ru' = 'Сеть RemoteFXСкорость отправки UDP-данных' ; 'en' = 'RemoteFX NetworkUDP Sent Rate'}
New-Object psobject -Property @{ 'ru' = 'Сеть RemoteFXСкорость получения UDP-данных' ; 'en' = 'RemoteFX NetworkUDP Received Rate'}
New-Object psobject -Property @{ 'ru' = 'Сеть RemoteFXСкорость отправки TCP-данных' ; 'en' = 'RemoteFX NetworkTCP Sent Rate'}
New-Object psobject -Property @{ 'ru' = 'Сеть RemoteFXСкорость получения TCP-данных' ; 'en' = 'RemoteFX NetworkTCP Received Rate'}
)
$Heads = @()
foreach ($f in Get-ChildItem -Path $LogsDir -File -Filter '*.csv')
{
$FileContent = $f | Get-Content -Encoding $EncodeFrom
$HeadOrig = $FileContent[0]
# приводим заголовки к единому виду, убираем ненужное
# "\TESTGPUNVIDIA GPU(#0 GRID M60-1Q (id=1, NVAPI ID=513))% GPU Memory Usage"
if ($HeadOrig -match '.*(?<hostname>\\[a-zA-Z0-9]*\).*')
{
$HeadOrig = $HeadOrig.Replace($Matches['hostname'], '')
}
if ($HeadOrig -match '.*NVIDIA GPU(?<gpu>(#[A-Z0-9 ]*-[A-Z0-9]* (id=[0-9,]* NVAPI ID=[0-9]*)))')
{
$HeadOrig = $HeadOrig.Replace($Matches['gpu'], '')
}
# "\TESTGPUГрафика RemoteFX(RDP-Tcp 55)Входящих кадров в секунду"
if ($HeadOrig -match '.*(?<session>(RDP-Tcp[ 0-9]*)).*')
{
$HeadOrig = $HeadOrig.Replace($Matches['session'], '')
}
# "(PDH-CSV 4.0) (Russia TZ 2 Standard Time)(-180)"
if ($HeadOrig -match '.*(?<time>(.*) (.*Time)([0-9 +-]*))')
{
$HeadOrig = $HeadOrig.Replace($Matches['time'], 'Time')
}
if ($en)
{
$HeadOrig = ($HeadOrig -split '","') -replace '"', ''
foreach ($h in $HeadOrig)
{
if ($h -notin $names.ru) { continue }
$n = $names | Where-Object {$_.ru -eq $h}
$HeadOrig[($HeadOrig.IndexOf($h))] = $n.en # $h = $n.en не работает
}
$HeadOrig = '"{0}"' -f ($HeadOrig -join '","')
}
$FileContent[0] = $HeadOrig # перезапись заголовка
$FileContent | Out-File -Encoding $EncodeTo -FilePath $f.FullName
$Heads += $f.Name + $HeadOrig # сохранение заголовка
}
# вывод заголовков столбцов в отдельный файл для доп. контроля порядка, названий и т.д.
$Heads | Out-File -Encoding $EncodeTo -FilePath (Join-Path -Path $LogsDir -ChildPath 'heads.txt')
Jupiter Notebook: импорт данных
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import EngFormatter # для вывода форматированных единиц измерения
plt.rcParams['figure.max_open_warning'] = 30 # порог предупреждения при одновременном построении нескольких рисунков
%matplotlib inline
# импорт данных csv-файлов
t21 = pd.read_csv('./logs/test #2 3D GPO 1.csv', na_values=' ')
t20 = pd.read_csv('./logs/test #2 3D GPO 0.csv', na_values=' ') # , encoding='cp1251')
t31 = pd.read_csv('./logs/test #3 wmp GPO 1.csv', na_values=' ')
t30 = pd.read_csv('./logs/test #3 wmp GPO 0.csv', na_values=' ')
t31_prev = pd.read_csv('./logs/test #3 wmp GPO 1 anomaly.csv', na_values=' ')
t41 = pd.read_csv('./logs/test #4 youtube GPO 1.csv', na_values=' ')
t40 = pd.read_csv('./logs/test #4 youtube GPO 0.csv', na_values=' ')
# слияние результатов каждого теста: сначала рекомендованные GPO, потом default GPO
t2 = pd.concat([t21, t20], join='inner', axis=1)
t3 = pd.concat([t31, t30, t31_prev], join='inner', axis=1)
t4 = pd.concat([t41, t40], join='inner', axis=1)
# разные наборы для итерации и рисования в цикле
dataframes = [t2, t3, t4]
ax_titles = ['test #2: 3D benchmark', 'test #3: play 1080p video', 'test #4: play 1080p youtube video']
legend = ['GPU acceleration', 'default', 'GPU, anomaly']
img_sx, img_sy = 15, 5 # размеры одного ряда графиков
fgs = [ # макет графиков # yunit ед. изм., ylabel метка Y-оси, ydata колонка из датафрейма
{'yunit': 'ms', 'ylabel': 'Input Delay', 'ydata': 'Задержка ввода данных пользователем на сеанс(Max)Максимальная задержка ввода'},
{'yunit': 'fps', 'ylabel': 'RemoteFX input FPS', 'ydata': 'Графика RemoteFXВходящих кадров в секунду'},
{'yunit': 'fps', 'ylabel': 'RemoteFX output FPS', 'ydata': 'Графика RemoteFXИсходящих кадров в секунду'},
{'yunit': 'bps', 'ylabel': 'Tx Speed', 'ydata': 'Сеть RemoteFXОбщая скорость отправки'},
{'yunit': 'bps', 'ylabel': 'Rx Speed', 'ydata': 'Сеть RemoteFXОбщая скорость приема'},
{'yunit': '%', 'ylabel': 'Tx / Rx Loss', 'ydata': 'Сеть RemoteFXПотери'},
{'yunit': '%', 'ylabel': 'CPU Usage', 'ydata': 'Сведения о процессоре(_Total)% загруженности процессора'},
{'yunit': '%', 'ylabel': 'GPU Usage', 'ydata': 'NVIDIA GPU% GPU Usage'},
{'yunit': '%', 'ylabel': 'GPU Memory Usage', 'ydata': 'NVIDIA GPU% GPU Memory Usage'},
{'yunit': '%', 'ylabel': 'GPU Decoder Usage', 'ydata': 'NVIDIA GPU% Video Decoder Usage'},
{'yunit': '%', 'ylabel': 'GPU Encoder Usage', 'ydata': 'NVIDIA GPU% Video Encoder Usage'},
{'yunit': 'ms', 'ylabel': 'Encoding Time', 'ydata': 'Графика RemoteFXСреднее время кодирования'},
{'yunit': '%', 'ylabel': 'Frame Quality', 'ydata': 'Графика RemoteFXКачество кадра'},
{'yunit': '%', 'ylabel': 'Compression: enc byte / in byte', 'ydata': 'Графика RemoteFXКоэффициент сжатия графических данных'},
{'yunit': 'fps', 'ylabel': 'FPS Loss by network', 'ydata': 'Графика RemoteFXПропущено кадров в секунду — недостаточно сетевых ресурсов'},
{'yunit': 'fps', 'ylabel': 'FPS Loss by server', 'ydata': 'Графика RemoteFXПропущено кадров в секунду — у сервера недостаточно ресурсов'},
{'yunit': 'fps', 'ylabel': 'FPS Loss by client', 'ydata': 'Графика RemoteFXПропущено кадров в секунду — у клиента недостаточно ресурсов'},
{'yunit': '%', 'ylabel': 'GPU Framebufer Usage', 'ydata': 'NVIDIA GPU% FB Usage'},
{'yunit': 'bps', 'ylabel': 'Tx Speed UDP', 'ydata': 'Сеть RemoteFXСкорость отправки UDP-данных'},
{'yunit': 'bps', 'ylabel': 'Rx Speed UDP', 'ydata': 'Сеть RemoteFXСкорость получения UDP-данных'},
{'yscale': 1000, 'yunit': 'bps', 'ylabel': 'Bandwidth UDP', 'ydata': 'Сеть RemoteFXПропускная способность текущего UDP-подключения'},
{'yunit': 'bps', 'ylabel': 'Tx Speed TCP', 'ydata': 'Сеть RemoteFXСкорость отправки TCP-данных'},
{'yunit': 'bps', 'ylabel': 'Rx Speed TCP', 'ydata': 'Сеть RemoteFXСкорость получения TCP-данных'},
{'yscale': 1000, 'yunit': 'bps', 'ylabel': 'Bandwidth TCP', 'ydata': 'Сеть RemoteFXПропускная способность текущего TCP-подключения'},
]
Jupiter Notebook: отрисовка одной метрики на диаграмму
for i in range(len(fgs)): # сколько метрик, столько рисунков (рядов диаграмм)
fig, axs = plt.subplots(1, 3, figsize=(img_sx, img_sy), sharex='col', sharey='row', gridspec_kw=dict(hspace=0, wspace=0, )) # width_ratios=[1, 1, 1]
fig_name = fgs[i]['ydata'].split('\')[1]
fig.suptitle(f'Рис. {i + 1:>2}. {fig_name}', fontsize=14) #, color='grey') # имя рисунка
fig.patch.set_facecolor('white') # фон рисунка белый вместо прозрачного
axs[0].set(ylabel=fgs[i]['ylabel']) # подпись Y-оси только на первых (левых) графиках из трёх
axs[2].yaxis.set_tick_params(labelleft=False, labelright=True, which='major') # дублируем значения справа
for ax, d, title in zip(axs, dataframes, ax_titles): # на каждый тест своя диаграмма
ax.plot(d.index.values, d[fgs[i]['ydata']] * (fgs[i].get('yscale', 1))) # строим график
ax.set_title(title) #, color='grey') # заголовок диаграммы
ax.xaxis.set_tick_params(which='major', labelcolor='grey') # подписи к X-шкале
ax.xaxis.set_major_formatter(EngFormatter(unit='s')) # по X секунды
ax.yaxis.set_tick_params(which='major', labelcolor='grey') # подписи Y-шкале
ax.yaxis.set_major_formatter(EngFormatter(unit=fgs[i]['yunit'])) # по Y у каждого графика своя ед. изм.
# расчёт средних и вывод в легенду диаграммы "на лету"
avg = [EngFormatter(places=0).format_eng(avg * (fgs[i].get('yscale', 1))) for avg in d[fgs[i]['ydata']].mean()]
lgn = [f'avg {m}{fgs[i]["yunit"]}, {l}' for l, m in zip(legend, avg)]
ax.legend(lgn, fontsize=8) # отображение легенды графика
ax.grid(axis='y') # горизонтальная сетка
ax.set_xlim(0,119) # метка "120" засоряла график
if ax == axs[1]: # выделяем аномалии на средней диаграмме
ax.axvline(x=15, linestyle=":", color='C0')
ax.axvline(x=58, linestyle=":", color='C0')
ax.axvline(x=101, linestyle=":", color='C0')
fig.tight_layout() # (pad=0.4, w_pad=1.5, h_pad=30.0)
Jupiter Notebook: отрисовка всех метрик на одной диаграмме
Общая ось X на все графики: метрики тестов располагаются строго друг под другом — удобно сопоставлять разные метрики между собой.
# один рисунок # plt.style.available # plt.style.use('seaborn-whitegrid')
fig, axs = plt.subplots(len(fgs), 3, figsize=(img_sx, img_sy * len(fgs)), sharex='col', sharey='row', gridspec_kw=dict(hspace=0.2, wspace=0))
fig.patch.set_facecolor('white') # фон рисунка белый вместо прозрачного
# заголовки только вверху
[ax.set_title(title) for ax, title in zip(axs[0], ax_titles)] # ax.set_title(title, color='grey')
for i in range(len(fgs)):
axs[i,0].set(ylabel=fgs[i]['ylabel'])
fig_name = fgs[i]['ydata'].split('\')[1]
axs[i,1].set(xlabel=f'Рис. {i + 1:>02}. {fig_name}')
# axs[i,1].xaxis.label.set_color('grey')
axs[i,2].yaxis.set_tick_params(labelleft=False, labelright=True, which='major')
for ax, d, title in zip(axs[i], dataframes, ax_titles):
ax.plot(d.index.values, d[fgs[i]['ydata']] * (fgs[i].get('yscale', 1)))
ax.xaxis.set_tick_params(which='major', labelcolor='grey') # подписи к X-шкале
ax.xaxis.set_major_formatter(EngFormatter(unit='s')) # по X секунды
ax.yaxis.set_tick_params(which='major', labelcolor='grey') # подписи Y-шкале
ax.yaxis.set_major_formatter(EngFormatter(unit=fgs[i]['yunit'])) # по Y у каждого графика своя ед. изм.
# расчёт средних и изменение легенды диаграммы "на лету"
avg = [EngFormatter(places=0).format_eng(avg * (fgs[i].get('yscale', 1))) for avg in d[fgs[i]['ydata']].mean()]
lgn = [f'avg {m}{fgs[i]["yunit"]}, {l}' for l, m in zip(legend, avg)]
ax.legend(lgn, fontsize=8) # отображение легенды графика
ax.grid(axis='y') # горизонтальная сетка
ax.set_xlim(0,119) # метка "120" засоряла график
if ax == axs[i,1]: # выделяем аномалии на средней диаграмме
ax.axvline(x=15, linestyle="--", color='C0')
ax.axvline(x=58, linestyle="--", color='C0')
ax.axvline(x=101, linestyle="--", color='C0')
Диаграмма со всеми графиками
Продолжение истории будет на следующей неделе. Спасибо за внимание!
Что ещё интересного есть в блоге Cloud4Y
→ Частые ошибки в настройках Nginx, из-за которых веб-сервер становится уязвимым
→ Пароль как крестраж: ещё один способ защитить свои учётные данные
→ Тим Бернерс-Ли предлагает хранить персональные данные в подах
→ Подготовка шаблона vApp тестовой среды VMware vCenter + ESXi
→ Создание группы доступности AlwaysON на основе кластера Failover
Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью. Пишем не чаще двух раз в неделю и только по делу.
Содержание
- KB4570006: обновление для отключения и удаления компонента VGPU RemoteFX в Windows
- Обзор
- Временная шкала
- Альтернативы
- Вопросы и ответы
- Настройка remotefx windows 10
- Asked by:
- Question
- All replies
- RemoteFX in Windows 10 Client Hyper-V
- Table of contents
- What is RemoteFX in Client Hyper-V?
- Adding and Configuring a RemoteFX Video Adapter to a VM in Hyper-V Manager
- Adding and Configuring a RemoteFX Video Adapter to a VM in PowerShell
- Using the RemoteFX Video Adapter
- Почему не RemoteFX, а также подробнее о технологиии NVIDIA GRID VGPU
KB4570006: обновление для отключения и удаления компонента VGPU RemoteFX в Windows
Обзор
С помощью VGPU remoteFX можно совместно работать с несколькими виртуальными машиными. Эта функция впервые была представлена в Windows 7 и удалена в качестве параметра для пользователей в Windows Server 2019. Мы знаем, что текущая реализация удаленного VGPU является уязвимой к уязвимостям системы безопасности (подробные сведения о CVE см. в разделе «Часто задаваемые действия»). Поскольку новые уязвимости являются архитектурными, а функция уже удалена из более новых версий Windows, обновления безопасности Windows от 13 апреля 2022 г. и все новые версии Windows больше не будут содержать функцию RemoteFX vGPU.
Мы настоятельно рекомендуем вам выбрать альтернативный вариант VGPU.
Временная шкала
Деprecation: RemoteFX vGPU был удален с выпуском Windows 10 версии 1809 и Windows Server 2019.
Отключение: В обновлениях безопасности Windows за июль 2020 г. (14 июля 2020 г.) на всех соответствующих платформах Windows был отключен VGPU RemoteFX.
Удаление: В обновлении для системы безопасности Windows за апрель 2022 г. (13 апреля 2022 г.) будет удален VGPU RemoteFX со всех соответствующих платформ Windows.
Альтернативы
Чтобы снизить потенциальные угрозы безопасности в VGPU RemoteFX, настоятельно рекомендуем пользователям использовать альтернативную технологию VGPU.
Безопасная виртуализация GPU доступна с помощью дискретного назначения устройств (DDA) в выпусках LTSC Windows Server (Windows Server 2016, Windows Server 2019) и SAC Windows Server (Windows Server версии 1803 и более поздних версий).
Вопросы и ответы
Мы больше не будем выпускать обновления для системы безопасности и другие обновления для удаленного VGPU.
Если перед установкой обновления для системы безопасности от 13 апреля 2022 г. с VM связан адаптер VGPU, необходимо удалить его перед повторной запуском VM.
Безопасная виртуализация GPU доступна с помощью дискретного назначения устройств (DDA) в выпусках LTSC Windows Server (Windows Server 2016 и Windows Server 2019) и SAC Windows Server (Windows Server версии 1803 и более поздних версий). Если вы находитесь на более ранней версии Windows, чем Windows 10 версии 1607, рассмотрите возможность обновления.
Дополнительные сведения можно найти в следующих обновлениях для системы безопасности:
Источник
Настройка remotefx windows 10
This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.
Asked by:
Question
From this case below, we can see that:
HKLMSOFTWAREPoliciesMicrosoftWindows NTTerminal ServicesClient
With a value of fUsbRedirectionEnableMode. If you set this to 2, that should be the same as enabling the policy.
However, RemoteFX vGPU requirements:
Windows Server 2016 or Windows 10
DX 11.0 compatible GPU with WDDM 1.2 compatible driver
Windows Server RD Virtualization Host role enabled (enables Hyper-V Role)
Server with a CPU that supports SLAT (Second Level Address Translation)
However, we cannot enable Hyper-V in Home edition, this feature only be supported on Pro and Enterprise/Education edition.
Источник
RemoteFX in Windows 10 Client Hyper-V
Table of contents
The use cases for a hypervisor on the desktop are quite different from those for hypervisors in the datacenter. With only a few exceptions, datacenter virtual machines run around the clock, quietly providing services behind the scenes. They aren’t logged onto very often, and then usually only for administrative purposes. If a virtual machine is running on the desktop at all, it’s also typically open in a window and seeing regular interaction. It’s reasonable to expect more from that experience than might be typical for server-side virtualization. One of the technologies that help Client Hyper-V to meet that expectation is RemoteFX.
The server editions of Hyper-V also offer RemoteFX. It’s not used as frequently, is disabled by default, and has more requirements. The complete RemoteFX experience on the server requires the Remote Desktop Services stack to be employed, and server-class accelerated GPUs are quite expensive and uncommon. It’s a different story for Client Hyper-V because desktops commonly contain accelerated graphics adapters. Beyond having such an adapter, there are no particular requirements for Client Hyper-V’s RemoteFX.
What is RemoteFX in Client Hyper-V?
I once undertook a journey to enumerate the features of RemoteFX, and gave up after a while. RemoteFX is an umbrella term for several technologies designed to enhance the Remote Desktop/VMConnect experience for Hyper-V guests. Most commonly, we think of video capability because that is the most obvious component, but it is not the only one. If you’re interested in the other RemoteFX technologies, I’ll leave you to perform your own quest. What we’re most concerned with is video. Windows 10’s Client Hyper-V provides strong support for RemoteFX video, which mostly means 3D acceleration. It is available by default, but you must specifically configure a RemoteFX video adapter for each virtual machine that you intend to use it with. I would strongly recommend that you proceed with caution when adding this adapter to any virtual machine whose guest operating system is not explicitly supported by Hyper-V. This TechNet article shows the supported Windows guests and there are menu items at the left that will take you to the lists of supported Linux guests.
Note that RemoteFX video might not be required for a satisfactory Client Hyper-V experience. Some 2D acceleration is available without a RemoteFX adapter. It’s not great, but only your needs can determine if it is acceptable. Also note that RemoteFX video will not magically transform your Client Hyper-V guest into a video gaming powerhouse, regardless of the capabilities of your graphics adapter.
You usually do not need to take any particular steps to enable RemoteFX video for your hosting Windows 10 system. If your video adapter has a DirectX 11.1-compatible driver, it will almost certainly work. In Hyper-V Manager, access the properties of your Windows 10 system and look on the Physical GPUs tab for something like the following screenshot. If you can’t select Use this GPU with RemoteFX, then you have an adapter that won’t work. If your adapter is capable, Hyper-V will have already enabled it.
Basic Configuration – RemoteFX Adapter
Adding and Configuring a RemoteFX Video Adapter to a VM in Hyper-V Manager
It’s quick and simple to add a RemoteFX video adapter to a virtual machine with Hyper-V Manager. It does not matter what Generation the guest is. These screenshots are for a Generation 1 virtual machine, but the instructions are the same for Generation 2.
Adding a RemoteFX Adapter
RemoteFX Adapter Settings
Adding and Configuring a RemoteFX Video Adapter to a VM in PowerShell
Adding a RemoteFX adapter in PowerShell is trivial. Configuring it can be a bit tricky.
To add the RemoteFX adapter:
A -VM parameter is also available, and it will accept piped virtual machine objects or names for bulk operations.
To configure the adapter, use Set-VMRemoteFx3dVideoAdapter. You can use -VM or -VMName just as you did with Add-VMRemoteFx3dVideoAdapter. You can also pipe in the output from a Get-VMRemoteFx3dVideoAdapter run to select an adapter. The three parameters of interest are -MaximumResolution, -MonitorCount, and -VRamSizeBytes. As far as I can tell, there’s no way to know in advance what the valid options are (unless you look in Hyper-V Manager or something). So, you can just feed it some gibberish. The error messages will tell you what you can use:
Set RemoteFX 3D Adapter Errors
With valid values (for my card):
Using the RemoteFX Video Adapter
As soon as you boot up the guest, the RemoteFX video adapter is ready to go. If it doesn’t boot or it won’t show a screen, then your guest operating system probably doesn’t support RemoteFX. Here’s a screen shot of the newly-installed Microsoft RemoteFX Graphics Device – WDDM from within a Windows 10 guest’s Device Manager:
RemoteFX Adapter in Device Manager
I would not get excited that you can now start running a bunch of 3D games in Client Hyper-V. That’s not really what RemoteFX is for. A game might work, but it might not. More “run-of-the-mill” applications, like web browsers and operating system GUIs are incorporating 3D, and that’s where you’ll see the most differences with a RemoteFX adapter. As you can see in Device Manager, you’re not getting a direct projection of your video adapter, which means that you’re not going to be able to load the manufacturer’s specific hardware driver, which means that you cannot expose its full capabilities to the guest.
Источник
Почему не RemoteFX, а также подробнее о технологиии NVIDIA GRID VGPU
Довольно давно я знаком с гипервизором от компании Microsoft под названием Hyper-V. Надо отметить, что данный гипервизор с каждым следующим поколением серверной платформы Windows Server становится всё более функциональным и интуитивно понятным для администрирования. В PowerShell добавляются новые командлеты, позволяющие легко управлять гипервизором. Появляется отличная возможность реализовывать с помощью скриптов даже такие необходимые задачи, как резервное копирование виртуальных машин и создание снапшотов по расписанию в планировщике без использования сторонних и довольно дорогостоящих программ. Администрировать Hyper-V легко, производительность гипервизора не вызывает нареканий, постоянно растет список операционных систем, имеющих либо установленные службы интеграции с гипервизором, либо имеющих возможность установить такие службы, либо поддерживающих Hyper-V благодаря модулям ядра. Еще совсем недавно состоялся релиз FreeBSD 10.0, первой из BSD систем, которая легко и непринужденно устанавливалась в качестве гостевой на гипервизор от Microsoft, и которая избавилась от детских болячек, вроде ограниченного размера виртуального жесткого диска и возможности использования только устаревшего сетевого адаптера (legacy или эмулированного), чья скорость не может превышать 100мбит/сек, в то время как физический сетевой адаптер является гигабитным. В общем, как может показаться, тенденция к улучшению имеет ну очень положительную динамику. Именно поэтому изначально мы занялись поиском ответа на вопрос, о том, существует ли возможность использования физической видеокарты в гостевой операционной системе Hyper-V. Ответ, как нам казалось тогда, не заставил себя долго ждать и уже через 5 минут, судя по статьям в интернете, мы были уверены, что такая возможность существует и, более того, она качественно реализована разработчиками Hyper-V. Как оказалось, мы жестоко ошибались, но обо всем по порядку.
Microsoft предложила в качестве решения технологию RemoteFX, которую изначально разрабатывала компания Calista Technologies, которая в последствии была приобретена Microsoft. Сама технология имеет очень весомые аппаратные требования как к серверу виртуализации, так и к видеокарте, которая в дальнейшем будет использоваться гостевой операционной системой посредством этой технологии. Требования заключаются в том, что сам сервер должен иметь CPU с поддержкой SLAT (EPT on Intel, NPT/RVI on AMD), а вот с GPU все еще веселее. Вот собственно требования и рекомендации, озвученные самими Microsoft:
Rank | NVIDIA | AMD |
---|---|---|
Best | NVIDIA Grid 1. Grid K1 2. Grid K2 |
AMD FirePro series 1. AMD FirePro S10000 2. AMD FirePro S9000 3. AMD FirePro S7000 |
Better | NVIDIA Quadro 1. Quadro K6000 2. Quadro K5000 |
AMD FirePro series 1. AMD FirePro V9800P 2. ATI FirePro V9800 |
Good | AMD FirePro series 1. ATI FirePro V8800 2. ATI FirePro V7800 3. AMD FirePro V7800P 4. ATI FirePro V5800 |
На просторах всемирной сети есть немало руководств по развертыванию RemoteFX на Windows Server. Однако о качественном применении почти ни в одной из этих статей речи не идёт, а в основном статья имеет такой законченный смысл «Поднял, поковырялся, вроде работает, вроде даже шевелится побыстрее, вроде даже нагрузку на центральный процессор снизили. Для чего делал? Черт его знает».
Так вот, я хочу рассказать вам о нашем опыте поиска решения задачи по расширению возможностей виртуальных машин в обработке 3D-графики. Перед нами стояла довольно чётко обрисованная задача. Нам нужно было сделать так, чтобы пользователи удаленных рабочих столов терминального сервера, развернутого на платформе Windows Server 2012 R2, смогли как минимум качественно просматривать различные 3D чертежи и сборки в специализированных viewer-ах, а как максимум и сами могли нет-нет, да и запустить различные CAD программы.
Первоначальной идеей стало развертывание RemoteFX на Windows Server 2012R2. Сказано – сделано. В наличии имелась серверная платформа DELL PowerEdge R720, оснащенный двумя процессорами Intel Xeon CPU E5-2670 v2 @ 2.50GHz поддерживающими SLAT, а также вычислительный графический модуль NVIDIA GRID K2. На сервер была установлена операционная система Windows Server 2012R2 standard с графической оболочкой, была развернута служба Hyper-V и настроен RemoteFX. На самом деле, тогда мы думали, что это окончательное решение и технология RemoteFX нас полностью устроит. Однако, в дальнейшем мы узнали, что Microsoft накладывает на технологию и существенные программные требования, что в качестве гостевой операционной системы, способной использовать трехмерный графический адаптер RemoteFX, могут выступать только операционные системы Windows 7 и 8 и только в редакциях Ultimate и Enterprise. Не совсем справедливо конечно, учитывая то, что сам гипервизор по заявлениям своих разработчиков поддерживает уйму других операционных систем.
Стало понятно, что наша цель использовать графический адаптер в виртуальном терминальном сервере, который развернут на Windows Server 2012R2, останется неосуществимой. Ладно, работаем с тем, что есть. Так что-же у нас есть? Совсем немного. Всего-то возможность установки в качестве гостевой операционной системы Windows 7-8 Ultimate-Enterprise с возможностью подключения к ним только одного пользователя. И даже распрекрасная библиотека RDP Wrapper не в состоянии решить этой проблемы. К тому-же, как нам стало известно по результатам производительности, трехмерный графический адаптер RemoteFX практически не умеет работать с таким API, как OpenGL, который используют большинство CAD программ, а вместо этого поддерживает полностью только проприетарную разработку Microsoft только для Windows – Direct3D. Об этом совсем скромно-скромно заявляют лишь две строчки в описании технологии RemoteFX на сайте Microsoft:
«Support in Windows Server 2012 R2 is provided for DX 11.0, DirectCompute, and C++ AMP. Most of the latest graphics cards will support OpenGL 4.0 and OpenCL 1.1 or later, but these APIs are currently unsupported by RemoteFX in Windows Server 2012 R2.»
Что это, проприетарная разработка для поддержания возможности развертывания терминального сервера на основе виртуальных машин, предложенной в последнем поколении Windows Server? Сложно ответить на этот вопрос. Однако, ясно только одно, технология RemoteFX неприменима для решения поставленной перед нами задачи, особенно ввиду чрезмерно завышенных аппаратных и программных требований к платформе, серверу и гостевым операционным системам. Все эти требования мы, конечно, готовы удовлетворить, но получить в результате готовое решение с крайне сомнительным функционалом – это расточительство.
Именно поэтому поиск не прекратился и, к своему стыду, мы первый раз обратили внимание на то, что пишет сама NVIDIA, о разработанном им графическом вычислительном модуле и его применении. Подробнее можно прочесть здесь, а если коротко, то NVIDIA создала технологию NVIDIA GRID vGPU, благодаря которой графические команды каждой виртуальной машины передаются напрямую в GPU, без трансляции гипервизором. Один физический графический модуль, благодаря драйверу, имеет несколько профилей виртуального GPU c различным количеством ядер и дискретной графической памяти. Вот таблица доступных виртуальных профилей для графических плат NVIDIA GRID:
Графическая плата NVIDIA GRID | Профиль виртуального GPU | Графическая память | Максимальное число дисплеев на пользователя | Максимальное разрешение дисплея | Максимальное число пользователей на графическую плату |
---|---|---|---|---|---|
GRID K2 | K280Q K260Q K240Q K220Q |
4ГБ 2ГБ 1ГБ 512МБ |
4 4 2 2 |
2560×1600 2560×1600 2560×1600 2560×1600 |
2 4 8 16 |
GRID K1 | K180Q K160Q K140Q K120Q |
4ГБ 2ГБ 1ГБ 512МБ |
4 2 2 2 |
2560×1600 2560×1600 2560×1600 2560×1600 |
4 8 16 32 |
Всё предельно просто и прекрасно. Драйвер имеет возможность выделять из аппаратной платформы платы виртуальные профили, отличающиеся друг от друга количеством графических ядер и памяти, которые могут стать аналогом физической видеокарты в виртуальной машине. В то время, как технология RemoteFX – всего лишь программная прослойка между виртуальной машиной и реальной графической платой, которая выборочно передает на обработку ту или иную графику. Зачем тогда Microsoft рекомендует к использованию графическую плату, чей функционал в полной мере не поддерживается возможностями их гипервизора? Зачем рекомендовать эту плату к использованию, если гипервизор, написанный ими, не идет по пути развития концепции, предложенной производителями графической платы? Не понятно. Однако, надо отметить, что в описании самой технологии NVIDIA GRID VGPU на сайте NVIDIA, не говорится ни слова (и слава богу) о гипервизоре Microsoft, а вместо этого упоминаются такие разработчики, как VMware c vSphere и Citrix со своим XenServer.
Было решено попробовать в качестве гипервизора XenServer 6.5 от Citrix, чей функционал в редакции Enterprise как раз поддерживает распределение виртуальных графических профилей между виртуальными машинами. Хоть это и не имеет никакого отношения к статье, всё же отмечу, что установка и настройка сервера простая и интуитивно понятная до безобразия. Сервер был установлен и активирован триальной лицензией на 90 дней, которую можно получить, с учетом количества сокетов хоста, за 5 минут, зарегистрировавшись на сайте разработчиков. После активации функция распределения графических профилей становится доступной в XenCenter. К сожалению, для загрузки пока доступны драйвера исключительно для операционных систем Windows, однако радует уже то, что графический профиль имеет возможность устанавливаться не только на версии Windows 7-8 Ultimate-Enterprise, но и на другие операционные системы Microsoft такие как Windows 7-8 других редакций и Windows Server 2008-2012, из коробки поддерживает OpenGL 4.4 и DirectX 11 и OpenCL, а также не имеет ограничений на количество одновременных подключений средствами удаленного рабочего стола к виртуальной машине.
Чтобы оценить качество работы виртуальных графических профилей, в качестве гостевой была установлена операционная система Windows 8.1_x64_Enterprise, в настройках виртуальной машины поочередно добавлялись первые три профиля (K280Q, K260Q, K240Q), которые считаются максимально производительными в порядке убывания, и с каждым графическим профилем было запущено по 4 бенчмарка, тестирующих производительность 3D графики с использованием API OpenGL и Direct3D. Чтобы сравнение не казалось чрезмерно-абстрактным, было принято решение сравнить результаты бенчмарков, запущенных на ВМ, с результатами этих же бенчмарков запущенных на физической машине, имеющей схожие характеристики. Коротко о технических характеристиках виртуальной и физической машины можно узнать из таблицы представленной ниже.
ОС | ЦП | ОЗУ | Видеоадаптер | |
---|---|---|---|---|
ФМ | Windows 8.1 x64 Enterprise | Inter Core(TM) CPU i5-4670 @ 3.40GHz | 12ГБ | Nvidia GeForce GTX 650 |
ВМ | Windows 8.1 x64 Enterprise | Inter Xeon CPU E5-2670 v2 @ 2.50GHz | 12ГБ | Nvidia GRID VGPU K280Q || K260Q || K240Q. |
В таблицах с результатами работы бенчмарков я буду указывать только название графического адаптера.
Итак, первым бенчмарком будет SPECviewperf 12.0.2, который многими специалистами почитается как эталонный бенчмарк для тестирования графики различных CAD программ. Кому интересно, подробнее тут. Результаты в таблице ниже. Разрешение окна везде 1900×1060 (по умолчанию в бенчмарке).
Тест | GTX 650 | K280Q | K260Q | K240Q |
---|---|---|---|---|
Catia-04 | 9.06 | 17.16 | 31.83 | 12.14 |
Creo-01 | 9.21 | 17.85 | 34.41 | 17.72 |
Energy-01 | 0.43 | 0.72 | 0.74 | 0.18 |
Maya-04 | 22.45 | 6.14 | 13.99 | 2.85 |
Medical-01 | 6.18 | 15.17 | 18.76 | 15.38 |
Showcase-01 | 14.99 | 11.14 | 32.80 | 10.84 |
Snx-02 | 2.07 | 18.31 | 34.80 | 18.41 |
SolidWorks-03 | 20.56 | 19.02 | 38.14 | 20.79 |
Все результаты выкладываю как есть. Немного смутило меня, что профиль K260Q по идее должен быть «слабее», чем K280Q, однако показал более выдающиеся результаты. Перепроверил, запустив тест еще раз на обоих профилях и пришел к выводу, что показания стабильные (не рандомные) и хоть и отличаются от первоначальных, но в разумных пределах 0.2-0.4.
Следующим бенчмарком, а вернее набором различных бенчмарков для тестирования графики OpenGL стал GpuTest с сайта geeks3d.com, подробнее можно узнать здесь. Результаты в таблице ниже в формате (points/FPS). Все тесты произведены в полноэкранном режиме 1920×1080.
Тест | GTX 650 (points/FPS) | K280Q (points/FPS) | K260Q (points/FPS) | K240Q (points/FPS) |
---|---|---|---|---|
FurMark (OpenGL 2.1/3.0) | 1214/20 | 2068/34 | 1790/29 | 1619/26 |
GiMark (OpenGL 3.3) | 960/15 | 1630/27 | 1578/26 | 1604/26 |
PixMark Julia FP32 (OpenGL 2.1/3.0) | 6724/111 | 2231/37 | 3874/64 | 3364/56 |
PixMark Julia FP64 (OpenGL 4.0) | 490/8 | 1046/17 | 1216/20 | 1082/18 |
Plot3D (OpenGL 2.1/3.0) | 39817/664 | 2289/38 | 2299/38 | 2296/38 |
TessMark x16 (OpenGL 4.0) | 13458/224 | 1545/25 | 1329/22 | 1542/25 |
TessMark x64 (OpenGL 4.0) | 3039/50 | 1511/25 | 1419/23 | 1535/25 |
Triangle (OpenGL 2.1/3.0) | 145268/2421 | 3748/62 | 3871/64 | 3757/62 |
Следующим бенчмарком стал RedSDK turbine benchmark от компании REDWAY3D. Подробнее тут. Результаты в таблице ниже. Все тесты произведены в полноэкранном режиме 1920×1080.
Тест | GTX 650 | K280Q | K260Q | K240Q |
---|---|---|---|---|
Real-time viewport | 1623 | 1018 | 368 | 400 |
High quality real-time | 1800 | 1576 | 355 | 366 |
Dynamic ambient occlusion | 1311 | 2459 | 2378 | 2418 |
Hybrid ray-tracing | 1114 | 414 | 413 | 399 |
Total score | 1437 | 1131 | 599 | 614 |
Последним бенчмарком стала бесплатная версия Heaven Benchmark 4.0 от разработчиков Unigine. Подробнее тут. Выбор на него пал в том числе потому, что он может протестировать графику Direct3D. Все тесты произведены в окне разрешением 1280×720 по причине того, что бенчмарк не захотел запускаться в полноэкранном режиме на виртуальных машинах по неизвестным мне причинам, выдавая ошибку. Результаты в таблицах ниже.
OpenGL | GTX 650 | K280Q | K260Q | K240Q |
---|---|---|---|---|
FPS | 44.9 | 56.8 | 54.0 | 56.3 |
Score | 1131 | 1432 | 1361 | 1418 |
Min FPS | 11.2 | 13.2 | 8.8 | 11.8 |
Max FPS | 83.7 | 66.1 | 66.0 | 66.0 |
Direct3D 11 | GTX 650 | K280Q | K260Q | K240Q |
---|---|---|---|---|
FPS | 46.9 | 69.4 | 34.2 | 57.4 |
Score | 1183 | 1747 | 862 | 1446 |
Min FPS | 10.7 | 9.2 | 6.9 | 9.9 |
Max FPS | 88.1 | 137.5 | 93.8 | 67.5 |
Никаких выводов из произведенных мною тестов делать не буду, лучше оставлю это для общественности. Если честно, то результаты тестов мне не до конца понятны и если читающему есть чем качественно прокомментировать их, то буду только рад.
Подводя итоги скажу, что все используемые в нашей компании CAD программы и иной софт успешно устанавливаются и запускаются на виртуальных машинах. Осталось дать поработать с удаленным рабочим столом специалисту, использующему эти программы и пусть он вынесет окончательный вердикт о возможности использования этого решения. Также хочу подчеркнуть, что писал эту статью вовсе не от безделья, а именно потому что, когда сам искал решение поставленной передо отделом ИТ задачи, не увидел подобных статей, полностью раскрывающих различия разных технологий проброса возможностей графической платы в виртуальную машину, не увидел статей, в которых описано качественное применение данных технологий.
Надеюсь, опыт нашего отдела ИТ кому-нибудь пригодится. Благодарю за внимание.
Источник
I was looking for a way to pass through GPU acceleration to virtual machines for some processing tasks. However, most methods (such as DDA or VMware ESXi) requires specific server hardware, server hypervisor OS, support CPU & motherboard firmware. Sadly, I don’t have matching specification to use those methods.
Then I come across RemoteFX. While it’s not a full feature GPU pass through, it serves my current needs with my limited availability for other methods. Unfortunately Microsoft is disabling (updates after July 14, 2020) and removing RemoteFX support by February 9, 2021.
Based on your Windows 10 version and your updates, you may find that RemoteFX is disabled. But there’s still ways to make it work.
Moreover, if you have trouble with sound or connecting using remote desktop, I have a solution for you.
RemoteFX for Windows 10 version 1803 or earlier
RemoteFX is supported in these versions:
- start Hyper-V manager
- go to Hyper-V Settings > Physical GPUs
- select your GPU
- check the box Use this GPU with RemoteFX
- click OK
- select your virtual machine
- click Settings…
- click Add Hardware > RemoteFX 3D Video Adapter
- click Add
- update RemoteFX settings for your needs
- click OK
That is. Start the virtual machine and you should have RemoteFX working for your VM.
RemoteFX for Windows 10 version after 1803 without Windows update after July 14, 2020
In this case, RemoteFX still works if your virtual machine already have RemoteFX adapter added. But you don’t have the option to add new RemoteFX adapter from the Hyper-V Manager:
It’s dimmed and you won’t be able to add RemoteFX. Moreover, The Physical GPUs option is no longer shown in Hyper-V Settings.
But you can still add RemoteFX adapter using PowerShell:
- note the name of your virtual machine
- start PowerShell as Administrator
- run command: Add-VMRemoteFx3dVideoAdapter -VMname <name>
Now check your virtual machine settings at Hyper-V manager and you should see RemoteFX adapter added.
RemoteFX for Windows 10 version with Windows update after July 14, 2020
You will start to receive the following error if you try to start a virtual machine with RemoteFX adapter:
This is because Microsoft’s updates after July 14, 2020 would disable RemoteFX due to a vulnerability.
All hope is not lost. You can re-enable it using Powershell:
- start PowerShell as Administrator
- run command: Get-VMRemoteFXPhysicalVideoAdapter
- note the name of the graphic card
- run command: Enable-VMRemoteFXPhysicalVideoAdapter -Name “<graphic card name>”
Now try again and your virtual machine with RemoteFX adapter should be starting ok.
If you want to add new RemoteFX adapter, check out powershell command Add-VMRemoteFx3dVideoAdapter discussed in last section.
Troubleshooting
Video remoting was disconnected
If you have this error, you need to update a setting in your virtual machine using Group Policy Editor.
- you can sign in to your virtual machine by not using Enhanced Session Mode or remove the RemoteFX adapter for now
- run gpedit.msc (Group Policy Editor) as Administrator
- go to Computer Configuration > Administrative Templates > Windows Components > Remote Desktop Services > Remote Desktop Session Host > Remote Session Environment
- double click on Use WDDM graphics display driver for Remote Desktop Connections (note: this config is only available Windows 10 version 1903 or after. Update your VM if needed)
- select Disabled
- click Apply
- reboot your VM
You should now be able to connect using Enhanced Session Mode.
RDP failed to connect
If you receive this error, you need to disable Use WDDM graphics display driver for Remote in your virtual machine as discussed in the last troubleshooting section.
Disable Windows Automatic Update
Microsoft has scheduled to remove RemoteFX by February 2021. If you want to continue to use RemoteFX after that, you would need to avoid Windows Update at that time.
One way is to disable Windows Automatic Update.
IMPORTANT: continue using Windows without security updates pose security risk to your system. Do not disable unless necessary.
To disable Windows Automatic Update, follow the steps below:
- type services in search box
- run App Services
- scroll to Windows Update
- double click to bring up Properties screen
- select Disabled for Startup type
- click Stop
- click Apply
Security Risk
RemoteFX has a remote code execution vulnerability (CVE-2020-1036) that has no patch to fix. As a result, Microsoft decides to remove the RemoteFX feature to eliminate the risk.
IMPORTANT: continue using RemoteFX poses security risk to your system. Use it at your own risk or stop using RemoteFX to avoid the risk.
- Posted on 20.11.202027.11.2020
Сейчас многие сотрудники компаний перешли на удалённый режим работы и используют удалённый рабочий стол (Windows Remote Desktop) для подключения к рабочей машине и доступа к программному обеспечению, в том числе ArcGIS.
Не секрет, что для оптимальной работы ArcGIS Pro необходим графический процессор и выделенная видеопамять, тем более если необходимо работать с 3D. Ознакомиться с системными требованиями и проверить свой компьютер на их соответствие можно на страничке https://pro.arcgis.com/ru/pro-app/get-started/arcgis-pro-system-requirements.htm
Однако работа с ArcGIS Pro или другим ПО, использующим графический процессор, через удалённый рабочий стол будет затруднено по причине того, что Microsoft Windows Remote Desktop по умолчанию не использует возможности графического процессора для рендеринга. Что приводит к ошибкам при попытке инициализировать драйверы отображения DirectX или OpenGL, и низкой производительности (медленная перерисовка меню, карт и т.д.).
Эту проблему можно легко исправить, изменив групповую политику на рабочей машине (где запускается программа) чтобы разрешить использование графического процессора и нативной поддержки DirectX 11 / OpenGL 3+ во время сеанса удаленного рабочего стола (необходимы права администратора).
Для этого необходимо выполнить следующие действия (Windows Server 2016 / Windows 10 RDP):
- Откройте средство редактирования групповой политики на панели управления или воспользуйтесь диалоговым окном поиска Windows (клавиша Windows + R, затем введите gpedit.msc)
- Перейдите в Административные шаблоны > Компоненты Windows > Службы удаленных рабочих столов > Узел сеансов удаленных рабочих столов > Среда удалённых сеансов > RemoteFX для Windows Server 2008 R2 (Administrative Templates > Windows Components > Remote Desktop Services > Remote Desktop Session Host > Remote Session Environment > RemoteFX for Windows Server 2008 R2) и включите:
- Настройка RemoteFX
- Оптимизация визуальных эффектов при использовании RemoteFX
- Оптимизировать визуальные эффекты для сеансов служб удаленных рабочих столов
- Прейдите в раздел Среда удалённых сеансов и включите:
- Использовать аппаратные видеоадаптеры для всех сеансов служб удаленных рабочих столов
- Настройка сжатия данных RemoteFX
- Перезагрузите рабочую машину, чтобы изменения, внесенные в групповую политику, вступили в силу.
Эта процедура активирует поддержку DirectX/OpenGL и графический процессор через RDP. Можно убедиться в этом, запустив ArcGIS Pro, открыв карту, а затем нажав Shift + E, это отобразит информацию о используемом рендеринге в текущем сеансе ArcGIS Pro.
Плюс пару дополнений.
- Если при удалённом подключении возникают проблемы с разрешением – экран рабочей машины выглядит размытым. Масштабирование приходит с клиентской машины, и если на домашнем компьютере стоит 125%, то и на рабочей машине будет так же. В магазине приложений Windows 10 есть «современный» клиент. В нем можно настроить DPI.
- Если в своей работе вы используете сразу несколько сеансов удаленных рабочих столов, то можно например воспользоваться решением Remote Desktop Manager Free Edition для их каталогизации и удобства доступа https://remotedesktopmanager.com/?utm_source=rdm&utm_medium=native&utm_campaign=about
Статья написана с использованием следующих материалов:
- https://community.esri.com/t5/implementing-arcgis-questions/enabling-gpu-rendering-on-windows-server-2016-windows-10-rdp/td-p/658522
- https://knowledge.civilgeo.com/knowledge-base/enabling-gpu-rendering-for-microsoft-remote-desktop/
- https://habr.com/ru/post/501132/
Обновление.
По рекомендации наших читателей дополнили статью материалами как другие известные системы поддерживают удалённую работу с приложениями, интенсивно использующими GPU.
У Citrix есть решение для использования GPU при удалённом доступе к физическим машинам, так и виртуальным. А так же профессиональное решение для виртуализации ПО для работы с 3D с использованием NVIDIA GRID.
NVIDIA предлагает использовать своё решение для виртуализации программного обеспечения интенсивно использующего графический процессор, как для отображения так и расчётов Quadro vDWS. Для пользователей Esri подготовлен отдельных документ с информацией о том, как развернуть рабочую станцию виртуального центра обработки данных NVIDIA Quadro с поддержкой ArcGIS Pro.
Просмотров:
15 680
Метки
- 3D
- 3D-картография
- ArcGIS Pro
- оптимизация
- производительность
Также может быть интересно
- Remove From My Forums
-
Question
-
Hello folks,
I’m currently reading a lot about RemoteFX but I’m very confused on what’s required to use it as most information seems to be somewhat outdated (mostly related to Windows Server 2008 R2).
My question is the following: Let’s assume that I have a regular Windows 10 Pro machine that acts as an RDP host. It’s not running as a VM guest on Windows Server Hyper-V. It’s just an existing Windows 10 machine. Can I take advantage of RemoteFX anyway?
If so, what are the requirements of using RemoteFX on a bare Windows 10 host without underlying Hyper-V? If not, is there any other way of achieving this or does RemoteFX really just work on VM guests that run directly on a Windows Server?
Looking at the «Remote Desktop Session Host» group in the Local Group Policy Editor on my Windows 10 Pro machine it seems like there are some RemoteFX options available but some of them are inside a folder/group named
«RemoteFX for Windows Server 2008 R2» while others aren’t. So, are only some RemoteFX feature supported on a bare Windows 10 RDP host?I’d appreciate any kind of info on this.
Корпорация Майкрософт выпустила обновление безопасности — KB4571756, которое отключит RemoteFX vGPU функция из-за уязвимости системы безопасности. Это применимо к Windows 10 версии 2004 и всем выпускам Windows Server версии 2004.
Опубликуйте это обновление, любая виртуальная машина, на которой включен RemoteFX vGPU, выйдет из строя со следующими сообщениями об ошибках:
- Невозможно запустить виртуальную машину, поскольку все графические процессоры с поддержкой RemoteFX отключены в диспетчере Hyper-V.
- Невозможно запустить виртуальную машину, поскольку на сервере недостаточно ресурсов графического процессора.
Даже если конечный пользователь попытается повторно включить RemoteFX vGPU, виртуальная машина отобразит сообщение об ошибке:
Мы больше не поддерживаем видеоадаптер RemoteFX 3D. Если вы все еще используете этот адаптер, вы можете подвергнуться риску безопасности.
Что такое функция vGPU RemoteFX?
При запуске виртуальных машин функция RemoteFX vGPU позволяет вам совместно использовать физический графический процессор. Эта функция хорошо подходит, когда физический графический процессор является слишком большим ресурсом, но вместо этого все виртуальные машины могут динамически совместно использовать графический процессор для своей рабочей нагрузки. Преимущество, конечно же, в удешевлении GPU и уменьшении нагрузки на CPU. Если вы хотите представить, это похоже на одновременное выполнение нескольких приложений DirectX на одном физическом графическом процессоре. Таким образом, вместо покупки 4 графических процессоров, может помочь один графический процессор, в зависимости от рабочей нагрузки. Также были предусмотрены контрмеры, ограничивавшие чрезмерное использование физического графического процессора.
В чем заключается уязвимость системы безопасности RemoteFX vGPU?
RemoteFX vGPU устарел. Он был представлен в Windows 7 и теперь сталкивается с уязвимостью удаленного выполнения кода. Уязвимость удаленного выполнения кода существует, когда Hyper-V RemoteFX vGPU на хост-сервере не может должным образом проверить ввод от аутентифицированного пользователя в гостевой операционной системе. Это происходит, когда vGPU Hyper-V RemoteFX на хост-сервере не может должным образом проверить ввод от аутентифицированного пользователя в гостевой операционной системе, когда злоумышленник запускает созданное приложение в гостевой ОС, которое атакует отдельные сторонние видеодрайверы, работающие на Hyper. -V хозяин.
Как только злоумышленник получит доступ, он может запустить любой код в ОС хоста. Поскольку это архитектурная проблема, исправить ее невозможно.
Альтернативные варианты для RemoteFX vGPU
Единственный вариант — использовать альтернативный vGPU, который может быть из сторонних приложений или Microsoft предлагает использовать Discrete Device Assignment (DDA). Это позволяет объединить все устройство PCIe в виртуальную машину. Вы можете не только разрешить доступ к графическим автомобилям, но и совместно использовать хранилище NVMe.
Самым большим преимуществом DDA, помимо того, что он безопасен, нет необходимости устанавливать драйверы на хосте до того, как устройство будет подключено к виртуальной машине. Пока виртуальная машина может определить местоположение устройства PCIe, можно определить путь, по которому виртуальная машина смонтирует его. Короче говоря, DDA, передающий графический процессор в виртуальную машину, позволяет использовать собственный драйвер графического процессора в виртуальной машине и все возможности. Это включает DirectX 12, CUDA и т. Д., Что было невозможно с RemoteFX vGPU.
Microsoft четко предупреждает, что вам не следует использовать RemoteFX vGPU, но если вам нужно, есть способ снова включить его на свой страх и риск.
Предполагая, что вы уже настроили 3D-адаптер RemoteFX vGPU, вот подробности, которые будут работать только в Windows 10 версии 1803 и более ранних версиях.
Настройте RemoteFX vGPU с помощью Hyper-V Manager
Чтобы настроить RemoteFX vGPU 3D с помощью диспетчера Hyper-V, выполните следующие действия:
- Остановить виртуальную машину
- Откройте диспетчер Hyper-V и перейдите к параметрам виртуальной машины.
- Щелкните Добавить оборудование.
- Выберите адаптер 3D-графики RemoteFX, а затем нажмите «Добавить».
Настройте RemoteFX vGPU с помощью командлетов PowerShell
- Enable-VMRemoteFXPhysicalVideoAdapter
- Добавить VMRemoteFx3dVideoAdapter
- Get-VMRemoteFx3dVideoAdapter
- Set-VMRemoteFx3dVideoAdapter
- Get-VMRemoteFXPhysicalVideoAdapter
Вы можете прочитать больше об этом здесь, в Microsoft.
A useful feature that was introduced not too long ago for Windows 10 has now been disabled. The RemoteFX vGPU feature lets the users of Virtual Machines (VMs) running Windows Server 2008 R2, Server 2012, Server 2016, and Windows 10 running on Hyper-V use the physical Graphics Processing Unit (GPU) of the host machine to render its graphic output.
As of the most recent update by Microsoft for Windows 10, KB4571757, Microsoft has decided to discontinue this feature due to a critical vulnerability discovered in Remote Code Execution.
Let’s look into the details of the feature, why it was discontinued, and whether or not we can find a way for it to still work.
Table of contents
- What is RemoteFX vGPU?
- Why did Microsoft remove RemoteFX vGPU feature?
- How to enable RemoteFX vGPU on Hyper-V running on Windows 10
- Alternative for RemoteFX vGPU
- Configure the VM for DDA
- Dismount the GPU from the host computer
- Assign the GPU to the VM
- Closing words
What is RemoteFX vGPU?
The VMs running on Hyper-V can use the physical GPU on the host computer to run their tasks concerning video rendering and image processing, using the RemoteFX vGPU feature. This allows users to take the load off of their CPU and run heavy image processing on their VMs using the shared GPU.
With this feature, a dedicated GPU for each VM is not required and simultaneously provides enhanced scalability and usability of the GPU, as well as the VMs. Head on to Microsoft’s web page to learn more about the feature.
Why did Microsoft remove RemoteFX vGPU feature?
Although the RemoteFX vGPU feature is old as it was introduced in Windows 7, it is now being exploited by hackers to execute remote commands on the host machine. This feature is not capable of authenticating the input of a valid user on the VM. A hacker can exploit this vulnerability to run modified applications on the VM to exploit the drivers of the host GPU and gain access. Once they have access to the host machine, they are able to execute remote commands and scripts.
Although Microsoft addresses such vulnerabilities through their regular updates, they were unable to do so as the flaw is architectural.
Microsoft started removing this feature for different versions of the OS back in July 2020. However, the Windows 10 cumulative update for September 2020 disabled the feature in all editions of Windows 10 version 2004.
Microsoft states that users will still be able to re-enable the feature until February 2021 through special commands, but should start working on alternative methods which will be discussed further down the article. Here is a notification by Microsoft on disabling RemoteFX vGPU.
How to enable RemoteFX vGPU on Hyper-V running on Windows 10
Although Microsoft has greyed out the feature to enable RemoteFX vGPU through Hyper-V on Windows 10, it can still be enabled through a command using PowerShell. Moreover, the Group Policy Settings are still there within the guest Operating Systems (VMs) which can be used to enable the feature on the VM just as before.
- First, turn on the VM you wish to configure this feature on and open the Group Policy Editor by typing in gpedit.msc in Run.
- In the Group Policy Editor, navigate to the following from the left pane:
- Computer Configuration -> Administrative Templates -> Windows Components -> Remote Desktop Services -> Remote Desktop Session Host -> Remote Session Environment -> RemoteFX for Windows Server
- In the right pane, double-click on Configure RemoteFX.
- In the Configure RemoteFX properties window, select Enabled, and then click Apply and Ok.
- Now open the Command Prompt and type in gpupdate /force to update the Group Policies.
- Download and install the recommended GPU driver according to your physical GPU. Here is a detailed review of GPUs and how to manage them.
- Now shut down the VM and navigate back to the hosting computer running Hyper-V.
- Since the RemoteFX 3D Video Adapter option is greyed out in the settings of the VM, we shall enable it through PowerShell. Run PowerShell with Administrative Rights. Here is a complete guide on how to always run PowerShell in Administrative Mode.
- Enter the following command while replacing (name) with the name of your virtual machine:
Add-VMRemoteFX3dVideoAdapter -VMName (name)
- Now open the VM Settings through the Hyper-V control panel and you will find the RemoteFX ED Video Adapter under the Processor tab. Click on it and then make the configurations according to your needs.
You can now start and connect to the virtual machine and it will now use the host machine’s GPU to process its workload. You may also configure multiple VMs to run on a shared physical GPU.
Alternative for RemoteFX vGPU
Microsoft is permanently planning on removing the feature by February 2021. However, they have not left their users stranded. Microsoft has also proposed an alternative solution to directly mount the physical GPU on the PCIe port to a VM through the Discrete Device Assignment (DDA).
This method has three phases which need to be completed in order to provide a VM with a dedicated GPU:
- Configure the VM for DDA
- Dismount the GPU from the host computer
- Assign the GPU to the VM
Configure the VM for DDA
On the host computer, run the following commands one after the other to configure its settings. Replace (name) with the name of the VM:
Set-VM -Name (name) -AutomaticStopAction TurnOff
Set-VM -GuestControlledCacheTypes $true -VMName (name)
Set-VM -LowMemoryMappedIoSpace 3Gb -VMName (name)
Set-VM -HighMemoryMappedIoSpace 33280Mb -VMName (name)
Dismount the GPU from the host computer
Firstly, you need to disable the GPU on the PCIe port, and then dismount it. But before that, you are going to need the port’s physical address. This can be determined by performing the following:
- Head to the Device Manager by typing in devmgmt.msc in Run.
- Now expand Display Adapters and right-click on the GPU. Select Properties from the Context Menu.
- Go to the Details tab and select Location Paths from the drop-down menu under Property.
- Note that the entry starts with “PCIROOT” as this will be required when dismounting the GPU from the host device.
Now perform the following to dismount the device:
- Head to the Properties window of the GPU from the Device Manager.
- Go to the Driver tab and then click on Disable device.
Now that the device has been disabled, you need to dismount it.
Enter the following command in Command Prompt:Dismount-VMHostAssignableDevice -force -LocationPath $(LocationPath)
Replace (LocationPath) with the PCIe path you had noted earlier.
Once done, you may proceed to the next phase.
Assign the GPU to the VM
Now all you need to do is program Hyper-V to let the specified VM use the physical GPU. This can be done by running the command below in Command Prompt:Add-VMAssignableDevice -LocationPath $locationPath -VMName (name)
Replace (name) with the name of the VM.
You may now start the guest operating system and see that the video adapter it is now using will be the physical one on your host computer.
If at any time you wish to return the GPU back to the host device, simply run the following two commands in the same order, one after the other, in the Command Prompt while replacing (name) with the name of the VM:Remove-VMAssignableDevice -LocationPath $locationPath -VMName VMName<br>Mount-VMHostAssignableDevice -LocationPath $locationPath
Closing words
The RemoteFX vGPU hasn’t been around much for the version 2004. However, people liked the idea of it. Seeing it go might not be as troublesome as anticipated unless you put in the cost factor.
Although Microsoft has given an alternative for using designated GPUs for each virtual machine, it would not be ideal to place as many GPUs on the motherboard of the host computer as the virtual machines. The costs would be too high, and power consumption would not be ideal.
Microsoft needs to find a workaround for the issue as the solution provided is not feasible for most users.
Also see:
Subhan Zafar is an established IT professional with interests in Windows and Server infrastructure testing and research, and is currently working with Itechtics as a research consultant. He has studied Electrical Engineering and is also certified by Huawei (HCNA & HCNP Routing and Switching).
Configuration:
Hyper-V — Server 2016 Desktop Virtualization Host with all available updates as of 09/12/2019
-nVidia Tesla M10 with newest Graphics Drivers available — fully support 1903
-Registry setting for AVC444ModePreferred = 1
-Registry setting for AVCHardwareEncodePreferred = 2
VDI Desktop — Windows 10 1903 with all available updates installed as of 09/12/2019
-RemoteFX Adapter added to VM with 2x monitors with 512MB
RDP Client Endpoint — Win10 1803, Win10 1809, Win10 1903 all with all available updates as of 09/12/2019
Scenario 1: RDP from client to the VDI through RDCB or directly: Fails to connect with administrator message
Scenario 2: Connect to VM through Hyper-V Console with RemoteFX enabled — Works flawlessly
Scenario 3: Enable the ‘Use WDDM graphics display driver for Remote Desktop Connections’ policy — Connection works over RDP but it appears RemoteFX isn’t functioning fully as graphics are sluggish. This should not be the fix as the nVidia RemoteFX drivers
should be fully WDDM compatible.
Scenario 4: Remove RemoteFX Adapter — Connection works over RDP but is sluggish due to no RemoteFX
This person is having the same problem but the fixes are not working for me and since he did not respond, I’m not sure the fixes are actually working — https://social.technet.microsoft.com/Forums/office/en-US/25fa7511-c21d-44e7-9c5f-b77ffdd4d2ac/remotefx-on-hyperv-console-but-not-through-rdp?forum=winserverTS
Message Received on RDP Client:
Your Remote Desktop Services session has ended, possibly for one of the following reasons:
The administrator has ended the session.
An error occurred while the connection was being established.
A network problem occurred.
More to come — Working on adding additional details
Configuration:
Hyper-V — Server 2016 Desktop Virtualization Host with all available updates as of 09/12/2019
-nVidia Tesla M10 with newest Graphics Drivers available — fully support 1903
-Registry setting for AVC444ModePreferred = 1
-Registry setting for AVCHardwareEncodePreferred = 2
VDI Desktop — Windows 10 1903 with all available updates installed as of 09/12/2019
-RemoteFX Adapter added to VM with 2x monitors with 512MB
RDP Client Endpoint — Win10 1803, Win10 1809, Win10 1903 all with all available updates as of 09/12/2019
Scenario 1: RDP from client to the VDI through RDCB or directly: Fails to connect with administrator message
Scenario 2: Connect to VM through Hyper-V Console with RemoteFX enabled — Works flawlessly
Scenario 3: Enable the ‘Use WDDM graphics display driver for Remote Desktop Connections’ policy — Connection works over RDP but it appears RemoteFX isn’t functioning fully as graphics are sluggish. This should not be the fix as the nVidia RemoteFX drivers
should be fully WDDM compatible.
Scenario 4: Remove RemoteFX Adapter — Connection works over RDP but is sluggish due to no RemoteFX
This person is having the same problem but the fixes are not working for me and since he did not respond, I’m not sure the fixes are actually working — https://social.technet.microsoft.com/Forums/office/en-US/25fa7511-c21d-44e7-9c5f-b77ffdd4d2ac/remotefx-on-hyperv-console-but-not-through-rdp?forum=winserverTS
Message Received on RDP Client:
Your Remote Desktop Services session has ended, possibly for one of the following reasons:
The administrator has ended the session.
An error occurred while the connection was being established.
A network problem occurred.
More to come — Working on adding additional details