Факты (пожалуйста, укажите любые ложные утверждения):
У меня есть соединение 100 Мбит / с между двумя сайтами, которые находятся на расстоянии 80 мс
Это длинное толстое соединение, которое может выиграть от большого размера окна TCP, возможно, до 100 Мбит / с * 0,08 сек = 1 000 000 байт
Обе машины работают под управлением Windows Server 2012. «Уровень автоматической настройки окна приема» является нормальным для обеих систем. «Эвристика масштабирования окна» отключена на обоих.
Я запустил «iperf -s» с одной стороны и «iperf -c» с другой. Передача произошла со скоростью 5 Мбит / с. Я получаю тот же результат в другом направлении.
Обе стороны объявили о поддержке раздвижных окон TCP в своих SYN.
Получатель запросил размер окна TCP 64,512 байт (0xFC00) в течение всего цикла со значением масштаба окна TCP «без сдвига» (0x000).
Сеть смогла обработать окно большего размера (см. Схемы последовательности ниже)
Приемник держал окно меньше, чем поддерживает сеть
Это соединение происходит в IPSEC VPN. MTU интерфейса туннеля уменьшается до 1400 байтов в обоих направлениях.
Вопрос
- Почему приемник держит окно маленьким?
Non-ответы
Сеть сломана
Машины Linux, работающие в одной сети, открывают окно TCP до 1,5 мегабайт и передают данные с 6-кратной пропускной способностью
Эвристика масштабирования окна включена
Эвристика масштабирования окна отключена (см. Вывод «эвристики netsh interface tcp show» ниже)
Уровень автоматической настройки окна получения не является нормальным
Уровень автонастройки окна получения является нормальным (см. Вывод «netsh interface tcp show global» ниже)
Это просто не работает на виртуальной машине в ESXi
Я получаю в 6 раз лучшую производительность на виртуальной машине Linux, работающей на том же хосте.
Обновление от 1 июня 12, 2015, 16:30 PDT
Я изменил тест, поместив linux на одну сторону соединения. Конечно, когда linux отправляет данные в Windows Server 2012, Windows предлагает слишком маленькое окно приема TCP (64 512 байт).
Когда я отправляю данные из Windows в Linux, Linux предлагает достаточно большое окно приема TCP (1 365 120 байтов). Тем не менее, Windows ограничивает отправку до ~ 60000 байт в полете.
Обновление 2 июня 13, 2015 15:00 PDT
На шаг ближе к основной причине. В моей настройке ни SO_SNDBUF, ни SO_RCVBUF не установлены (по iperf). Это буферы отправки и получения, которые эффективно ограничивают окно приема. Если эти значения не указаны, Windows Server 2012 предоставляет значение по умолчанию 64 КБ. Итак, вопрос сейчас:
Вопрос
- Если один из них не указан, почему Windows Server 2012 не динамически увеличивает SO_SNDBUF / SO_RCVBUF для размещения длинных толстых каналов, как описано в MSDN ?
Non-ответы
"netsh winsock show autotuning" отключен
Это включено.
Обновление 3 августа 24, 2015 16:00 PDT
netsh, видимо, был заменен на Set-NetTCPSetting и семейство. Get-NetTCPSetting в сочетании с Get-NetTCPConnection показывает, что я работаю в режиме «Интернет», который предлагает мне следующие настройки:
SettingName : Internet
MinRto(ms) : 300
InitialCongestionWindow(MSS) : 4
CongestionProvider : CTCP
CwndRestart : False
DelayedAckTimeout(ms) : 50
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
Настройки TCP отправителя
PS C:\Users\acs> netsh interface tcp show global
Querying active state...
TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : disabled
NetDMA State : disabled
Direct Cache Access (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : none
ECN Capability : enabled
RFC 1323 Timestamps : disabled
Initial RTO : 3000
Receive Segment Coalescing State : enabled
PS C:\Users\acs> netsh interface tcp show heuristics
TCP Window Scaling heuristics Parameters
----------------------------------------------
Window Scaling heuristics : disabled
Qualifying Destination Threshold : 3
Profile type unknown : normal
Profile type public : normal
Profile type private : normal
Profile type domain : normal
PS C:\Users\acs> Get-NetTCPSetting
SettingName : Automatic
MinRto(ms) :
InitialCongestionWindow(MSS) :
CongestionProvider :
CwndRestart :
DelayedAckTimeout(ms) :
MemoryPressureProtection :
AutoTuningLevelLocal :
AutoTuningLevelGroupPolicy :
AutoTuningLevelEffective :
EcnCapability :
Timestamps :
InitialRto(ms) :
ScalingHeuristics :
DynamicPortRangeStartPort :
DynamicPortRangeNumberOfPorts :
SettingName : Custom
MinRto(ms) : 20
InitialCongestionWindow(MSS) : 4
CongestionProvider : DCTCP
CwndRestart : True
DelayedAckTimeout(ms) : 10
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Compat
MinRto(ms) : 300
InitialCongestionWindow(MSS) : 2
CongestionProvider : Default
CwndRestart : False
DelayedAckTimeout(ms) : 200
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Datacenter
MinRto(ms) : 20
InitialCongestionWindow(MSS) : 4
CongestionProvider : DCTCP
CwndRestart : True
DelayedAckTimeout(ms) : 10
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Internet
MinRto(ms) : 300
InitialCongestionWindow(MSS) : 4
CongestionProvider : CTCP
CwndRestart : False
DelayedAckTimeout(ms) : 50
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
Отправитель SYN
No. Time Source Destination Protocol Length Delta Sequence number Acknowledgment number Bytes in flight Calculated window size Info
814 5.036577000 10.10.0.21 10.11.0.1 TCP 66 0.000000000 0 0 64512 49758→5001 [SYN, ECN, CWR] Seq=0 Win=64512 Len=0 MSS=1460 WS=1 SACK_PERM=1
Frame 814: 66 bytes on wire (528 bits), 66 bytes captured (528 bits) on interface 0
Ethernet II, Src: 00:11:22:33:44:55, Dst: aa:bb:cc:dd:ee:ff
Internet Protocol Version 4, Src: 10.10.0.21 (10.10.0.21), Dst: 10.11.0.1 (10.11.0.1)
Transmission Control Protocol, Src Port: 49758 (49758), Dst Port: 5001 (5001), Seq: 0, Len: 0
Source Port: 49758 (49758)
Destination Port: 5001 (5001)
[Stream index: 73]
[TCP Segment Len: 0]
Sequence number: 0 (relative sequence number)
Acknowledgment number: 0
Header Length: 32 bytes
.... 0000 1100 0010 = Flags: 0x0c2 (SYN, ECN, CWR)
Window size value: 64512
[Calculated window size: 64512]
Checksum: 0x1451 [validation disabled]
Urgent pointer: 0
Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted
Maximum segment size: 1460 bytes
No-Operation (NOP)
Window scale: 0 (multiply by 1)
Kind: Window Scale (3)
Length: 3
Shift count: 0
[Multiplier: 1]
No-Operation (NOP)
No-Operation (NOP)
TCP SACK Permitted Option: True
Перспектива отправителя графа последовательности
Настройки TCP получателя
PS C:\Users\acs> netsh interface tcp show global
Querying active state...
TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : enabled
Chimney Offload State : disabled
NetDMA State : disabled
Direct Cache Access (DCA) : disabled
Receive Window Auto-Tuning Level : normal
Add-On Congestion Control Provider : none
ECN Capability : enabled
RFC 1323 Timestamps : disabled
Initial RTO : 3000
Receive Segment Coalescing State : enabled
PS C:\Users\acs> netsh interface tcp show heuristics
TCP Window Scaling heuristics Parameters
----------------------------------------------
Window Scaling heuristics : disabled
Qualifying Destination Threshold : 3
Profile type unknown : normal
Profile type public : normal
Profile type private : normal
Profile type domain : normal
PS C:\Users\acs> Get-NetTCPSetting
SettingName : Automatic
MinRto(ms) :
InitialCongestionWindow(MSS) :
CongestionProvider :
CwndRestart :
DelayedAckTimeout(ms) :
MemoryPressureProtection :
AutoTuningLevelLocal :
AutoTuningLevelGroupPolicy :
AutoTuningLevelEffective :
EcnCapability :
Timestamps :
InitialRto(ms) :
ScalingHeuristics :
DynamicPortRangeStartPort :
DynamicPortRangeNumberOfPorts :
SettingName : Custom
MinRto(ms) : 20
InitialCongestionWindow(MSS) : 4
CongestionProvider : DCTCP
CwndRestart : True
DelayedAckTimeout(ms) : 10
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Compat
MinRto(ms) : 300
InitialCongestionWindow(MSS) : 2
CongestionProvider : Default
CwndRestart : False
DelayedAckTimeout(ms) : 200
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Datacenter
MinRto(ms) : 20
InitialCongestionWindow(MSS) : 4
CongestionProvider : DCTCP
CwndRestart : True
DelayedAckTimeout(ms) : 10
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
SettingName : Internet
MinRto(ms) : 300
InitialCongestionWindow(MSS) : 4
CongestionProvider : CTCP
CwndRestart : False
DelayedAckTimeout(ms) : 50
MemoryPressureProtection : Enabled
AutoTuningLevelLocal : Normal
AutoTuningLevelGroupPolicy : NotConfigured
AutoTuningLevelEffective : Local
EcnCapability : Enabled
Timestamps : Disabled
InitialRto(ms) : 3000
ScalingHeuristics : Disabled
DynamicPortRangeStartPort : 49152
DynamicPortRangeNumberOfPorts : 16384
Приемник SYN
No. Time Source Destination Protocol Length Delta Sequence number Acknowledgment number Bytes in flight Calculated window size Info
817 5.110501000 10.11.0.1 10.10.0.21 TCP 70 0.073924000 0 1 64512 5001→49758 [SYN, ACK, ECN] Seq=0 Ack=1 Win=64512 Len=0 MSS=1460 WS=1 SACK_PERM=1 [ETHERNET FRAME CHECK SEQUENCE INCORRECT]
Frame 817: 70 bytes on wire (560 bits), 70 bytes captured (560 bits) on interface 0
Ethernet II, Src: aa:bb:cc:dd:ee:ff, Dst: 00:11:22:33:44:55
Internet Protocol Version 4, Src: 10.11.0.1 (10.11.0.1), Dst: 10.10.0.21 (10.10.0.21)
Transmission Control Protocol, Src Port: 5001 (5001), Dst Port: 49758 (49758), Seq: 0, Ack: 1, Len: 0
Source Port: 5001 (5001)
Destination Port: 49758 (49758)
[Stream index: 73]
[TCP Segment Len: 0]
Sequence number: 0 (relative sequence number)
Acknowledgment number: 1 (relative ack number)
Header Length: 32 bytes
.... 0000 0101 0010 = Flags: 0x052 (SYN, ACK, ECN)
Window size value: 64512
[Calculated window size: 64512]
Checksum: 0xb5bb [validation disabled]
Urgent pointer: 0
Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted
Maximum segment size: 1460 bytes
No-Operation (NOP)
Window scale: 0 (multiply by 1)
Kind: Window Scale (3)
Length: 3
Shift count: 0
[Multiplier: 1]
No-Operation (NOP)
No-Operation (NOP)
TCP SACK Permitted Option: True
[SEQ/ACK analysis]
Перспектива приемника графика последовательности
Окно TCP
источник
Ответы:
Я видел это как специфичную для водителя проблему; в моем случае с сетевыми контроллерами QLogic, которые пытались использовать TCPChimney. Эта ссылка описывает функциональность TCPChimney, добавленную в Windows 2008, но я уверен, что она по-прежнему применима: https://support.microsoft.com/en-us/kb/951037
Я бы порекомендовал проверить следующее, по порядку; после каждого теста перезагрузите компьютер и посмотрите, не начнет ли приемник увеличивать TCP RWIN, как ожидалось.
1) Загрузите последние версии драйверов для сетевого адаптера на принимающем компьютере. 1) Отключить TCPChimney на принимающем компьютере. 2) Отключить всю разгрузку «TCP Receive». Это можно найти в расширенных настройках свойств сетевого адаптера (в той же области, где будут установлены скорость и дуплекс). 3) Отключить всю разгрузку «TCP Send» (также в расширенных свойствах сетевого адаптера).
(И вопреки комментарию «И большие размеры окна TCP свыше 65 КБ вредны для серверов, так как тогда увеличивается потребность в памяти для соединений. Только 65 КБ могут также не сделать вас счастливыми. - user303507 6 августа '15 в 11:30», Большие окна приема TCP НЕ вредны для сервера. В случае каналов с высокой пропускной способностью и высокой задержкой (например, спутниковые ретрансляторы) большие значения RWIN необходимы для того, чтобы у нас было больше данных TCP «в канале». Соединение 600 Мбит / с с задержкой 3000 мс; канал с высокой пропускной способностью будет ограничен до 20 Кбит / с, так как только 65 КБ неподтвержденных данных TCP могут находиться "в канале" одновременно.)
источник
Похоже, ошибка автонастройки Windows, может быть, что-то делать с этим? https://support.microsoft.com/en-us/kb/932170
Вы пытались запросить большее значение SO_RCVBUF вручную с помощью WskControlSocket?
источник
Используйте сетевой оптимизатор, такой как Cisco WAAS или Riverbed. Они быстро выполняют локальные проверки, поэтому вам не нужно заботиться о настройках сервера. В более крупной сети вы все равно не имеете никакого влияния на настройку сервера, так как это другие команды или это аутсорсинг.
источник
Вот некоторая информация, которую я обнаружил, которая может быть ответом, который вы ищете. Обратите внимание, что упоминание ограничения в 64 КБ в отключенном режиме может быть подсказкой к аналогичным ограничениям в обычном режиме, которые не задокументированы.
Попробуйте включить «экспериментальный» режим для астрономических уровней автонастройки.
источник