web-dev-qa-db-ja.com

レシーバーの制限TCP 64,512のウィンドウサイズ

事実(虚偽の記述があれば明記してください):

  1. 2つのサイト間に100 Mbpsの接続があり、80ミリ秒離れています。

  2. これは長いファット接続であり、TCPおそらく最大100 Mbps * 0.08秒までのウィンドウサイズ= 1,000,000バイトのメリットがあります。

  3. 両方のマシンでWindows Server 2012が実行されています。「ウィンドウ自動調整レベルの受信」はどちらでも正常です。 「ウィンドウスケーリングヒューリスティック」は両方で無効になっています。

  4. 私は一方の側で「iperf -s」を実行し、もう一方の側で「iperf -c」を実行しました。転送は5 Mbpsで行われました。他の方向でも同じ結果が得られます。

  5. 両側は、SYNのTCPスライディングウィンドウのサポートを宣伝しました。

  6. レシーバーは、実行全体でTCPウィンドウサイズ64,512バイト(0xFC00)をTCP「シフトなし」のウィンドウスケール値(0x000)で)要求しました。

  7. ネットワークはより大きなウィンドウサイズを処理できました(下のシーケンス図を参照)

  8. 受信機はウィンドウをネットワークがサポートするよりも小さく保った

  9. この接続はIPSEC VPN内で行われています。トンネルインターフェイスのMTUは、両方向で1400バイトに削減されます。

質問

  • 受信機がウィンドウを小さく保つのはなぜですか?

非回答

  • ネットワークが壊れています

    同じネットワーク上で実行されているLinuxマシンは、TCPウィンドウを1.5メガバイトに開き、6倍の帯域幅でデータを送信します

  • ウィンドウスケーリングヒューリスティックが有効になっています

    ウィンドウスケーリングヒューリスティックは無効になっています(以下の「netsh interface tcp show heuristics」の出力を参照してください)

  • 受信ウィンドウの自動調整レベルが正常ではありません

    受信ウィンドウの自動調整レベルは正常です(以下の「netsh interface tcp show global」の出力を参照してください)

  • これはESXi内の仮想マシンではうまく機能しません

    同じホスト上で実行されている仮想Linuxマシンで6倍のパフォーマンスが得られます。


更新12015年6月12日午後4時30分PDT

接続の片側にLinuxを配置することにより、テストを変更しました。案の定、LinuxがWindows Server 2012にデータを送信すると、Windowsは小さすぎるTCP受信ウィンドウ(64,512バイト))を提供します。

Windowsからlinuxにデータを送信すると、linuxは十分に大きなTCP受信ウィンドウ(1,365,120バイト)を提供します。ただし、Windowsでは送信中の送信を最大約60,000バイトに制限しています。


更新22015年6月13日午後3時PDT

根本的な原因により近いステップ。私のセットアップでは、SO_SNDBUFもSO_RCVBUFも(iperfによって)設定されていません。これらは、受信ウィンドウを効果的にバインドする送信および受信バッファです。これらの値を指定しない場合、Windows Server 2012は64 kBのデフォルト値を提供します。だから問題は今です:

質問

  • 指定されていない場合、Windows Server 2012は [〜#〜] msdn [〜#〜] で説明されているように、SO_SNDBUF/SO_RCVBUFが動的に増加して長いファットパイプに対応しないのはなぜですか?

回答なし

  • 「netsh winsock show autotuning」が無効になっています

    有効です。


更新32015年8月24日午後4時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

シーケンスグラフの送信者の視点 enter image description here

enter image description here

受信者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]

シーケンスグラフの受信側の視点 enter image description hereenter image description here

TCPウィンドウ enter image description here

34

これはドライバー固有の問題だと思っています。私の場合、TCPChimneyを使用しようとしたQLogicネットワークコントローラーを使用しています。このリンクは、Windows 2008で追加されたTCPChimney機能について説明していますが、それでもまだ適用できると確信しています: https://support.Microsoft.com/en-us/kb/951037

以下を順番にテストすることをお勧めします。各テストの後、再起動して、レシーバーが期待どおりにTCP RWINを増やし始めているかどうかを確認します。

1)ネットワークアダプターのドライバーの最新バージョンを受信コンピューターにロードします。 1)受信側コンピューターでTCPChimneyを無効にします。2)すべての「TCP受信」オフロードを無効にします。これは、ネットワークアダプターのプロパティの[詳細設定]にあります([速度と二重通信]が設定されるのと同じ領域)3)すべての「TCP送信」オフロードを無効にします(ネットワークアダプターの詳細プロパティでも同様)

(そして、コメントに反して、「接続のメモリ需要が増加するため、65kを超えるウィンドウサイズTCPウィンドウサイズはサーバーにとって不適切です。65kだけでは十分ではない場合もあります。– user303507 Aug 6 '15 at 11:30 "、ラージTCP受信ウィンドウはサーバーにとって本質的に悪いものではありません。高帯域幅、高レイテンシリンク(サテライトリレーなど)の場合、ラージRWINより多くのTCPデータが「パイプ」にある)ために値が必要です。3000ミリ秒のレイテンシで600 Mbps接続を想像してください。高帯域幅リンクは約20 KBpsに制限されます。 65 KBの未確認のTCPデータは一度に「パイプ内」にある可能性があります。)

1
Jason Walker

ここに いくつかの情報があります 私はあなたが探している答えであるかもしれないことを発見しました。無効モードでの64kb制限についての言及は、文書化されていない通常モードでの同様の制限の手掛かりになる可能性があることに注意してください。

天文学的な自動調整レベルに対して「実験的」モードを有効にしてみてください。

Windows自動調整レベルを設定する場合、可能な設定は次のとおりです。

  • 通常:デフォルト値、ほとんどの条件に対応するために受信ウィンドウを拡大できます
  • 無効:tcp受信ウィンドウに固定値を使用します。 64KBに制限します(65535に制限されます)。
  • 非常に制限されています:受信ウィンドウがデフォルト値を超えて非常に控えめに拡大できます
  • 制限:デフォルト値を超えたtcp受信ウィンドウの増加がやや制限されています
  • 試験的:極端なシナリオに対応するために受信ウィンドウを拡大できるようにする(推奨されません。一般的なシナリオではパフォーマンスを低下させる可能性があり、研究目的のみを目的としています。16MBを超えるRWIN値を有効にします)
0
Aland

Cisco WAASやRiverbedなどのネットワークオプティマイザーを使用します。ローカルACKをすばやく行うため、サーバー設定を気にする必要はありません。より大きなネットワークでは、これらは他のチームであるか、これが外部委託されているため、サーバーのセットアップに影響を与えることはありません。

0
user303507

私には、Windowsの自動チューニングのバグのように見えますが、おそらくこれに何か関係がありますか? https://support.Microsoft.com/en-us/kb/93217

WskControlSocketを使用して、より大きなSO_RCVBUF値を手動でリクエストしてみましたか?

0