Alıcı, TCP pencere boyutunu 64,512 ile sınırlıyor


34

Gerçekler (lütfen yanlış ifadeleri tanımlayın):

  1. 80 msn arayla iki site arasında 100 Mbps bağlantı var

  2. Bu, belki de 100 Mbps'ye kadar büyük bir TCP pencere boyutundan faydalanabilecek uzun süreli bir bağlantıdır * 0.08 sn = 1.000.000 bayt

  3. Her iki makine de Windows Server 2012 çalıştırıyor. Her iki tarafta da "Pencere otomatik ayarlama seviyesini al" normaldir. Her ikisinde de “Pencere ölçeklendirme sezgisi” engellenmiştir.

  4. Bir tarafta "iperf-s", diğer tarafta "iperf-c" yazdım. Transfer 5 Mbps'de gerçekleşti. Diğer yöne giden aynı sonucu alıyorum.

  5. Her iki taraf da, SYN'lerinde TCP sürgülü pencereleri için destek duyurdu.

  6. Alıcı, tüm çalışma boyunca "kaymasız" (0x000) bir TCP pencere ölçeği değeri ile birlikte 64.512 bayt (0xFC00) boyutunda bir TCP pencere boyutu istedi.

  7. Ağ daha büyük bir pencere boyutunu kullanabildi (aşağıdaki sıralama diyagramlarına bakınız)

  8. Alıcı, pencereyi ağın desteklediğinden daha küçük tuttu

  9. Bu bağlantı bir IPSEC VPN'de gerçekleşiyor. Tünel arayüzünün MTU'su her iki yönde de 1400 bayta düşürülür.

Soru

  • Alıcı neden pencereyi küçük tutuyor?

Sigara Cevapları

  • Ağ bozuldu

    Aynı ağ üzerinde çalışan Linux makineleri, TCP penceresini 1.5 megabayta açıyor ve 6 kat bant genişliğinde veri aktarıyor

  • Pencere ölçeklendirme sezgisi etkin

    Pencere ölçeklendirme sezgisi devre dışı bırakıldı (aşağıdaki "netsh interface tcp show sezgisel" çıktısına bakın)

  • Alma Penceresi Otomatik Ayarlama Seviyesi normal değil

    Pencere Alma Otomatik Ayarlama Seviyesi normal (aşağıdaki "netsh interface tcp show global" çıkışına bakın)

  • Bu sadece ESXi'deki sanal makinede iyi çalışmıyor

    Aynı ana bilgisayarda çalışan sanal linux makinede 6 kat daha iyi performans elde ediyorum.


Güncelleme 1 Haziran 12, 2015 16:30 PDT

Linux'u bağlantının bir tarafına koyarak testi değiştirdim. Tabii ki, linux Windows Server 2012'ye veri gönderdiğinde, Windows çok küçük bir TCP alma penceresi (64,512 bayt) sunar.

Windows'tan linux'a veri gönderdiğimde linux, yeterince büyük bir TCP alma penceresi (1.365.120 bayt) sunar. Ancak, Windows kısıtlamaları uçuşta maksimum ~ 60.000 bayt gönderir.


Güncelleme 2 Haziran 13, 2015 15:00 PDT

Kök nedene daha yakın bir adım. Kurulumumda ne SO_SNDBUF ne de SO_RCVBUF ayarlanmamış (iperf tarafından). Bunlar, alma penceresini etkin bir şekilde bağlayan gönderme ve alma tamponlarıdır. Bu değerleri belirlemediğinde, Windows Server 2012, varsayılan olarak 64 kB değer sağlar. Yani soru şimdi:

Soru

  • Belirtilmediğinde, Windows Server 2012 neden MSDN'de açıklandığı gibi uzun yağ borularını yerleştirmek için SO_SNDBUF / SO_RCVBUF'i dinamik olarak artırmıyor ?

Sigara cevaplar

  • "netsh winsock show autotuning" devre dışı bırakıldı

    Etkinleştirildi.


Güncelleme 3 Ağustos 24, 2015 16:00 PDT

netsh görünüşte Set-NetTCPSetting ve family ile değiştirildi. Get-NetTCPConnection, Get-NetTCPConnection ile birleştirildiğinde, bana şu ayarları sunan 'İnternet' rejiminde çalıştığımı gösteriyor:

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

Gönderen TCP Ayarları

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

Gönderen 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

Dizi grafiğinin gönderen perspektifi görüntü tanımını buraya girin

görüntü tanımını buraya girin

Alıcı TCP Ayarları

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

Alıcı 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]

Dizi grafiğinin alıcı perspektifi görüntü tanımını buraya girin görüntü tanımını buraya girin

TCP penceresi görüntü tanımını buraya girin


1
Her iki taraf için de tam yapılandırmayı (yumuşak VE donanımla ilgili) (ağ kartı) ekleyebilir misiniz?
TomTom

1
Pencere ayarlama gibi geliyor sınırlı .
David Schwartz

@TomTom Her iki makine de HP Proliant DL380 G5 üzerinde çalışan ESXi'nin içindeki VM'lerdir. Sanal ethernet adaptörleri Intel 82574L'dir. Donanım ethernet adaptörleri BCM5719'dur.
Chris Stankevitz

@David Schwartz her ikisinde de "pencere otomatik ayarlama seviyesini al" normaldir ve "pencere ölçeklendirme sezgisi" devre dışı bırakılmıştır (bkz. OP'deki güncelleştirilmiş yapılandırma). Bunun ayarın sınırlı olmadığını gösterdiğine inanıyorum .
Chris Stankevitz

2
Bu sorunun görüşe dayalı olacağını düşünmüyorum, bununla ilgili asıl sorunun, iyi bir cevap vermenin sadece tarafımızca yapılabilecek olan OP'nin sistemlerinde / ağlarında hata ayıklama gerektireceğini düşünüyorum. .
peterh Monica

Yanıtlar:


1

Bunu sürücüye özel bir konu olarak gördüm; benim durumumda TCPChimney'i kullanmaya çalışan QLogic ağ denetleyicileri. Bu bağlantı, Windows 2008'de eklenen TCPChimney işlevselliğini açıklamaktadır - ancak hala geçerli olduğuna eminim: https://support.microsoft.com/en-us/kb/951037

Sırasıyla, aşağıdakileri test etmenizi tavsiye ederim; Her testten sonra, yeniden başlatın ve alıcının TCP RWIN'i beklendiği gibi artırmaya başlayıp başlamadığını görün.

1) Ağ bağdaştırıcısının sürücülerini en son sürümlerini alıcı bilgisayara yükleyin. 1) Alıcı bilgisayarda TCPChimney'i devre dışı bırakın 2) Tüm 'TCP Alma' boşaltımını devre dışı bırakın. Bu, Ağ Bağdaştırıcı Özellikleri'nin Gelişmiş ayarlarında bulunur (Speed ​​& Duplex'in ayarlandığı alanla aynıdır) 3) Tüm 'TCP Send' boşaltmasını devre dışı bırakın (ayrıca Ağ Bağdaştırıcısının Gelişmiş özelliklerinde)

(Ve "65k üzerindeki büyük TCP pencere boyutları sunucular için kötü, o zamanki bağlantılar için hafıza talebi artar. Yalnızca 65k yalnızca sizi yeterince mutlu etmeyebilir" - kullanıcı303507 6: 15 Ağustos 11: 30'da " büyük TCP Alma Windows, sunucu için doğal olarak kötü değildir.Yüksek bant genişliğinde, yüksek gecikmeli bağlantılarda (Uydu röleleri gibi), büyük RWIN değerleri gereklidir, böylece "boruda" daha fazla TCP verisine sahip oluruz. 3000 ms gecikmeli 600 Mbps bağlantı; yüksek bant genişlikli bağlantı yaklaşık 20 KBps ile sınırlı olacaktır, çünkü 65 KB'lık bağlanmamış TCP verisi bir kerede "boruda" olabilir.)


0

Bana Windows autotuning hata gibi görünüyor, belki bununla ilgisi var? https://support.microsoft.com/en-us/kb/932170

WskControlSocket kullanarak elle daha büyük bir SO_RCVBUF değeri talep etmeye çalıştınız mı?


Teknik olarak bu tamponların TCP Pencere boyutu ile bir ilişkisi yoktur: stackoverflow.com/questions/14381303/increasing-tcp-window-size
Mary

Phil: Windows Server 2012'yi her iki tarafta da kullanıyorum, böylece bu bağlantı geçerli değil, ancak bir tür hatadan şüpheliyim. Daha büyük bir SO_RCVBUF isteyebilirim - ve bu yardımcı olur - ama bu neyin bozulduğunu anlamama yardımcı olmaz (bkz. "Güncelleme 2").
Chris Stankevitz

Mary: Tamponlar dolaylı olarak pencerelerin büyüklüğü ile ilgilidir. Ağ yığını küçük arabellekleri tanıyacak ve sonuç olarak pencere boyutunu büyütmeyecektir. Bunu "Güncelleme 2" de elle gezinmeyi kullanarak açıklarım.
Chris Stankevitz

0

Cisco WAAS veya Riverbed gibi bir ağ iyileştirici kullanın. Yerel acks'ı hızlı yaparlar, bu nedenle sunucu ayarlarına dikkat etmeniz gerekmez. Daha büyük ağlarda, bunlar diğer takımlar olduğu veya dış kaynaklı olduğu için sunucu kurulumunda hiçbir etkisi olmaz.


Ve 65k üzerindeki büyük TCP pencere boyutları sunucular için kötüdür, bağlantıların hafızaya olan ihtiyacı artar. 65k tek başına da seni yeterince mutlu etmeyebilir.
user303507

user303507: Windows Server 2012 ağ yığınıyla neler olduğunu anlamak istiyorum. Bir ağ cihazıyla problemi maskelemekle ilgilenmiyorum. Ancak, bir ağ cihazı satın almanın veya ofislerimi birbirine yaklaştırmanın bu sorunla ilgili olarak çalışacağına katılıyorum.
Chris Stankevitz

user303507'nin yorumu doğru yolda olabilir - bellek sorununun görünmez sezgisel veya kayıt defteri ayarlarına dayanarak pencerelerin pencere boyutunu sınırlamasına neden olup olmadığını merak ediyorum. Belgelerle ilgili doğru olduğunuzu varsayarak, bu uygun bir davranış değildir.
Dan Pritts

0

İşte aradığım cevap olabilir keşfetti bazı bilgiler . Devre dışı bırakılmış modda 64kb sınırının belirtilmesinin, normal modda belgelenmeyen benzer sınırlar için bir ipucu olabileceğine dikkat edin.

Astronomik Otomatik Ayarlama seviyeleri için "deneysel" modu etkinleştirmeyi deneyin.

Windows Otomatik Ayarlama seviyesini ayarlarken olası ayarlar aşağıdaki gibidir:

  • normal: varsayılan değer, alma penceresinin çoğu koşullara uyması için büyümesini sağlar
  • devre dışı: tcp alma penceresi için sabit bir değer kullanır. 64KB ile sınırlandırılıyor (65535 ile sınırlandırılmış).
  • son derece kısıtlamalı: alıcı penceresinin varsayılan değerinin ötesinde, çok muhafazakar bir şekilde büyümesini sağlar
  • sınırlı: tcp alma penceresinin varsayılan değerinin ötesinde sınırlı bir şekilde büyümesi
  • Deneysel: Alış penceresinin aşırı senaryolara uyum sağlaması için büyümesine izin verir (önerilmez, ortak senaryolarda performansı düşürebilir, yalnızca araştırma amaçlıdır. 16 MB'ın üzerindeki RWIN değerlerine izin verir)

Bu mantıklı gelecektir ancak OP, 10k'de bile değil 64k'de kapalı olduğunu gösteriyor.
Jim B
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.