在尝试查找 OpenVPN 设置中高软中断问题的根源时,我在同一位置的云主机上启动了两台虚拟机(A 和 B)。我还在两台虚拟机上配置了专用网络。然后,我使用公共接口(eth0)和专用接口(eth1)在两台虚拟机之间建立了 2 个 IPIP 隧道。
A.A.A.A = A's public IP on eth0
B.B.B.B = B's public IP on eth0
a.a.a.a = A's private IP on eth1 (provided by host for private networking)
b.b.b.b = B's private IP on eth1 (provided by host for private networking)
隧道建立如下:
ip tunnel add pub0 mode ipip local A.A.A.A remote B.B.B.B ttl 255
ip addr add 10.0.1.1/30 dev pub0
ip link set pub0 up
ip tunnel add pub0 mode ipip local B.B.B.B remote A.A.A.A ttl 255
ip addr add 10.0.1.2/30 dev pub0
ip link set pub0 up
ip tunnel add pvt0 mode ipip local a.a.a.a remote b.b.b.b ttl 255
ip addr add 10.0.2.1/30 dev pvt0
ip link set pvt0 up
ip tunnel add pvt0 mode ipip local b.b.b.b remote a.a.a.a ttl 255
ip addr add 10.0.2.2/30 dev pvt0
ip link set pvt0 up
A&B现在以四种方式连接:
A.A.A.A <=> B.B.B.B (public IPs on eth0)
a.a.a.a <=> b.b.b.b (private IPs on eth1 provided by host)
10.0.1.1 <=> 10.0.1.2 (ipip tunnel via eth0)
10.0.2.1 <=> 10.0.2.2 (ipip tunnel via eth1)
然后我在它们之间执行 iperf3 测试,将 A 作为服务器,将 B 作为客户端,同时监视 A 上 top 中的 si(softirq)值:
A.A.A.A <=> B.B.B.B = normal si between 0-4% @ ~2Gbits/sec throughput
b.b.b.b <=> b.b.b.b = normal si between 0-4% @ ~2Gbits/sec throughput
10.0.1.1 <=> 10.0.1.2 = si shoots to 30-45% @ ~2Gbits/sec throughput
10.0.2.1 <=> 10.0.2.2 = normal si between 0-3% @ ~500Mbits/sec throughput
我对第 3 和第 4 个测试都很感兴趣。为什么当数据通过 pub0(通过 eth0 的 ipip 隧道)而不是 pvt0(通过 eth1 的 ipip 隧道)接收时,CPU 使用率会飙升到那个水平,这个问题可以解决吗?我不明白为什么在通过私有网络(eth1)建立的隧道上执行测试时,与 pub0 相比,吞吐量减少了 1/4。这可能是与主机有关的事情。我更关心那个高软中断问题。
当数据通过隧道而不是公共接口传输时,这种高软中断是否正常?如果是这样,为什么在 10.0.2.1 <=> 10.0.2.2 (pvt0) 测试中没有发生这种情况,因为那也是一个 ipip 隧道。