RDP тормозит: диагностика по шагам от канала до видеоподсистемы

RDP тормозит: диагностика по шагам от канала до видеоподсистемы

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

Сначала отделить сервер от канала

Первый вопрос: тормозит сеанс или тормозит сервер?

Различаются они просто. Если внутри сеанса медленно открывается программа, но мышь двигается плавно и окна перерисовываются мгновенно — тормозит сервер или приложение. Если мышь запаздывает за движением руки, а текст появляется рывками — тормозит доставка изображения.

Второй способ отделить: подключиться к тому же серверу с машины, стоящей рядом с ним в той же сети. Если оттуда всё летает — проблема в канале до клиента.

Третий: посмотреть загрузку сервера. Терминальный хост с процессором на 95 % будет тормозить у всех и одинаково.

Get-Counter -Counter @(
  "\Процессор(_Total)\% загруженности процессора",
  "\Память\Доступно МБ",
  "\Терминальные службы\Активные сеансы"
) -SampleInterval 5 -MaxSamples 24

Дальнейший разбор в этой статье — про случай, когда сервер здоров, а сеанс всё равно неотзывчив.

Счётчики RemoteFX: главный инструмент

Windows ведёт подробные счётчики качества каждого сеанса, и они отвечают на вопрос точнее любых догадок.

Собираются на сервере, отдельно по каждой активной сессии:

Get-Counter -Counter @(
  "\RemoteFX Network(*)\Current TCP RTT",
  "\RemoteFX Network(*)\Current UDP RTT",
  "\RemoteFX Network(*)\Current TCP Bandwidth",
  "\RemoteFX Network(*)\Total Sent Bytes",
  "\RemoteFX Graphics(*)\Average Encoding Time",
  "\RemoteFX Graphics(*)\Frames Skipped/Second - Insufficient Server Resources",
  "\RemoteFX Graphics(*)\Frames Skipped/Second - Insufficient Network Resources",
  "\RemoteFX Graphics(*)\Frames Skipped/Second - Insufficient Client Resources"
) -SampleInterval 2 -MaxSamples 30

Как читать результат:

СчётчикНормаО чём говорит превышение
Current TCP RTTдо 40 мсзадержка канала
Average Encoding Timeдо 33 мссервер не успевает кодировать кадр
Frames Skipped — Server0перегружен процессор хоста
Frames Skipped — Network0канал не вывозит поток
Frames Skipped — Client0слабое устройство пользователя

Три счётчика пропущенных кадров — самое ценное во всём наборе. Они прямо указывают виновника: сервер, сеть или клиент. Без них этот вопрос решается перебором.

Пример из практики: жалобы на дёрганый интерфейс у трёх сотрудников из тридцати. Счётчики показали ненулевой Frames Skipped — Insufficient Client Resources только у них. Оказалось — старые тонкие клиенты, не тянувшие декодирование потока. Сервер и сеть были ни при чём, и без счётчиков мы бы искали долго.

Счётчики качества RDP-сессии
Три счётчика RemoteFX отвечают на вопрос, где именно теряется отзывчивость

UDP-транспорт: включён ли он на самом деле

Начиная с Windows Server 2012 RDP умеет использовать UDP параллельно с TCP. Это существенно меняет поведение при потерях пакетов.

TCP при потере пакета останавливает поток до повторной передачи — и картинка замирает. UDP-транспорт RDP переносит потери гораздо мягче: пропущенный фрагмент кадра будет перерисован следующим, вместо того чтобы задерживать всё.

При потерях в 1–2 % разница между TCP-only и TCP+UDP видна невооружённым глазом.

Проверить, используется ли UDP в конкретном сеансе, можно по счётчику Current UDP RTT: если он ненулевой — транспорт работает.

Что мешает UDP работать чаще всего:

  • порт 3389/UDP закрыт на фаерволе или не проброшен в NAT;
  • подключение идёт через RD Gateway со старой конфигурацией без поддержки UDP;
  • UDP отключён политикой на сервере;
  • сетевое оборудование по пути режет UDP.

Проверка и включение политикой:

$p = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services'
Get-ItemProperty $p -Name SelectTransport -ErrorAction SilentlyContinue
# 0 = оба транспорта (по умолчанию), 1 = только TCP, 2 = оба с приоритетом UDP
Set-ItemProperty $p -Name SelectTransport -Value 0 -Type DWord

Отдельно про RD Gateway: он поддерживает UDP, но требует, чтобы на шлюзе был открыт и настроен транспорт по UDP на порту 3391. В типовых развёртываниях его часто забывают, и все внешние подключения молча работают только по TCP.

Проверить со стороны шлюза:

Get-NetTCPConnection -LocalPort 443 | Measure-Object
Get-NetUDPEndpoint -LocalPort 3391 -ErrorAction SilentlyContinue

Ловушка автоопределения канала

Известный эффект, из-за которого сеанс в быстрой локальной сети вдруг работает так, будто подключён по модему.

Клиент RDP пытается определить качество канала при подключении и выбирает профиль настроек: какое сжатие использовать, включать ли анимацию, сглаживание шрифтов, фон рабочего стола.

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

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

Лечится принудительным заданием типа подключения политикой:

$p = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services'
# отключить автоопределение и задать профиль вручную
Set-ItemProperty $p -Name 'fEnableAutoDetect' -Value 0 -Type DWord
Set-ItemProperty $p -Name 'ConnectionType' -Value 6 -Type DWord  # 6 = LAN 10 Mbps и выше
Set-ItemProperty $p -Name 'MinEncryptionLevel' -Value 3 -Type DWord

Значение 6 соответствует профилю быстрой локальной сети с включёнными визуальными эффектами. Для филиалов на медленных каналах логика обратная: имеет смысл принудительно задать более скромный профиль, чтобы клиент не пытался тянуть полное качество.

Другая половина той же истории — настройки на стороне клиентского .rdp-файла. Там задаётся, что именно передавать:

connection type:i:6
networkautodetect:i:0
bandwidthautodetect:i:0
disable wallpaper:i:1
allow font smoothing:i:1
disable full window drag:i:1
disable menu anims:i:1
smart sizing:i:0

Отключение обоев и перетаскивания окна с содержимым — две настройки с наилучшим соотношением «экономия трафика к потере удобства». Сглаживание шрифтов, наоборот, стоит оставлять: оно недорого и заметно влияет на комфорт при работе с текстом.

Графика на стороне сервера

Кодирование изображения — работа процессора хоста. При тридцати сеансах это заметная нагрузка.

Показатель Average Encoding Time выше 33 миллисекунд означает, что сервер не успевает готовить 30 кадров в секунду. Пользователи видят это как рывки.

Что помогает:

Ограничить частоту кадров. Для офисной работы 30 кадров избыточно; 15–20 хватает, а нагрузка падает вдвое.

Set-ItemProperty $p -Name 'DWMFRAMEINTERVAL' -Value 50 -Type DWord  # ~20 fps

Задать разумное качество и сжатие. Политика конфигурации сжатия RemoteFX имеет три режима: оптимизация по памяти, сбалансированный и по пропускной способности. Для офиса с приличной сетью сбалансированный оптимален.

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

Ограничить разрешение и глубину цвета. Сотрудник с двумя мониторами 4K создаёт кратно больший поток, чем сотрудник с одним Full HD. Иногда это законная потребность, иногда — просто «так получилось».

Отключить визуальные эффекты внутри сеанса. Анимация окон, тени, плавное появление меню — всё это надо кодировать и передавать.

$perf = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects'
Set-ItemProperty $perf -Name VisualFXSetting -Value 2   # оптимизировать быстродействие

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

И одно наблюдение: браузер с открытым видео или анимированной рекламой в терминальном сеансе создаёт постоянный поток изменений экрана и нагружает кодирование сильнее, чем вся остальная работа офиса. Если на ферме без видимых причин высокое Average Encoding Time, стоит посмотреть, что открыто у пользователей.

TCP и UDP транспорт RDP
UDP переживает потери пакетов заметно лучше TCP — при потерях разница видна сразу

Что тормозит не из-за RDP

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

Долгий вход, быстрая работа. Это не RDP. Это профиль, групповые политики или скрипты входа. Разбирается включением подробного логирования входа и анализом времени по этапам.

$k='HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon'
Set-ItemProperty $k -Name VerboseStatus -Value 1 -Type DWord
# дальше смотреть журнал Microsoft-Windows-GroupPolicy/Operational,
# событие 8001 содержит суммарное время обработки политик

Тормозит только работа с файлами. Не RDP, а сетевая шара или перенаправление дисков. Проверяется копированием файла внутри сеанса с локального диска на локальный.

Тормозит одно приложение. Классика — 1С, которая на терминале работает медленнее, чем ожидается. Здесь причина обычно вообще не в терминале, а в сервере приложений или СУБД, и разбирать надо по методике диагностики 1С, а не по счётчикам RemoteFX.

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

Периодические замирания раз в несколько минут. Часто это антивирус со сканированием по расписанию либо сброс кэша на дисковой подсистеме хоста.

Всё встало у всех одновременно. Не производительность, а событие: недоступность хранилища профилей, контроллера домена, сервера лицензирования. Смотреть надо в журналы, а не в счётчики.

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

Порядок разбора на практике

Итоговая последовательность, которую мы применяем при жалобе на медленный терминал.

  1. Отделить сервер от сеанса — проверить загрузку хоста и подключиться из локальной сети.
  2. Снять счётчики RemoteFX по проблемной сессии в момент жалобы.
  3. По счётчику пропущенных кадров определить виновника: сервер, сеть или клиент.
  4. Если сеть — измерить задержку и потери, проверить, работает ли UDP.
  5. Если сервер — посмотреть время кодирования, число сеансов, что открыто у пользователей.
  6. Если клиент — проверить модель устройства, версию клиента RDP, разрешение мониторов.
  7. Проверить автоопределение канала — не выбрал ли клиент профиль медленной сети.
  8. Применить настройки политикой, а не на одном сеансе, и замерить повторно.

Время полного прохода — около часа. Из него минут двадцать занимает ожидание момента, когда проблема воспроизведётся: снимать счётчики нужно именно тогда, когда пользователь жалуется, а не после.

Полезная практика для ферм, где жалобы регулярны: настроить постоянный сбор нескольких счётчиков RemoteFX в файл. Тогда в момент обращения у вас есть история, и не приходится просить человека «повоспроизводить».

logman create counter RDPQuality -f bincirc -max 200 -si 15 `
  -o "D:\perflogs\rdp" `
  -c "\RemoteFX Network(*)\Current TCP RTT" `
     "\RemoteFX Graphics(*)\Average Encoding Time" `
     "\RemoteFX Graphics(*)\Frames Skipped/Second - Insufficient Network Resources"
logman start RDPQuality

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

Частые вопросы

Почему RDP тормозит при быстром интернете?

Чаще всего дело не в скорости канала, а в задержке и потерях пакетов, либо в том, что клиент по автоопределению выбрал профиль медленной сети и включил агрессивное сжатие. Проверьте счётчики RemoteFX: они прямо показывают, что именно является узким местом.

Как понять, работает ли UDP-транспорт RDP?

По счётчику Current UDP RTT в группе RemoteFX Network: ненулевое значение означает, что UDP используется. Если он нулевой, проверьте, открыт ли порт 3389/UDP, а при подключении через RD Gateway — настроен ли на нём транспорт по UDP на порту 3391.

Какие визуальные настройки отключать в первую очередь?

Обои рабочего стола и перетаскивание окна с отображением содержимого — они дают наибольшую экономию при минимальной потере удобства. Сглаживание шрифтов, наоборот, стоит оставить: оно недорого и сильно влияет на комфорт работы с текстом.

Что означает высокое Average Encoding Time?

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

Нужна помощь с проектом?

Специалисты АйТи Фреш помогут с архитектурой, DevOps, безопасностью и разработкой — 15+ лет опыта

📞 Связаться с нами
#Windows#RDP#производительность#диагностика#GPO
Комментарии 0

Оставить комментарий

загрузка...

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.