Приемник ограничивает размер окна TCP до 64,512

34

Факты (пожалуйста, укажите любые ложные утверждения):

  1. У меня есть соединение 100 Мбит / с между двумя сайтами, которые находятся на расстоянии 80 мс

  2. Это длинное толстое соединение, которое может выиграть от большого размера окна TCP, возможно, до 100 Мбит / с * 0,08 сек = 1 000 000 байт

  3. Обе машины работают под управлением Windows Server 2012. «Уровень автоматической настройки окна приема» является нормальным для обеих систем. «Эвристика масштабирования окна» отключена на обоих.

  4. Я запустил «iperf -s» с одной стороны и «iperf -c» с другой. Передача произошла со скоростью 5 Мбит / с. Я получаю тот же результат в другом направлении.

  5. Обе стороны объявили о поддержке раздвижных окон TCP в своих SYN.

  6. Получатель запросил размер окна TCP 64,512 байт (0xFC00) в течение всего цикла со значением масштаба окна TCP «без сдвига» (0x000).

  7. Сеть смогла обработать окно большего размера (см. Схемы последовательности ниже)

  8. Приемник держал окно меньше, чем поддерживает сеть

  9. Это соединение происходит в 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 введите описание изображения здесь

Крис Станкевиц
источник
1
Не могли бы вы добавить точную конфигурацию - программное и аппаратное обеспечение (сетевая карта) для обеих сторон?
TomTom
1
Похоже, настройка окна ограничена .
Дэвид Шварц
@TomTom Обе машины являются виртуальными машинами внутри ESXi, работающими на HP Proliant DL380 G5. Виртуальные сетевые адаптеры Intel 82574L. Аппаратные сетевые адаптеры - BCM5719.
Крис Станкевиц
@ Дэвид Шварц "уровень автоматической настройки окна приема" является нормальным для обоих, и "эвристика масштабирования окна" отключена (см. Обновленную конфигурацию в OP). Я считаю, что это означает, что тюнинг не ограничен .
Крис Станкевиц
2
Я не думаю, что этот вопрос будет основываться на мнении, я думаю, что реальная проблема с ним в том, что правильный ответ потребует отладки систем / сетей ФП, что может сделать только он, а не мы. ,
Петер говорит восстановить Монику

Ответы:

1

Я видел это как специфичную для водителя проблему; в моем случае с сетевыми контроллерами 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 могут находиться "в канале" одновременно.)

Джейсон Уокер
источник
0

Похоже, ошибка автонастройки Windows, может быть, что-то делать с этим? https://support.microsoft.com/en-us/kb/932170

Вы пытались запросить большее значение SO_RCVBUF вручную с помощью WskControlSocket?

Фил Маккерчер
источник
Технически эти буферы не имеют отношения к размеру окна TCP: stackoverflow.com/questions/14381303/increasing-tcp-window-size
Мэри
Фил: Я использую Windows Server 2012 с обеих сторон, так что ссылка не применяется, но я подозреваю, что какая-то ошибка. Я могу запросить больший SO_RCVBUF - и это помогает - но это не помогает мне понять, что не работает (см. «Обновление 2»).
Крис Станкевиц
Мэри: буферы косвенно связаны с размером окон. Сетевой стек распознает небольшие буферы и, следовательно, не увеличивает размер окна. Я описываю это с помощью рукопожатия в «Обновлении 2».
Крис Станкевиц
0

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

user303507
источник
А большие размеры окон TCP более 65 Кбайт вредны для серверов, так как тогда увеличивается потребность в памяти для соединений. 65k может также не сделать вас достаточно счастливым.
user303507
user303507: Я хочу понять, что происходит с сетевым стеком Windows Server 2012. Меня не интересует маскировка проблемы с сетевым устройством. Но я согласен, что покупка сетевого устройства или перемещение офисов ближе друг к другу обойдут эту проблему.
Крис Станкевиц
Комментарий user303507 может быть на правильном пути. Интересно, из-за проблем с памятью окна ограничивают размер окна, основываясь на некоторых невидимых параметрах эвристики или реестра. Не то чтобы это подходящее поведение, если вы правы в документации.
Дэн Притц
0

Вот некоторая информация, которую я обнаружил, которая может быть ответом, который вы ищете. Обратите внимание, что упоминание ограничения в 64 КБ в отключенном режиме может быть подсказкой к аналогичным ограничениям в обычном режиме, которые не задокументированы.

Попробуйте включить «экспериментальный» режим для астрономических уровней автонастройки.

При настройке уровня автонастройки Windows возможны следующие настройки:

  • normal: значение по умолчанию, позволяет окну приема увеличиваться в соответствии с большинством условий
  • disabled: использует фиксированное значение для окна приема tcp. Ограничивает до 64 КБ (ограничено до 65535).
  • очень ограниченный: позволяет окну приема расти вне его значения по умолчанию, очень консервативно
  • ограничения: несколько ограниченный рост окна приема tcp за пределы значения по умолчанию
  • экспериментальный: позволяет увеличить окно приема в соответствии с экстремальными сценариями (не рекомендуется, он может ухудшить производительность в обычных сценариях, предназначен только для исследовательских целей. Он допускает значения RWIN более 16 МБ)
Земля
источник
Это имело бы смысл, но ОП показывает, что он ограничен на 64k, даже на 1024.
Джим Б.