私は特定の答えに興味があります:
- GROを備えたNICはTCP ACKまたはその他のパケットを編集/作成しますか(または、この機能は受信者/送信者TCPスタックに対して透過的ですか)?
- NICが「接着セグメント」をTCPスタックに渡す必要がある場合、タイムアウト/イベントが必要ですか?彼らは何ですか?
- パケット転送のセットアップで-GRO機能は受信側ACKの読み取りも試みますか(下記を参照してください)。
- GROおよびその他のNICオフロード機能(TSO、LSOなど)をウィキペディアやLinuxのマニュアルページよりも優れた方法で説明している情報源は本当にありがたいです。
詳細:
1つのIPSec実装でパフォーマンスの問題をトラブルシューティングしています。問題は、利用可能な帯域幅が4つのVPNトンネルすべてに均等に分散されていないことです(約200MBps / 200MBps / 1MBps / 1MBpsとして分散されます。各VPNトンネルは単一のTCP接続をカプセル化します)。PCAPでは、Webサーバーが約2秒間アイドル状態になることがあります(ACKを待機しています)。Webサーバーが未確認のセグメントを再送信すると、ダウンロードが再開されます。
PCAPからの私の内部の落ち込みは、NIC GRO機能がパケットを一緒に接着しますが、時々それらをタイムリーにTCPスタックに渡さず、それが問題を引き起こしていることです。
このVPNサーバーには、TCP接続を終了するインターフェイスはなく、パケットを転送するだけです。次に、GROを無効にしようとしましたが、その後、トラフィックがすべてのトンネルに均等に分散されていることに気付きました。また、WebサーバーでTCPウィンドウのスケーリングが無効になっている場合、GROが有効になっている場合でも帯域幅も分散されます(そのため質問#3がありました)。
Ubuntu 10.04サーバー(64ビット)で2.6.32-27 Linuxを使用しています。NICはIntel 82571EBです。すべてのインターフェイス(HTTPクライアント、VPNクライアント、VPNサーバー、Webサーバー)は、1Gbitイーサネットケーブルでチェーンで直接接続されています。