1gd*_*9dd 5 iperf tcp tun network-speed socat
我正在摆弄 socat,并尝试使用 socat 创建一个 TUN 设备,用于在两个 debianstretch 服务器之间建立隧道。然而,吞吐量似乎非常低,与本地主机上的 TCP/TCP-Listen 的 iperf 相比,TUN 的吞吐量大约低 5 个数量级。
这是一个“最小工作示例”,显示速度如何受到影响。
# socat
socat TUN:10.10.0.2/16,iff-up TCP4-LISTEN:54321,bind=192.168.1.2,fork
# iperf service
iperf -s -p 15001 -B 10.10.0.2
Run Code Online (Sandbox Code Playgroud)
# socat
socat TUN:10.10.0.1/16,iff-up TCP4:192.168.1.2:54321
# iperf
iperf -c 10.10.0.2 -p 15001 -t 30
Run Code Online (Sandbox Code Playgroud)
# socat
socat TCP4-LISTEN:12345,bind=192.168.1.2,fork TCP4:127.0.0.1:15001
# iperf service
iperf -s -p 15001 -B 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
# socat
socat TCP4-LISTEN:54321,bind=127.0.0.1,fork TCP4:192.168.1.2:12345
# iperf
iperf -c 127.0.0.1 -p 54321 -t 30
Run Code Online (Sandbox Code Playgroud)
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-39.7 sec 640 KBytes 132 Kbits/sec
Run Code Online (Sandbox Code Playgroud)
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-30.0 sec 3.30 GBytes 944 Mbits/sec
Run Code Online (Sandbox Code Playgroud)
如果您想使用上面的行重现结果,您需要以某种方式在后台或守护进程中运行 socat 行和 iperf 服务器端,我只是使用屏幕会话。
因此,虽然我假设吞吐量会受到一定程度的影响,但对我来说奇怪的是,它会从假设的千兆位(同一交换机上的两个服务器)降级到仅仅 100KBit。快速浏览一下,atop
发现没有明显的瓶颈,因此它不仅仅是 CPU 上限或占用 RAM。
为什么吞吐量那么低?我犯了一些逻辑错误吗?或者内核中的问题、socat 中的错误实现或使用 iperf 错误?
是否有任何参数或设置(内核,socat,任何东西)来改进这个?我可以检查什么吗?而且,最重要的是,有没有一种方法可以使用 TUN 设备来为我提供有用的吞吐量?
小智 3
socat
当使用蓝牙串行连接(通过)在两台计算机之间创建 IP 连接时,我遇到了类似的问题rfcomm
。原始串行连接相当快(15 左右 KiB/s),但是当通过 socat 创建的 TUN 设备连接到 Web 服务器时,速度非常慢,浏览器最终在加载一段时间后就放弃了。
socat 手册页确实说了以下内容。
Note that streaming eg. via TCP or SSL does not guarantee to retain packet boundaries and may thus cause packet loss.
Run Code Online (Sandbox Code Playgroud)
这让我想知道数据包是否被丢弃或截断。果然,tcpdump -i tun0
显示许多数据包丢失了字节(有些丢失超过 140 个字节)。查看 的 MTU(最大传输单元 - 数据包大小)tun0
,我发现它是 1500 ( ip link
)。但是,根据hciconfig --all
(如果我正确读取其输出),蓝牙 MTU 为 1021(?)字节。
tun0
因此,为了进行测试,我将(隧道两侧 - 两台计算机上)的MTU 减少到 100 字节。这有效......好吧,它仍然不是超级快,但我通过蓝牙连接,它比以前快得多。至少我没有再遇到任何连接问题。请注意,这可能可以设置得更大,但我只是测试一下它是否可以解决问题。
以下命令将tun0
socat 创建的设备上的 MTU(调用 socat 后)更新为 100 字节。这需要在两个系统上运行(并且可能应该匹配)。
Note that streaming eg. via TCP or SSL does not guarantee to retain packet boundaries and may thus cause packet loss.
Run Code Online (Sandbox Code Playgroud)
因此,您将执行以下操作。
ip link set mtu 100 tun0
Run Code Online (Sandbox Code Playgroud)
# socat
socat TUN:10.10.0.2/16,iff-up TCP4-LISTEN:54321,bind=192.168.1.2,fork
# set MTU to 100
ip link set mtu 100 tun0
# iperf service
iperf -s -p 15001 -B 10.10.0.2
Run Code Online (Sandbox Code Playgroud)
注意:您可以使用ip link
显示所有链接 -如果不起作用,请查找tun
以找到正确的设备。tun0
归档时间: |
|
查看次数: |
2759 次 |
最近记录: |