Windows TCP Window Scalingプラトーが早すぎる


50

シナリオ:多数のWindowsクライアントが、大規模なファイル(FTP / SVN / HTTP PUT / SCP)を約100〜160ms離れたLinuxサーバーに定期的にアップロードしています。オフィスには1Gbit / sの同期帯域幅があり、サーバーはAWSインスタンスであるか、米国DCで物理的にホストされています。

最初のレポートは、新しいサーバーインスタンスへのアップロードが、可能な限りはるかに遅いというものでした。これは、テストと複数の場所で発生しました。クライアントは、Windowsシステムからホストへの安定した2-5Mbit / sを確認していました。

私はiperf -s、AWSインスタンスで、次にオフィスのWindowsクライアントから始めました。

iperf -c 1.2.3.4

[  5] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 55185
[  5]  0.0-10.0 sec  6.55 MBytes  5.48 Mbits/sec

iperf -w1M -c 1.2.3.4

[  4] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 55239
[  4]  0.0-18.3 sec   196 MBytes  89.6 Mbits/sec

後者の数値は、その後のテスト(Vagaries of AWS)で大幅に変化する可能性がありますが、通常は70〜130Mbit / sであり、ニーズを十分に満たしています。セッションをWiresharkingすると、次のことがわかります。

  • iperf -c Windows SYN-ウィンドウ64kb、スケール1-Linux SYN、ACK:ウィンドウ14kb、スケール:9(* 512) デフォルトの64kbウィンドウでのiperfウィンドウのスケーリング
  • iperf -c -w1M Windows SYN-Windows 64kb、スケール1-Linux SYN、ACK:ウィンドウ14kb、スケール:9 デフォルトの1MBウィンドウでのiperfウィンドウのスケーリング

リンクがこの高いスループットを維持できることは明らかですが、ウィンドウサイズを明示的に設定して使用する必要がありますが、実際のアプリケーションではほとんどできません。TCPハンドシェイクはそれぞれの場合に同じ開始点を使用しますが、強制されたものはスケーリングします

逆に、同じネットワーク上のLinuxクライアントからiperf -c(システムのデフォルト85kbを使用して)ストレートに:

[  5] local 10.169.40.14 port 5001 connected with 1.2.3.4 port 33263
[  5]  0.0-10.8 sec   142 MBytes   110 Mbits/sec

強制なしで、期待どおりに拡張します。これは、介在するホップやローカルのスイッチ/ルーターに存在するものではなく、Windows 7と8のクライアントにも同様に影響するようです。自動チューニングに関する多くのガイドを読みましたが、これらは通常、スケーリングを完全に無効にして、ひどいホームネットワーキングキットを回避することに関するものです。

誰がここで何が起こっているのか教えてくれて、それを修正する方法を教えてもらえますか?(できれば、GPOを介してレジストリに固執することができます。)

ノート

問題のAWS Linuxインスタンスには、次のカーネル設定が適用されていsysctl.confます:

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.ipv4.tcp_rmem = 4096 1048576 16777216
net.ipv4.tcp_wmem = 4096 1048576 16777216

サーバーエンドでdd if=/dev/zero | ncリダイレクトを使用し/dev/nullて、iperf他の可能性のあるボトルネックを除外および削除しましたが、結果はほぼ同じです。用いた試験ncftp(Cygwinの、ネイティブのWindows、Linux)のそれぞれのプラットフォーム上で上記iperfのテストとほぼ同じ方法で、スケール。

編集

ここで、関連する可能性のある別の一貫したものを見つけました。 ここに画像の説明を入力してください

これは1MBキャプチャの最初の1秒で、ズームインされています。ウィンドウが拡大し、バッファーが大きくなると、スロースタートの動作を確認できます。デフォルトのウィンドウiperfテストが完全に平坦化する時点で、まさにこの0.2秒の小さなプラトーがあります。もちろん、これはめまいがするほどの高さにスケーリングしますが、スケーリングする前にスケーリングにこの一時停止があることは興味深いです(値は1022バイト* 512 = 523264です)。

更新-6月30日。

さまざまな回答のフォローアップ:

  • CTCPの有効化-これは違いはありません。ウィンドウのスケーリングは同じです。(これを正しく理解している場合、この設定により、輻輳ウィンドウが到達できる最大サイズではなく、拡大される割合が増加します)
  • TCPタイムスタンプを有効にします。-ここでも変更はありません。
  • Nagleのアルゴリズム-それは理にかなっており、少なくとも問題の兆候としてグラフ内の特定のブリップをおそらく無視できることを意味します。
  • pcapファイル:Zipファイルはこちらから入手できます:https ://www.dropbox.com/s/104qdysmk01lnf6/iperf-pcaps-10s-Win%2BLinux-2014-06-30.zip(bittwisteと匿名、150MBに抽出されます)比較のために各OSクライアントから1つ)

更新2-6月30日

O、カイルの提案の操作に従って、ctcpを有効にし、煙突オフロードを無効にしました:TCPグローバルパラメータ

----------------------------------------------
Receive-Side Scaling State          : enabled
Chimney Offload State               : disabled
NetDMA State                        : enabled
Direct Cache Acess (DCA)            : disabled
Receive Window Auto-Tuning Level    : normal
Add-On Congestion Control Provider  : ctcp
ECN Capability                      : disabled
RFC 1323 Timestamps                 : enabled
Initial RTO                         : 3000
Non Sack Rtt Resiliency             : disabled

しかし、悲しいことに、スループットに変化はありません。

ただし、ここには原因/結果に関する質問があります。グラフは、サーバーからクライアントへのACKに設定されたRWIN値のものです。Windowsクライアントでは、クライアントの制限されたCWINがそのバッファーでさえも満たされないため、Linuxはこの値をその下限を超えてスケ​​ーリングしないと思いますか?Linuxが人為的にRWINを制限している他の理由はありますか?

注:私はECNを有効にすることを試みました。変化はありません

更新3-6月31日。

ヒューリスティックおよびRWIN自動調整を無効にしても、変更はありません。デバイスマネージャータブを介して機能調整を公開するソフトウェアを使用して、Intelネットワークドライバーを最新(12.10.28.0)に更新しました。カードは82579VチップセットオンボードNICです-(realtekまたは他のベンダーのクライアントからさらにテストを行います)

しばらくNICに注目して、次のことを試しました(ほとんどの場合、ありそうもない犯人を除外します)。

  • 受信バッファーを256から2kに増やし、送信バッファーを512から2kに増やします(両方とも最大)-変更なし
  • すべてのIP / TCP / UDPチェックサムオフロードを無効にしました。- 変化なし。
  • 大量送信オフロードの無効化-Nada。
  • IPv6、QoSスケジューリングをオフにしました-Nowt。

更新3-7月3日

Linuxサーバー側を排除しようとして、Server 2012R2インスタンスを起動し、iperf(cygwin binary)とNTttcpを使用してテストを繰り返しました。

iperf、私は明示的に指定する必要がありました-w1m上で、両方の接続が〜5Mbit / sのを超える規模となる前に両側。(ちなみに、私はチェックすることができ、91msのレイテンシで〜5MbitsのBDPはほぼ正確に64kbです。限界を見つけてください...)

ntttcpバイナリはそのような制限を示しました。ntttcpr -m 1,0,1.2.3.5サーバーとntttcp -s -m 1,0,1.2.3.5 -t 10クライアントで使用すると、スループットが大幅に向上します。

Copyright Version 5.28
Network activity progressing...


Thread  Time(s) Throughput(KB/s) Avg B / Compl
======  ======= ================ =============
     0    9.990         8155.355     65536.000

#####  Totals:  #####

   Bytes(MEG)    realtime(s) Avg Frame Size Throughput(MB/s)
================ =========== ============== ================
       79.562500      10.001       1442.556            7.955

Throughput(Buffers/s) Cycles/Byte       Buffers
===================== =========== =============
              127.287     308.256      1273.000

DPCs(count/s) Pkts(num/DPC)   Intr(count/s) Pkts(num/intr)
============= ============= =============== ==============
     1868.713         0.785        9336.366          0.157

Packets Sent Packets Received Retransmits Errors Avg. CPU %
============ ================ =========== ====== ==========
       57833            14664           0      0      9.476

8MB / sは、明示的に大きなウィンドウで取得するレベルでそれを上げますiperf。奇妙なことに、1273個のバッファーで80MB = 64kBのバッファーを再び使用します。さらなるWiresharkは、クライアントが満足しているように見える、サーバー(スケールファクター256)から戻ってくる良い可変RWINを示しています。したがって、おそらくntttcpは送信ウィンドウを誤って報告しています。

更新4-7月3日

@karyheadのリクエストで、ここでhttps://www.dropbox.com/s/dtlvy1vi46x75it/iperf%2Bntttcp%2Bftp-pcaps-2014-07-03.zipでさらにテストを行い、いくつかのキャプチャを生成しました

  • iperfWindowsから以前と同じLinuxサーバーへの2つの追加(1.2.3.4):1つは128kソケットサイズでデフォルトの64kウィンドウ(再び〜5Mbit / sに制限されます)と1MBが送信ウィンドウでデフォルトが8kbソケットですサイズ。(より高いスケール)
  • ntttcp同じWindowsクライアントからServer 2012R2 EC2インスタンス(1.2.3.5)への1つのトレース。ここでは、スループットが適切にスケーリングされます。注:NTttcpは、テスト接続を開く前にポート6001で奇妙なことを行います。そこで何が起こっているのか分かりません。
  • /dev/urandomCygwinを使用して、ほぼ同一のLinuxホスト(1.2.3.6)に20MBをアップロードする1つのFTPデータトレースncftp。再び制限があります。パターンは、Windows Filezillaを使用した場合とほぼ同じです。

iperfバッファの長さを変更すると、時系列グラフに予想される差が生じますが(よ​​り多くの垂直セクション)、実際のスループットは変わりません。


11
明らかに文書化されていない、よく研究された問題のまれな例。ニース-誰かが解決策を見つけることを望みましょう(どういうわけか私もそれを使えると思うからです)。
トムトム14年

2
Linuxではデフォルトで有効になっていますが、RFC 1323タイムスタンプはWindowsではデフォルトで無効になっているため、有効にしてみてください)。netsh int tcp set global timestamps=enabled
ブライアン14年

3
200ミリ秒の遅延は、おそらく動作中のNagleアルゴリズムです。特定の接続でTCPがデータを受信すると、次の条件のいずれかに該当する場合にのみ、確認応答が返されます。セグメントは受信されますが、その接続では200ミリ秒以内に他のセグメントは到着しません。
グレッグアスキュー14年

2
遅い送信者の1人からのパケットキャプチャをどこかに置く可能性はありますか?
カイルブラント14年

これらのテストの結果と代表的なキャプチャファイルへのリンクでOPを更新しました。
SmallClanger 14年

回答:


15

Windows 7/8クライアントで複合TCP(CTCP)を有効にしてみましたか。

読んでください:

高BDP伝送の送信側のパフォーマンスの向上

http://technet.microsoft.com/en-us/magazine/2007.01.cableguy.aspx

...

これらのアルゴリズムは、小さなBDPと小さな受信ウィンドウサイズに適しています。ただし、受信ウィンドウサイズが大きく、BDPが大きいTCP接続を使用している場合(100ミリ秒の往復時間で高速WANリンクにある2つのサーバー間でデータを複製するなど)、これらのアルゴリズムは送信ウィンドウを増加させません接続の帯域幅を完全に利用するのに十分速い

これらの状況でTCP接続の帯域幅をより有効に活用するために、次世代のTCP / IPスタックには複合TCP(CTCP)が含まれています。CTCPは 、大きな受信ウィンドウサイズとBDPを持つ接続の送信ウィンドウをより積極的に増加させます。CTCPは、遅延の変動と損失を監視することにより、これらのタイプの接続のスループットを最大化しようとします。さらに、CTCPは、その動作が他のTCP接続に悪影響を与えないようにします。

...

CTCPは、Windows Server 2008を実行しているコンピューターではデフォルトで有効になっており、Windows Vistaを実行しているコンピューターではデフォルトで無効になっています。netsh interface tcp set global congestionprovider=ctcpコマンドでCTCPを有効にできます。netsh interface tcp set global congestionprovider=noneコマンドでCTCPを無効にできます。

編集6/30/2014

CTCPが本当に「オン」であるかどうかを確認する

> netsh int tcp show global

すなわち

ここに画像の説明を入力してください

POは言った:

これを正しく理解している場合、この設定により 、輻輳ウィンドウが拡大 できる速度が、到達可能な最大サイズではなく増加します

CTCPは送信ウィンドウを積極的に増加させます

http://technet.microsoft.com/en-us/library/bb878127.aspx

複合TCP

送信TCPピアがネットワークを圧倒するのを防ぐ既存のアルゴリズムは、スロースタートおよび輻輳回避と呼ばれます。これらのアルゴリズムは、最初に接続でデータを送信するとき、および失われたセグメントから回復するときに、送信ウィンドウと呼ばれる送信者が送信できるセグメントの量を増やします。スロースタートは、受信した各肯定応答セグメント(Windows XPおよびWindows Server 2003のTCPの場合)または肯定応答した各セグメント(Windows VistaおよびWindows Server 2008のTCPの場合)のいずれかの完全なTCPセグメントごとに送信ウィンドウを増やします。輻輳回避は、確認されたデータのフルウィンドウごとに1つのフルTCPセグメントだけ送信ウィンドウを増やします。

これらのアルゴリズムは、LANメディアの速度と小さいTCPウィンドウサイズに適しています。ただし、受信ウィンドウサイズが大きく、帯域幅遅延製品(高帯域幅および高遅延)が大きいTCP接続がある場合(100ミリ秒のラウンドトリップで高速WANリンクを介して配置された2つのサーバー間でデータを複製する場合など)時間が経過しても、これらのアルゴリズムは、接続の帯域幅を完全に利用するのに十分な速さで送信ウィンドウを増加させません。たとえば、100ミリ秒の往復時間(RTT)を持つ1ギガビット/秒(Gbps)のWANリンクでは、送信ウィンドウが最初に受信者によってアドバタイズされる大きなウィンドウサイズまで増加するのに最大1時間かかることが あります。失われたセグメントがある場合に回復する

これらの状況でTCP接続の帯域幅をより有効に活用するために、次世代のTCP / IPスタックには複合TCP (CTCP)が含まれています。CTCPは、受信ウィンドウサイズが大きく、帯域幅遅延製品が大きい接続の送信ウィンドウをより積極的に増加させます。CTCPは遅延変化と損失をモニターすることによってこれらのタイプの接続でスループットを最大にするのを試みます。CTCPは、その動作が他のTCP接続に悪影響を与えないことも保証します。

マイクロソフトで社内で実施されたテストでは、50ミリ秒のRTTを使用した1 Gbps接続の場合、大きなファイルのバックアップ時間がほぼ半分に短縮されました。帯域幅遅延積が大きい接続ほど、パフォーマンスが向上する可能性があります。CTCPと受信ウィンドウの自動調整は連携してリンク使用率を向上させ、帯域幅遅延の大きい製品接続のパフォーマンスを大幅に向上させることができます。


3
この答えを補完するように、Server 2012 / Win8.1で同等のPowershellはSet-NetTCPSetting-CongestionProviderCCTP、DCTCP、およびDefaultを受け入れるパラメーターを備えています。Windowsクライアントとサーバーは、異なるデフォルトの輻輳プロバイダーを使用します。technet.microsoft.com/en-us/library/hh826132.aspx
ライアンリース14年

私はあなたが何を得ているかわかりますが、それは当てはまらないようです。それのために、私は30分間走りましたがiperf、ウィンドウはまだ〜520kbを超えてスケ​​ーリングしませんでした。この積極的なアルゴリズムが利点を示す前に、他の何かがCWNDを制限しています。
SmallClanger 14年

非HTMLプロトコルを送信するときにこの種の問題を提示した古い(すでに修正済みの)Vistaバグがあります。HTMLで同じファイルを転送する場合、またはFTPで言う場合、問題はまったく同じに見えますか?
パット

@Pat-します。SVNコミット(HTTPとHTTPS経由)およびAWS上の別のシステムへのFTP転送にも同じ制限があります。
SmallClanger 14

Winクライアントのファイアウォールはどうですか?ファイアウォールを完全にオフにしてテストできますか?こちらをご覧ください:ask.wireshark.org/questions/2365/tcp-window-size-and-scaling
パット

12

問題の明確化:

TCPには2つのウィンドウがあります。

  • 受信ウィンドウ:バッファーに残っているバイト数。これは、レシーバーによって課されるフロー制御です。Wiresharkの受信ウィンドウのサイズは、TCPヘッダー内のウィンドウサイズとウィンドウスケーリング係数で構成されているため、確認できます。TCP接続の両側が受信ウィンドウをアドバタイズしますが、一般的に重要なのはデータの大部分を受信する側です。あなたの場合、クライアントはサーバーにアップロードしているため、「サーバー」です。
  • 輻輳ウィンドウ。これは、送信者によって課されるフロー制御です。これはオペレーティングシステムによって維持され、TCPヘッダーには表示されません。データの送信速度を制御します。

指定したキャプチャファイルで。受信バッファがオーバーフローしないことがわかります。

ここに画像の説明を入力してください

私の分析では、送信ウィンドウ(輻輳制御ウィンドウ)が受信者のRWINを満たすのに十分に開かれていないため、送信者が十分に速く送信していないということです。つまり、受信者は「Give me More」と言い、Windowsが送信者の場合、十分な速度で送信していません。

これは、上記のグラフではRWINが開いたままであり、ラウンドトリップ時間が.09秒でRWINが〜500,000バイトであるという事実によって証明されます。帯域幅遅延積に応じた最大スループットは(500000 /0.09)* 8 =〜42 Mbit / s(Linuxキャプチャの獲得で約5しか得られません)。

修正方法

知りません。interface tcp set global congestionprovider=ctcp送信ウィンドウ(輻輳ウィンドウの別の用語)が増加するため、私にとって正しいことのように聞こえます。あなたはそれが機能していないと言いました。念のため:

  1. これを有効にした後、再起動しましたか?
  2. 煙突オフロードはオンですか?もしそうなら、実験としてそれをオフにしてみてください。これを有効にすると何がオフロードされるのか正確にはわかりませんが、送信ウィンドウの制御がそれらの1つである場合、輻輳プロバイダーが有効になっている場合はおそらく混雑プロバイダーは効果がありません...ただ推測しています...
  3. また、これはpre windows 7かもしれませんが、HKEY_LOCAL_MACHINE-System-CurrentControlSet-Services-AFD-ParametersにあるDefaultSendWindowとDefaultReceiveWindowという2つのレジストリキーを追加して試してみることもできます。これらが機能する場合でも、おそらくctcpがオフになっているはずです。
  4. さらに別の推測、チェックアウトしてみてくださいnetsh interface tcp show heuristics。私はそれがRWINかもしれないと思うが、それは言っていないので、多分それが送信ウィンドウに影響を与える場合にはそれを無効/有効にして遊んでください。
  5. また、テストクライアントでドライバーが最新であることを確認してください。たぶん何かが壊れています。

ネットワークドライバーが何かの書き換え/変更を行っている可能性を排除するために、すべてのオフロード機能をオフにしてこれらのすべての実験を試みます(オフロードが無効になっている間はCPUを監視します)。TCP_OFFLOAD_STATE_DELEGATED構造体は、少なくともCWndのオフロードが少なくとも可能であることを意味しているようです。


2
あなたの「答え」はあなたの答えではないので報告しました。私はすぐに投票権を取りました。今私はあなたの「無応答」をアップ投票方法を「人々 」を参照してください...本当に面白い
パット

1
@Pat:投票数をクリックすると、Upvotes / Downvotesの内訳が表示されます。現在、あなたはあなたの答えに下票を持っていません。私の答えは彼の問題を解決しませんが(まだ答えはありません)、トラブルシューティングの重要なステップである問題を説明し、ローカライズします(できれば正しく!)。
カイルブラント14

@ Kyle Brandtがあなたのものを受け入れたら答えではないのですが、なぜそれが「自動的に」それ以上の考慮なしに削除されないのでしょうか?そしてあなたは間違っています。あなたの「答え」を報告したのと同じように、「すぐに」下票を獲得しました。まだ削除されていません。ここでは「特別な」ルールでプレイしているようです。
パット

1
@Patそれが役立つ場合、カイルの非回答は信じられないほど役に立ちました。どのバッファーが制限されているかについての明確な考えが得られ、その結果、適切なソリューションに少し近づいたと感じています。このような質問は、少しの賢明な編集で適切なQおよび適切なAになることができる共同作業である場合があります。
SmallClanger 14

@SmallClangerはすべての敬意を持って、SFにはカイルブラントを含むすべてのユーザーが従うべき一連のルールがあります。彼が答えではない場合、「モデレーター」クラブに何人の友人がいても、コメントとして消去または移動する必要があります。
パット

5

@Patと@Kyleによる素晴らしい情報がここにあります。TCPの送受信ウィンドウに関する @Kyleの説明に間違いなく注意を払ってください。さらに問題を混乱させるために、iperfは「TCPウィンドウ」-wという用語を、受信、送信、または全体的なスライドウィンドウに関して曖昧な用語の一種である設定と使用します。実際に行うのは、-c(クライアント)インスタンスのソケット送信バッファーと(サーバー)インスタンスのソケット受信バッファーを設定すること-sです。でsrc/tcp_window_size.c

if ( !inSend ) {
    /* receive buffer -- set
     * note: results are verified after connect() or listen(),
     * since some OS's don't show the corrected value until then. */
    newTCPWin = inTCPWin;
    rc = setsockopt( inSock, SOL_SOCKET, SO_RCVBUF,
                     (char*) &newTCPWin, sizeof( newTCPWin ));
} else {
    /* send buffer -- set
     * note: results are verified after connect() or listen(),
     * since some OS's don't show the corrected value until then. */
    newTCPWin = inTCPWin;
    rc = setsockopt( inSock, SOL_SOCKET, SO_SNDBUF,
                     (char*) &newTCPWin, sizeof( newTCPWin ));
}

Kyleが述べているように、この問題はLinuxボックスの受信ウィンドウにはありませんが、送信者は送信ウィンドウを十分に開いていません。十分に速く開かないということではなく、64kの上限になります。

Windows 7のデフォルトのソケットバッファーサイズは64kです。ここに、MSDNのスループットに関連するソケットバッファーサイズに関するドキュメントの記述があります

Windowsソケットを使用してTCP接続経由でデータを送信する場合、最高のスループットを達成するために、TCPで十分な量のデータを送信済み(送信済みだが未確認)に保つことが重要です。TCP接続の最適なスループットを実現するための未処理のデータ量の理想値は、理想送信バックログ(ISB)サイズと呼ばれます。ISB値は、TCP接続と受信側のアドバタイズされた受信ウィンドウの帯域幅遅延積の関数です(一部はネットワークの輻輳の量)。

さて、何とか何とか、今ここに行きます:

一度に1つのブロックまたは非ブロック送信要求を実行するアプリケーションは、通常、まともなスループットを達成するためにWinsockによる内部送信バッファリングに依存しています。特定の接続の送信バッファ制限は、SO_SNDBUFソケットオプションによって制御されます。ブロッキングおよびノンブロッキング送信メソッドの場合、送信バッファーの制限により、TCPで未処理のまま保持されるデータの量が決まります。接続のISB値が送信バッファーの制限よりも大きい場合、接続で達成されるスループットは最適ではありません。

64kウィンドウを使用した最新のiperfテストの平均スループットは5.8Mbpsです。これはWiresharkの[統計]> [サマリー]にあり、すべてのビットをカウントします。おそらく、iperfは5.7MbpsのTCPデータスループットをカウントしています。FTPテストでも〜5.6Mbpsと同じパフォーマンスが見られます。

64k送信バッファと91ms RTTの理論上のスループットは、... 5.5Mbpsです。私に十分近い。

1MBウィンドウのiperfテストを見ると、tputは88.2Mbps(TCPデータだけで86.2Mbps)です。1MBウィンドウの理論上のtputは87.9Mbpsです。繰り返しますが、政府の仕事に十分な距離を置いてください。

これが示すことは、送信ソケットバッファが送信ウィンドウを直接制御し、反対側からの受信ウィンドウと組み合わせてスループットを制御することです。アドバタイズされた受信ウィンドウには空きがあるため、受信者に制限されません。

ちょっと待って、この自動調整ビジネスはどうですか?Windows 7はそのようなものを自動的に処理しませんか?前述したように、Windowsは受信ウィンドウの自動スケーリングを処理しますが、送信バッファーも動的に処理できます。MSDNページに戻りましょう。

TCPの動的送信バッファリングは、Windows 7およびWindows Server 2008 R2で追加されました。デフォルトでは、アプリケーションがストリームソケットでSO_SNDBUFソケットオプションを設定しない限り、TCPの動的送信バッファリングが有効になっています。

iperfはオプションの使用SO_SNDBUF時に使用する-wため、動的送信バッファリングは無効になります。ただし、使用しない場合は使用-wしませんSO_SNDBUF。動的送信バッファリングはデフォルトでオンになっているはずですが、次を確認できます。

netsh winsock show autotuning

ドキュメントには、次の方法で無効にできると書かれています:

netsh winsock set autotuning off

しかし、それは私にはうまくいきませんでした。レジストリを変更し、これを0に設定する必要がありました。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AFD\Parameters\DynamicSendBufferDisable

これを無効にすることは役に立たないと思います。それは単なる参考です。

受信ウィンドウに十分なスペースがあるLinuxボックスにデータを送信するときに、送信バッファーがデフォルトの64kを超えてスケ​​ーリングしないのはなぜですか?いい質問ですね。Linuxカーネルには、自動調整TCPスタックもあります。T-PainとKanyeが一緒にオートチューンデュエットを行うように、音が良くないかもしれません。おそらく、これら2つの自動調整TCPスタックが相互に通信していることに何らかの問題があります。

別の人があなたと同じような問題を抱えていて、レジストリを編集してデフォルトの送信バッファサイズを増やすことで修正できました。残念ながら、それはもう機能しないようです。少なくとも、私が試してみたときはうまくいきませんでした。

この時点で、制限要因はWindowsホストの送信バッファサイズであることは明らかだと思います。動的に適切に成長していないように思える場合、女の子はどうすればいいですか?

あなたはできる:

  • 送信バッファー(ウィンドウオプション)を設定できるアプリケーションを使用します
  • ローカルLinuxプロキシを使用する
  • リモートWindowsプロキシを使用しますか?
  • Microsofhahahahahahahahaでケースを開く
  • ビール

免責事項:私はこれを研究するのに多くの時間を費やしました、そして、それは私の知識とgoogle-fuの最高に正しいです。しかし、私は母の墓に誓うことはありません(彼女はまだ生きています)。


幻想的な入力; ありがとうございました。私はiperf 2.0.4を使用していますが、設定を試して、新しい上限でOPを更新します。
SmallClanger

[OK]を、私はより多くの研究と最近のテストに基づいて、私の「答え」を更新しました
karyhead

ありがとう。少なくとも部分的には、私がただ怒っているだけではないことを知ってうれしいです。これらのレジストリ設定を推奨するXP / 2003時代のブログ/スレッドをいくつか読んだことがありますが、それらはVista / 2008より前に作成されたものであり、Vista以降では無視されます。私は実際にこれについてMSにチケットを上げると思います(幸運を祈ります)
SmallClanger 14

1
私の研究で出会った便利なツールは、SDKのtcpanalyzer.exe(microsoft.com/en-us/download/details.aspx?id=8279)でした。個々の接続を選択し、RTT、cwnd、再送信などのTCP統計を取得できるグラフィカルなnetstatです。送信バッファサイズを超えてcwndを開くことができますが、tputは増加せず、wiresharkが検証されましたまだ送信バッファが制限されていること。
karyhead 14

1
7/8で宣伝されているように機能しない「netsh」コマンド、および対応するレジストリエントリを手動で入力せざるを得ない人々に関するコメントをいくつかのフォーラムで見つけました。CTCPオプションでそのようなことが起こっているのではないかと思います。
パット

4

TCPスタックを調整しても、Winsockレイヤーにボトルネックが残っている可能性があります。Winsock(レジストリの補助機能ドライバー)を構成すると、Windows 7でのアップロード速度(サーバーへのデータのプッシュ)に大きな違いが生じることがわかりました。ブラウザが使用するソケットの種類;-)

DefaultSendWindowのDWORDキーを追加し、BDP以上に設定します。256000を使用しています。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\AFD\Parameters\DefaultSendWindow

ダウンロード用のWinsock設定を変更すると役立つ場合があります-DefaultReceiveWindowのキーを追加します。

Fiddler Proxyとコマンドを使用して、クライアントとサーバーのソケットバッファーサイズを調整することにより、さまざまなソケットレベル設定を試すことができます。

prefs set fiddler.network.sockets.Server_SO_SNDBUF 65536 

fiddler.network.sockets.Client_SO_SNDBUF
fiddler.network.sockets.Client_SO_RCVBUF
fiddler.network.sockets.Server_SO_SNDBUF
fiddler.network.sockets.Server_SO_RCVBUF

すばらしい追加情報。MSバグの参照リンクはありますか?
SmallClanger

3

答えのすべての分析を読んだので、この問題は、Windows 7 / 2008R2 aka Windows 6.1を実行しているように思えます

Windows 6.1のネットワークスタック(TCP / IPとWinsock)にはひどく欠陥があり、6.1の最初のリリース以降、Microsoftが最終的に修正プログラムの長年にわたって対処したバグとパフォーマンスの問題が多数ありました。

これらの修正プログラムを適用する最良の方法は、support.microsoft.comのすべての関連ページを手動でふるいにかけ、ネットワークスタック修正プログラムのLDRバージョンを手動で要求してダウンロードすることです(これらは多数あります)。

関連する修正プログラムを見つけるには、次の検索クエリでwww.bing.comを使用する必要があります site:support.microsoft.com 6.1.7601 tcpip.sys

また、Windows 6.1でLDR / GDRホットフィックストレインがどのように機能するかを理解する必要もあります。

私は通常、Windows 6.1のLDR修正(ネットワークスタック修正だけでなく)の独自のリストを維持し、出会ったすべてのWindows 6.1サーバー/クライアントにこれらの修正を積極的に適用していました。新しいLDR修正プログラムを定期的に確認するのは非常に時間のかかる作業でした。

幸いなことに、Microsoftは新しいOSバージョンでのLDR修正プログラムの実行を停止し、Microsoftの自動更新サービスを通じてバグ修正が利用できるようになりました。

UPDATE:ちょうどWindows7SP1での多くのネットワークのバグの一例- https://support.microsoft.com/en-us/kb/2675785

更新2:SYNパケットの2回目の再送信後にウィンドウスケーリングを強制するnetshスイッチを追加する別の修正プログラムがあります(デフォルトでは、2つのSYNパケットが再送信されるとウィンドウスケーリングは無効になります)https://support.microsoft.com/en- us / kb / 2780879


クリストフに感謝します。これに関するいくつかの非常に興味深い新しい入力と、SYN再送信の「機能」は非常に奇妙です。その背後にある設計目標はまったく見えません。(おそらく、粗雑な輻輳検出のいくつかの種類?)。元のテストはすべてWin7SP1で行われました。すぐにWin10を試用する予定です。この多くを再実行して、どのように進むかを確認します。
SmallClanger

Windows 10のどのブランチでテストしますか?Windows 10のネットワークスタックの経験はまだありません。
クリストフウェゲナー

Enterprise 1511は私たちがターゲットにしているものです。
SmallClanger

そうですか。Windows 10のブランチは非常に多いため、ブランチを決定するのは非常に困難です。LTSBブランチにいたために特定の機能を使用できなかったWindows 10の問題が既に1つ発生しています。私は、Microsoftが全体的に利用できる分岐の数を削減し、代わりに....修正や機能は、各ビルドに含まれているものについての彼らのドキュメントを改善していた希望
クリストフ・ウェゲナーを

1

これは少し古い記事ですが、他の人の役に立つかもしれません。

要するに、「Receive Window Auto-Tuning」を有効にする必要があります。

netsh int tcp set global autotuninglevel=normal

CTCPは、上記を有効にしないと何も意味しません。

「Receive Window Auto-Tuning」を無効にすると、64KBのパケットサイズでスタックし、高ブロードバンド接続の長いRTTに悪影響を及ぼします。「制限付き」および「高度に制限された」オプションを試すこともできます。

非常に良いリファレンス:https : //www.duckware.com/blog/how-windows-is-killing-internet-download-speeds/index.html


1

Windowsクライアント(Windows 7)でも同様の問題が発生していました。私はあなたが経験したほとんどのデバッグを行って、Nagleアルゴリズム、TCP Chimneyオフロード、およびその他のTCP関連の設定変更を無効にしました。それらのどれも効果がなかった。

最終的にそれを修正したのは、AFDサービスのレジストリのデフォルトの送信ウィンドウを変更することでした。この問題はafd.sysファイルに関連しているようです。私はいくつかのクライアントをテストしましたが、いくつかは遅いアップロードを示し、いくつかはそうではありませんでしたが、すべてはWindows 7マシンでした。スロー動作を示したマシンには、同じバージョンのAFD.sysがありました。レジストリの回避策は、AFD.sysの特定のバージョンを搭載したコンピューターに必要です(申し訳ありませんが、バージョン番号を思い出さないでください)。

HKLM \ CurrentControlSet \ Services \ AFD \ Parameters

追加-DWORD-DefaultSendWindow

値-10進数-1640960

その値は私がここで見つけたものでした:https : //helpdesk.egnyte.com/hc/en-us/articles/201638254-Upload-Speed-Slow-over-WebDAV-Windows-

適切な値を使用すると思うので、以下を使用して自分で計算する必要があります。

例えば。広告アップロード:15 Mbps = 15,000 Kbps

(15000/8)* 1024 = 1920000

私が理解したことから、クライアントソフトウェアは一般にレジストリのこの設定をオーバーライドする必要がありますが、そうでない場合はデフォルト値が使用され、AFD.sysファイルの一部のバージョンではデフォルト値が非常に低いようです。

ほとんどのMS製品には、アップロードの遅い問題(IE、ミニリダイレクター(WebDAV)、Windowsエクスプローラー経由のFTPなど)があることに気付きました。 。

AFD.sysはすべてのWinsock接続に影響するため、この修正はFTP、HTTP、HTTPSなどに適用する必要があります。

また、この修正は上記のどこかにリストされているので、誰かのために機能する場合、私はそれを信用したくありませんが、このスレッドには非常に多くの情報があったので、それは光沢があったのではないかと心配しました。


0

まあ、私は自分で同様の状況に陥りました(ここで私の質問)、最終的にはTCPスケーリングヒューリスティックを無効にし、手動で自動調整プロファイルを設定し、CTCPを有効にしなければなりませんでした:

# disable heuristics
C:\Windows\system32>netsh interface tcp set heuristics wsh=disabled
Ok.

# enable receive-side scaling
C:\Windows\system32>netsh int tcp set global rss=enabled
Ok.

# manually set autotuning profile
C:\Windows\system32>netsh interface tcp set global autotuning=experimental
Ok. 

# set congestion provider
C:\Windows\system32>netsh interface tcp set global congestionprovider=ctcp
Ok. 

0

コメントするのに十分なポイントがないので、代わりに「回答」を投稿します。私は、類似/同一の問題と思われるものを抱えています(ここで serverfaultの質問を参照してください)。私の(そしておそらくあなたの)問題は、Windows上のiperfクライアントの送信バッファーです。64 KBを超えることはありません。Windowsは、プロセスによって明示的にサイズが設定されていない場合、バッファを動的に拡張することになっています。しかし、その動的な成長は起こっていません。

「遅い」Windowsケースで最大500,000バイトまで開いているウィンドウを示すウィンドウスケーリンググラフについてはわかりません。5 Mbpsに制限されているため、グラフは最大で64,000バイトまでしか開かないことが予想されます。


0

これは魅力的なスレッドであり、Win7 / iperfを使用して長い太いパイプのスループットをテストしていた問題と完全に一致します。

Windows 7のソリューションは、iperfサーバーとクライアントの両方で次のコマンドを実行することです。

netshインターフェイスtcpはグローバルautotuninglevel = experimentalを設定しました

注意:これを行う前に、自動チューニングの現在のステータスを記録してください。

netsh interface tcp show global

受信ウィンドウの自動調整レベル:無効

次に、パイプの両端でiperfサーバー/クライアントを実行します。

テスト後に自動調整値をリセットします。

netsh interface tcp set global autotuninglevel =

   autotuninglevel - One of the following values:
                     disabled: Fix the receive window at its default
                         value.
                     highlyrestricted: Allow the receive window to
                         grow beyond its default value, but do so
                         very conservatively.
                     restricted: Allow the receive window to grow
                         beyond its default value, but limit such
                         growth in some scenarios.
                     normal: Allow the receive window to grow to
                         accomodate almost all scenarios.
                     experimental: Allow the receive window to grow
                         to accomodate extreme scenarios.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.