Разница в скорости загрузки HTTP в Windows 7 против Linux
У меня странная ситуация с ПК с Windows 7 Home Premium, который показывает ограниченную скорость передачи данных по Интернету без видимой причины.
Настройка:
- внутренняя гигабитная локальная сеть, за маршрутизатором TP-Link WDR3600, работающим под управлением DD-WRT
- подключение к интернету по оптоволокну со скоростью загрузки 100 Мбит / с, загрузкой 8 Мбит / с
- ПК с Windows 7 Home Premium, подключенный через проводной интерфейс (гигабит)
- Virtualbox Linux гостевая виртуальная машина, работающая на ПК с Windows
- У виртуальной машины есть сетевой интерфейс, соединенный с интерфейсом проводного хоста, и IP-адрес локальной сети
- в той же локальной сети есть NAS, предоставляющий файлы по HTTP (гигабит)
- нет настройки HTTP-прокси в Windows, "автоматическое определение настроек" отключено в меню настроек LAN в Windows
- QoS отключен в роутере
- все тесты проводятся через гигабитный Ethernet
Факты:
- Скорость передачи данных из Интернета не превышает ~20 Мбит / с на ПК с Windows, несмотря на то, что интернет-соединение не насыщено.
- Точно такая же загрузка через Интернет с виртуальной машины Linux достигает предела соединения 100 Мбит / с без проблем. Это верно, когда загрузка передается в /dev/null, но также и когда она записывается на диск
- Загрузка файла с NAS на ПК под управлением Windows по протоколу HTTP обеспечивает скорость передачи ~600 Мбит / с
- MTU в Windows и Linux одинаков
- Попытка отключения большой разгрузки сегмента на проводном сетевом интерфейсе (Windows), без эффекта
- Переключение между Firefox, Chrome и IE без изменений в результатах
- Speedtest.net в Windows достигает скорости передачи 100/8
Некоторые отброшенные гипотезы:
- не проблема с аппаратным обеспечением, поскольку виртуальная машина Linux может быстро загружаться с использованием того же интерфейса, а загрузка по локальной сети также работает нормально
- не проблема роутера, загрузка ВМ быстрая
- не проблема подключения к интернету, загрузка виртуальных машин происходит быстро
- не ограничение скорости диска, загрузка VM на диск быстрая
- не проблема браузера
- не проблема фрагментации, MTU одинаково в Windows и VM
Некоторые возможности:
- Ограничение стека Windows TCP или конфигурация, связанная с HTTP
Есть идеи, что здесь происходит? Почему Windows не занимает всю пропускную способность?
2 ответа
Что ж, после некоторого расследования возникла проблема с масштабированием окна приема TCP для Windows 7.
Это были мои первоначальные настройки TCP:
C:\Windows\system32>netsh interface tcp show global
Querying active state...
TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : disabled
Chimney Offload State : automatic
NetDMA State : enabled
Direct Cache Acess (DCA) : disabled
Receive Window Auto-Tuning Level : disabled
Add-On Congestion Control Provider : none
ECN Capability : disabled
RFC 1323 Timestamps : disabled
** The above autotuninglevel setting is the result of Windows Scaling heuristics
overriding any local/policy configuration on at least one profile.
C:\Windows\system32>netsh interface tcp show heuristics
TCP Window Scaling heuristics Parameters
----------------------------------------------
Window Scaling heuristics : enabled
Qualifying Destination Threshold : 3
Profile type unknown : normal
Profile type public : normal
Profile type private : restricted
Profile type domain : normal
Мое подключение к Ethernet классифицируется как "домашняя" сеть, которая, по-видимому, попадает в категорию "Частный тип профиля" в выводе эвристики.
Согласно этой отличной статье, отключение эвристики должно решить проблему.
Таким образом я сделал:
# disable heuristics
C:\Windows\system32>netsh interface tcp set heuristics wsh=disabled
Ok.
# enable receive-side scaling
C:\Windows\system32>netsh int tcp set global rss=enabled
Ok.
# manually set autotuning profile
C:\Windows\system32>netsh interface tcp set global autotuning=experimental
Ok.
# set congestion provider
C:\Windows\system32>netsh interface tcp set global congestionprovider=ctcp
Ok.
C:\Windows\system32>netsh interface tcp show global
Querying active state...
TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : automatic
NetDMA State : enabled
Direct Cache Acess (DCA) : disabled
Receive Window Auto-Tuning Level : experimental
Add-On Congestion Control Provider : ctcp
ECN Capability : disabled
RFC 1323 Timestamps : disabled
После изменения этих настроек загрузка снова происходит быстро, достигнув предела интернет-соединения.
Проблема с низкой скоростью загрузки в Windows 7 и Windows Server 2008 R2 связана с ошибкой в стеке TCP/IP. Если между местоположением A и местоположением B у вас очень низкая задержка (1-8 мс), вы заметите, что скорость загрузки ниже нормальной. Примените KB2675785 от Microsoft https://support.microsoft.com/en-us/kb/2675785 чтобы решить эту проблему.