複数のクライアント ネットワークから Wireguard トンネル経由でサーバー上の Samba 共有への接続が遅いという問題が発生していますが、奇妙なことに、影響を受けるのは Windows 10 のみで、アップロードのみです。
Linux ホストは最大 120 MB/秒でアップロードできますが、Windows は 10 ~ 50 MB/秒でしかアップロードできません (使用しているネットワークによって異なります)。これは smb に限定されず、Iperf (udp および tcp) でもまったく同じテスト結果が得られます。
好奇心からWindows 11も影響を受けるかどうかテストしたところ、ない! これは一体何なのでしょうか、どうすれば修正できるのでしょうか?
答え1
0.4.8 リリースで追加された実験的なカーネル ドライバーにより、Windows のアップロード速度が低下しました。修正されるまで、古いバージョンを実行してください。
https://download.wireguard.com/windows-client/wireguard-amd64-0.4.7.msi
答え2
これはDropboxが説明したのと同じ、または少なくとも同様の問題のようです(https://dropbox.tech/infrastructure/boosting-dropbox-upload-speed)。私の理解する限りでは (訂正してください!)、Linux Gateway が Wireguard で NIC マルチキューを使用すると、大量のパッケージの並べ替えが発生し、どうやら Windows 10 はそれをうまく処理できないようです。パッケージの並べ替えにより、Windows 10 は複数のパケットを送信して選択的な ACK を受け入れる代わりに、ほぼすべての送信データ パケットの後に ACK を待機することで、送信速度が低下します。
残念ながら、分析した Wireshark セッションのスクリーンショットを撮るのを忘れてしまいましたが、ダウンロード時に Windows ホストが ACK を送信する前に通常 10 ~ 20 個の TCP データ パケットを受信することは非常によくわかりました。ただし、アップロード時には、送信されたデータ パッケージごとに TCP ACK を受信しました。
この問題を解決するには、Linux ホストでマルチキューを無効にする必要があります。
ethtool -L PHYSICAL_LOCAL_INTERFACE combined 1
ethtool -L PHYSICAL_NETWORK_INTERFACE combined 1
適用されたかどうかを確認するには、
ethtool -l INTERFACENAME
Channel parameters for INTERFACENAME:
Pre-set maximums:
RX: 0
TX: 0
Other: 1
Combined: 63
Current hardware settings:
RX: 0
TX: 0
Other: 1
Combined: 1
最後の行は 1 である必要があります。上記のコマンドはこれを一時的に設定するだけなので、永続化するにはディストリビューション固有のツールを使用する必要があります。Debian の場合は次のようになります。
cat /etc/network/interfaces
auto INTERFACE
iface INTERFACE inet static
address IPADDR
netmask NETMASK
gateway GATEWAY
# This is the relevant line
post-up ethtool -L INTERFACE combined 1
ゲートウェイに強力な CPU が搭載されていない場合、ボトルネックが発生する可能性があります。当社では AMD EPYC 7262 8 コア プロセッサを使用しており、1 つのコアの使用率を約 70% にして、1Gbit のアップロードとダウンロードをフルに実現しています。