Приймач обмежує розмір вікна 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 байт в обох напрямках.

Питання

  • Чому приймач тримає вікно невеликим?

Невідповіді

  • Мережа зламана

    Машини Linux, що працюють в одній мережі, відкривають вікно TCP на 1,5 мегабайт і передають дані в 6 разів більше пропускної здатності

  • Увімкнено евристику масштабування вікон

    Евристика масштабування вікон вимкнена (див. Вихід "евристики інтерфейсу tcp show show heuristics")

  • Рівень автоматичної настройки вікна отримання не є нормальним

    Рівень автоматичної настройки вікна прийому є нормальним (див. Вихід "netsh interface tcp show global" нижче)

  • Це просто не працює на віртуальній машині в ESXi

    Я отримую в 6 разів кращу продуктивність на віртуальній машині Linux, що працює на тому ж хості.


Оновлення 1 червня 2015 р. 16:30 PDT

Я змінив тест, поставивши linux з одного боку з'єднання. Напевно, коли Linux надсилає дані до Windows Server 2012, Windows пропонує занадто мале вікно прийому TCP (64,512 байт).

Коли я надсилаю дані з Windows до Linux, linux пропонує достатньо велике вікно прийому TCP (1,365,120 байт). Однак Windows обмежує посилання на максимум ~ 60 000 байт під час польоту.


Оновлення 2 червня 2015 р. 15:00 PDT

Крок ближче до першопричини. У моїх налаштуваннях не встановлено ані SO_SNDBUF, ані SO_RCVBUF (iperf). Це буфери відправки та прийому, які ефективно обмежують вікно отримання. Якщо не вказувати ці значення, Windows Server 2012 надає значення за замовчуванням 64 кБ. Отже, питання зараз:

Питання

  • Якщо не вказано, чому Windows Server 2012 динамічно не збільшує SO_SNDBUF / SO_RCVBUF для розміщення довгих жирових труб, як описано в MSDN ?

Невідповіді

  • "Автоматичне налаштування" netsh winsock show "вимкнено

    Це ввімкнено.


Оновлення 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. Віртуальними адаптерами Ethernet є Intel 82574L. Апаратні адаптери Ethernet - це BCM5719.
Кріс Станкевіц

@David Schwartz "рівень автоматичної настройки вікна" є нормальним для обох, і "евристика масштабування вікон" відключена (див. Оновлений конфігурацію в ОП). Я вважаю, що це вказує на те, що настройка не обмежена .
Кріс Станкевіц

2
Я не думаю, що це питання буде ґрунтуватися на думці, я вважаю, що справжня проблема, пов'язана з тим, що для отримання гарної відповіді вимагатиме налагодження систем / мереж ОП, що може зробити тільки він, а не ми .
Peterh каже відновити Моніку

Відповіді:


1

Я бачив це як проблему, пов'язану з водієм; в моєму випадку з мережевими контролерами QLogic, які намагалися використовувати TCPChimney. Це посилання описує функцію TCPChimney, додану в Windows 2008, але я впевнений, що вона все ще застосовується: https://support.microsoft.com/en-us/kb/951037

Я рекомендую протестувати наступне, для того, щоб; після кожного тесту перезавантажте і подивіться, чи починає приймач збільшувати TCP RWIN, як очікувалося.

1) Завантажте на комп’ютер, що приймає, останні версії драйверів мережевого адаптера. 1) Вимкнути TCPCimim на приймальному комп'ютері 2) Вимкнути все завантаження "TCP Receive". Це можна знайти в розширених налаштуваннях властивостей мережевого адаптера (ту саму область, де було б встановлено швидкість і дуплекс) 3) вимкнути все розвантаження "TCP Send" (також у додаткових властивостях мережевого адаптера)

(І всупереч коментарю "І великі розміри вікон TCP понад 65 кб погані для серверів, оскільки тоді попит на пам'ять на з'єднання збільшується. 65k тільки не може зробити вас достатньо щасливим. - user303507 6 серпня 15:15 о 11:30", великий TCP-прийом Windows не є властивим погано для сервера. У випадку високої пропускної здатності, високої затримки (наприклад, супутникові реле) потрібні великі значення 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").
Кріс Станкевіц

Мері: буфери опосередковано пов'язані з розміром Windows. Мережевий стек розпізнає невеликі буфери і, отже, не збільшуватиме розмір вікна. Я описую це за допомогою рукоділля в "Оновлення 2".
Кріс Станкевіц

0

Використовуйте мережевий оптимізатор на зразок Cisco WAAS або Riverbed. Вони роблять локальний доступ швидко, тому вам не потрібно дбати про налаштування сервера. У більшій мережі ви все одно не впливаєте на налаштування сервера, оскільки це інші команди, або це є аутсорсингом.


А великі розміри вікон TCP понад 65 кб погані для серверів, оскільки тоді попит на пам'ять на з'єднання зростає. 65k один може також не зробити вас досить щасливим.
користувач303507

user303507: Я хочу зрозуміти, що відбувається з мережевим стеком Windows Server 2012. Мені не цікаво замаскувати проблему мережевим пристроєм. Але я погоджуюся, що придбання мережевого приладу або зближення моїх офісів допоможе вирішити цю проблему.
Кріс Станкевіц

коментар user303507 може бути на правильному шляху - мені цікаво, чи викликає занепокоєння пам’ять Windows обмеження розміру вікна на основі деяких невидимих ​​евристичних параметрів або параметрів реєстру. Не те, що це правильна поведінка, якщо припустити, що ви правильно ставитесь до документації.
Dan Pritts

0

Ось деяка інформація, яку я виявив, що може бути відповіді, яку ви шукаєте. Зверніть увагу, що згадка про обмеження 64kb у відключеному режимі може бути підказкою до подібних обмежень у звичайному режимі, які не документально підтверджені.

Спробуйте ввімкнути "експериментальний" режим для астрономічних рівнів автоматичної настройки.

Під час налаштування рівня автоматичної настройки Windows можливі наступні налаштування:

  • нормальне: значення за замовчуванням, дозволяє розширювати вікно прийому для задоволення більшості умов
  • вимкнено: використовує фіксоване значення для вікна прийому tcp. Обмежує його до 64 КБ (обмежено 65535).
  • сильно обмежений: дозволяє віконці прийому зростати за значенням за замовчуванням, дуже консервативно
  • обмежено: дещо обмежений ріст вікна прийому tcp, що перевищує його за замовчуванням
  • експериментальний: дозволяє віконцю прийому розростатися для задоволення екстремальних сценаріїв (не рекомендується; це може погіршити продуктивність у загальних сценаріях, призначених лише для дослідницьких цілей. Це дає значення RWIN понад 16 Мб)

Це мало б сенс, але ОП показує, що він обмежений у 64 к, навіть не в 1024.
Джим Б
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.