OpenVPNの速度が低下するのはなぜですか?

説明されている問題は、OpenVPN 2.3ブランチにのみ特有のものです; 2.4では、ユーザーの要件なしにバッファサイズは変更されません。



時々、フォーラムでトピックに出くわします。そこでは、人々がOpenVPNを使用して複数のオフィスを接続し、チャネル速度よりもはるかに低い速度になります。 いくつかの場合、20 Mbit / sで、両側に100 Mbit / sのチャネルがありますが、2 Mbit / s ADSL / 3Gおよび高pingで400 Kbit / sを得るのは困難です。 多くの場合、このような人々は、VPNインターフェースのMTUを48000などの非常に大きな値に増やすか、mssfixパラメーターを使用することをお勧めします。 これはある程度役立ちますが、VPN内の速度はまだチャネルから非常に離れています。 誰もがOpenVPNをユーザー空間ソリューションとして非難することがあります。これは、あらゆる種類の暗号化とHMACを考えると、これが通常の速度です。 不条理!



ちょっとした歴史

2004年7月以外。 先進国の一般的な家庭用インターネットの速度は256 Kbps-1 Mbpsで、後進国では56 Kbpsです。 Linux 2.6.7カーネルはそれほど前にリリースされておらず、TCPウィンドウスケールがデフォルトで有効になっている2.6.8は1か月後にリリースされる予定です。 OpenVPNプロジェクトは3年前から開発されており、バージョン2.0のリリースが準備されています。

開発者の1人が、おそらくプラットフォームのバッファーサイズを何らかの方法で統一し、システム設定に依存しないために、ソケットのデフォルトの送受信バッファーを64 KBに設定するコードを追加します。 ただし、Windowsで何かが壊れたため、ソケットのバッファーのサイズを指定すると、システム内のすべてのアダプターで奇妙なMTU問題が発生します。 最終的に、次のコードはOpenVPN 2.0-beta8のリリースに入ります。

#ifndef WIN32 o->rcvbuf = 65536; o->sndbuf = 65536; #endif
      
      





いくつかの技術情報

OpenVPNを使用した場合、UDPとTCPの両方で機能することがわかっています。 TCPソケットに小さなバッファー値(この場合は64 KB)を設定すると、TCPウィンドウトリミングアルゴリズムはこの値を超えることはできません。

これはどういう意味ですか? ロシアのOpenVPNを介して標準のソケットバッファーで米国のサーバーに接続しているとします。 たとえば、50 Mbit / sのような広いチャネルがありますが、距離があるため、pingは100 msです。 あなたはどう思いますか、あなたは何の最高速度を達成できますか? 5.12 Mbps。 50 Mbpsリンクをロードするには、少なくとも640 KBのサイズのバッファーが必要です。

UDPを介したOpenVPNは、パケット転送の独自の実装により多少速く動作しますが、理想からはほど遠いです。



どうする

ご想像のとおり、このバッファサイズは最新のOpenVPNリリースでも使用されています。 どうすれば状況を修正できますか? 最も正しいオプションは、OpenVPNがソケット上のバッファーのサイズを変更しないようにすることです。

サーバーとクライアントの両方の構成ファイルに次の行を追加する必要があります。

 sndbuf 0 rcvbuf 0
      
      





この場合、バッファサイズはOSの設定によって決まります。 LinuxおよびTCPの場合、この値はnet.ipv4.tcp_rmemおよびnet.ipv4.tcp_wmemの値に応じて変化し、UDPの場合、固定値net.core.rmem_defaultおよびnet.core.wmem_defaultを2で割った値に応じて変化します。



何らかの理由でクライアント構成ファイルを変更できない場合は、サーバーから十分に大きなバッファーサイズを指定する必要があります。

 sndbuf 0 rcvbuf 0 push "sndbuf 393216" push "rcvbuf 393216"
      
      





UDPはTCPとは少し異なります。 Window Scaleに類似したものはありません。トランスポートレベルでのパケット配信の確認は必要ありませんが、OpenVPNが読み取る前にバッファが詰まると、受信バッファサイズが小さくなると速度が低下する可能性があります。 上記の変更を行ってもトンネル内の速度が遅いと思われる場合は、net.core.rmem_defaultおよびnet.core.wmem_defaultを増やすことでシステム全体のバッファーサイズ全体を増やすか、構成で常に特定のバッファーサイズを指定することをお勧めします。ファイル:

 sndbuf 393216 rcvbuf 393216 push "sndbuf 393216" push "rcvbuf 393216"
      
      







しかし、私はWindowsを持っています!

OpenVPNサーバーをWindowsマシンで実行していて、すべてのクライアントがWindowsからのみ接続する場合、おめでとうございます。何も変更する必要はありません。すべてがすぐに機能します。



OpenVPNバグトラッカーのバグが遅い



All Articles