Performance Iperf在使用和不使用VPN隧道时的性能差异巨大

Performance Iperf在使用和不使用VPN隧道时的性能差异巨大,performance,docker,networking,vpn,iperf,Performance,Docker,Networking,Vpn,Iperf,我正在使用IPerf在不同网络设置之间运行一些性能度量。我看到了两种基本设置之间的巨大差异 两个容器(docker)通过主机中的默认docker0桥接接口相互连接 两个容器通过VPNTunnel接口连接,该接口通过上述docker0桥接器内部连接 IPerf两种情况下10秒的计算 我对吞吐量的巨大差异感到困惑 是因为加密和解密以及OpenSSL的参与导致了这种降级吗 或者是因为在通过VPN隧道进行路由时,需要在应用层下多次对数据包头进行解组和编组 谢谢你 Shabir两个测试的运行情况并不相同-

我正在使用IPerf在不同网络设置之间运行一些性能度量。我看到了两种基本设置之间的巨大差异

  • 两个容器(docker)通过主机中的默认docker0桥接接口相互连接
  • 两个容器通过VPNTunnel接口连接,该接口通过上述docker0桥接器内部连接
  • IPerf两种情况下10秒的计算

    我对吞吐量的巨大差异感到困惑

    是因为加密和解密以及OpenSSL的参与导致了这种降级吗

    或者是因为在通过VPN隧道进行路由时,需要在应用层下多次对数据包头进行解组和编组

    谢谢你

    Shabir

    两个测试的运行情况并不相同-第一个测试的TCP窗口为1.12 Mbyte,而第二个较慢的测试的TCP窗口为0.085 Mbyte:

    Client connecting to 172.17.0.4, TCP port 5001
    TCP window size: 1.12 MByte (default)
                     ^^^^
    
    Client connecting to 10.23.0.2, TCP port 5001
    TCP window size: 85.0 KByte (default)
                     ^^^^
    
    因此,您可能正在经历TCP窗口耗尽,这既是因为较小的缓冲区,也是因为通过vpn堆栈略微增加的延迟

    为了知道要使用的缓冲区大小(如果不仅仅是一个巨大的缓冲区),您需要知道您的

    我不知道你们原来的RTT频道是什么,但我们可以试试看。在缓冲区大小为1.12 MBytes的情况下,您可以通过链路获得约30 gbit/s的数据,然后反向计算(省略单位转换),我们得到:

    1.12兆字节/30千兆位/秒-->0.3毫秒

    这似乎是合理的。现在,我们假设您的vpn的RTT是原始链路的两倍,因此我们将假设延迟为0.6毫秒。然后,我们将使用您的新窗口大小0.085 MB,通过计算带宽延迟积来计算您期望的性能:

    0.085 Mbytes / 0.6 ms --> BDP = 141 mbit/sec. 
    
    好吧,你知道什么,这就是你所看到的确切表现


    例如,如果您想用0.6毫秒的RTT使100千兆/秒的管道饱和,则需要7.5兆字节的缓冲区大小。或者,如果您不想使用单个连接,而是使用N个连接使管道饱和,则需要N个套接字,每个套接字的发送缓冲区大小为7.5/N MB。

    谢谢您的回答。然而,我认为上面的TCP窗口是随机的,只表示iperf开始时的窗口。我再次尝试运行它,在这两种情况下,窗口默认设置为85 KB。我尝试手动将窗口设置为400KB,但仍然看到巨大的差异。尝试将窗口/缓冲区大小设置为10MB左右,以确保绝对正确。400KB仍然太小。另外,在场景中检查cpu使用情况。VPN软件是使核心饱和,还是使用所有cpu?
    0.085 Mbytes / 0.6 ms --> BDP = 141 mbit/sec.