Сенсационное расследование о тайных настройках Windows 10
Вступление
Простенькая на первый взгляд операционная системка, которая кажется вроде бы и так неплохо работоает, но она только хочет казаться нам вполне законченной и не нуждающейся в каких-либо дополнительных настройках. В этом расследовании я расскажу о её тайных настройках которые вляют на сетевые процессы происходящие в игре. Всё началось казалось бы с незначительной и не относящейся к делу вещи - с кроссовок! Сижу, смотрю на свои кроссовки и думаю - "Вот провёл я сетку 100 Мбит. Да стало гораздо лучше чем на гнилом adsl или на 4G от жадных опрераторов, но чёго-то всё равно явно не хватает". И после этого начался процесс изучения винды!
Глава 1. MTU
Первое, что должен сделать каждый, кто сидит через роутер - это проверить MTU! Если же при подключении компьютера напрямую к интернету Windows выставляет его автоматически, то при подключении через роутер он всегда ставит 1500 байт. Если MTU системы больше MTU сети, то пакеты при отправке будут фрагментироваться, фрагментация - это задержки, а задержки - это плохо! Чтобы определить MTU, понадобится "Командная строка" (запущенная с правами администратора) и несложная команда ping с ключами -f (запрет фрагментации) и -l <размер пакета в байтах> Пример:
если же результат выглядит примерно так
В сетях 3G/4G бывает так что пинг не поможет определить MTU сети, тут лучше воспользоваться сторонними сервисами в интернете например Speedguide Analyzer[www.speedguide.net]
И так после того как мы определили MTU, его надо установить в системе. Для этого введём следующие команды:
ping 8.8.8.8 -f -l 1472
если же результат выглядит примерно так
Требуется фрагментация пакета, но установлен запрещающий флаг. Требуется фрагментация пакета, но установлен запрещающий флаг. Требуется фрагментация пакета, но установлен запрещающий флаг. Требуется фрагментация пакета, но установлен запрещающий флаг.
или же пишет что-то наподобие "ответа нет", то следует выходить на митинги то следует уменьшать размер пакета до тех пор пока не появится ответ от пингуемого узла. После чего к размеру пакета, на котором получился удачный ответ, прибавляем 28 байт (размер заголовка ICMP) - это и будет наш MTU. Пинговать лучше всего DNS-сервера вашего провайдера (если вы не используете альтернативные DNS-сервера).В сетях 3G/4G бывает так что пинг не поможет определить MTU сети, тут лучше воспользоваться сторонними сервисами в интернете например Speedguide Analyzer[www.speedguide.net]
И так после того как мы определили MTU, его надо установить в системе. Для этого введём следующие команды:
netsh int ip set int <Имя интерфейса> mtu=<размер MTU> store=persistent netsh int ip set subint <Имя интерфейса> mtu=<размер MTU> store=persistent
Глава 2. Настройки TCP/IP
Тюниг TCP важен не только для тех игр, кто его использует, и не только потому что современные игры используют одновременно протоколы UDP и TCP. Одновременная работа TCP вместе с UDP может создавать проблемы в работе последнего (возникновение задержек и потерь) - поэтому тюнинг TCP не менее важен!
И создаём там две переменные DWORD со следующими значениями:
TcpAckFrequency=1
TcpDelAckTicks=0
Autotuning level
Многие в интернете жалуются на функцию автоизменения размера окна приёма - она может являться даже причиной низкой скорости. Основная же причина, по которой стоит её выключить - это возникновление явления "переполнения буфферов" (Buffer bloat) - задержки вызванные нехваткой размера сетевых буфферов. Для отключения AutotuningLevel можно воспользоваться средой PowerShell: Set-NetTCPSetting -SettingName InternetCustom -AutoTuningLevelLocal Disabled
Receive Segment Coalescing
Функция объединения нескольких пакетов в один. Также создаёт задержки. Отключить можно в том же PowerShell (хотя в Windows 10 уже отключена по умолчанию): Set-NetOffloadGlobalSetting -ReceiveSegmentCoalescing Disabled Set-NetOffloadGlobalSetting -PacketCoalescingFilter Disabled
Nagle's Algorithm
С отключением этого алгоритма, пакеты будут отправляться сразу же без задержек. Для его отключения понадобится запустить редактор реестра (Win+R и ввести regedit) и пойти по следующему пути: \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{индификатор сетевой карты}
* Лично я нахожу свою сетевую карту присваивая статический IPИ создаём там две переменные DWORD со следующими значениями:
TcpAckFrequency=1
TcpDelAckTicks=0
Глава 3. Планировщик классов мультимедия
Это вполне себе полезная функция появилась ещё в Windows 7 - она управляет приоритетами всей мультимедия включая и игры - но со времём той же Windows 7 создаёт и одну проблему: Майкрософт считает, что работа с сетью требует много ресурсов процессора и при этом мешает приложениям мультимедия, поэтому они просто ограничили процессорное время для работы с сетевыми протоколами - 10 тактов / мс. Тогда возможно Майкрософт считали, что этого хватит, но как показывает практика и как сознаются сами Майкрософт - это значение мало кого устраивает. Для того, чтобы убрать эту социальную несправедливость, пойдём в знакомый нам редактор реестра по следующему пути:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile
Найдём там переменную NetworkThrottlingIndex и присвоим ей значение ffffffff (шестнадцатеричное), это отключит межанизм ограничения. Глава 4. QoS - "Вы не любите кошек? Вы просто не умеете их готовить!"
Читая разные руководства по оптимизации сети для онлайн игр, я заметил, что многие устраивают гонения на QoS, мол он "только мешает", "съедает траффик" и т.д. Но! На самом деле QoS может позволить вашим пакетам выжить в жестоком мире интернета... ну или хотя в вашей домашней сети.
Идём в оснаску "Групповая политика" (Win+R и ввести gpedit.msc) и ищем там "QoS на основе политики" (рисунок 4.1)

Рисунок 4.1
Далее нажимаем на этом пункте нажать правой кнопкой мыши и выбрираем "Дополнительные параметры QoS" и выставить их как показано на рисунке 4.2 и нажать OK

Рисунок 4.2
Далее опять нажимаем на пункте "QoS на основе политики" правой кнопкой мыши и выбираем "Создать новую политику" и пошагово выставляем значения для интересующей игры: название, exe-файл и обязательно выставить DSCP значение 46 (EF приоритет в QoS самый высокий) - рисунки 4.3 - 4.6.

Рисунок 4.3

Рисунок 4.4

Рисунок 4.5

Рисунок 4.6
Идём в оснаску "Групповая политика" (Win+R и ввести gpedit.msc) и ищем там "QoS на основе политики" (рисунок 4.1)
Рисунок 4.1
Далее нажимаем на этом пункте нажать правой кнопкой мыши и выбрираем "Дополнительные параметры QoS" и выставить их как показано на рисунке 4.2 и нажать OK
Рисунок 4.2
Далее опять нажимаем на пункте "QoS на основе политики" правой кнопкой мыши и выбираем "Создать новую политику" и пошагово выставляем значения для интересующей игры: название, exe-файл и обязательно выставить DSCP значение 46 (EF приоритет в QoS самый высокий) - рисунки 4.3 - 4.6.
Рисунок 4.3
Рисунок 4.4
Рисунок 4.5
Рисунок 4.6
Заключение
В качестве заключения лучше расскажет демонстрация игрового процесса в разных игровых приложениях.
Battlefield 3 - пинг 80 мс
Прямая ссылка
Call of Duty: Black Ops 2 - пинг 85 мс
Прямая ссылка
Counter-Strike: Global Offensive - пинг 60 мс
Прямая ссылка
Настройки ОС оказали сильное влияние на игровой процесс, но также сильно могут влиять настройки сетевой карты и роутера, но это уже совсем другая история...
Battlefield 3 - пинг 80 мс
Прямая ссылка
Call of Duty: Black Ops 2 - пинг 85 мс
Прямая ссылка
Counter-Strike: Global Offensive - пинг 60 мс
Прямая ссылка
Настройки ОС оказали сильное влияние на игровой процесс, но также сильно могут влиять настройки сетевой карты и роутера, но это уже совсем другая история...
P.S.
Через Windows можно также отключить HPET, при этом не пользуясь командной строкой и ковыряя BIOS: достаточно найти в Диспетчере устройств в разделе Системные устройства пункт Высокоточный таймер событий
P.P.S.
Windows по умолчанию начала включать масштабирование окон при повторных отправках, хотя по документации оно выключена по умолчанию, исправляем это:
RouteCacheLimitEntries почему-то стал 4096, хотя по документации 128
Отключаем LSO если есть
Новый алгоритм контроля перегрузки TCP теперь CUBIC, если с ним возникают проблемы, то вернуть CTCP можно следующими командами:
Set-NetTCPSetting -SettingName InternetCustom -ForceWS Disabled
RouteCacheLimitEntries почему-то стал 4096, хотя по документации 128
Set-NetIPv4Protocol -RouteCacheLimitEntries 128
Отключаем LSO если есть
Disable-NetAdapterLso -Name *
Новый алгоритм контроля перегрузки TCP теперь CUBIC, если с ним возникают проблемы, то вернуть CTCP можно следующими командами:
netsh int tcp set supplemental template=internetcustom congestionprovider=ctcp netsh int tcp set supplemental template=internet congestionprovider=ctcp