
Estou tendo problemas de desempenho com túneis Wireguard em execução entre duas máquinas virtuais no mesmo hipervisor (executando em Qemu/KVM) e agradeceria muito qualquer informação/conselho sobre esse problema. O problema que estou tendo é que vários benchmarks mostram que a velocidade da conexão/túnel do wireguard é cerca de 80-90% mais lenta que a velocidade da conexão de rede 'normal' que o wireguard está executando. A configuração do Wireguard é uma configuração ponto a ponto simples.
A mesma configuração do Wireguard entre dois computadores físicos funciona perfeitamente e resulta apenas em uma perda de desempenho de cerca de 4-5%. O que me leva a acreditar que o problema está em algum lugar na camada de virtualização. Já tentei muitas coisas sem resultados positivos:
- Aumentar CPU e RAM das VMs não tem efeito.
- O teste de desempenho de tarefas de criptografia/descriptografia nessas VMs não mostra nenhum impacto significativo no desempenho. Portanto, o desempenho da CPU parece bom para essas VMs.
- O suporte de virtualização para a CPU está habilitado no BIOS do hipervisor
- Experimentei alguns tamanhos de MTU diferentes sem nenhuma diferença real.
- A fixação da CPU e várias configurações da CPU dentro do Qemu/KVM não fazem diferença.
- Wireguard está rodando em modo kernel
- Encontro os mesmos problemas com a mesma configuração em diferentes combinações de máquinas/hipervisores (VirtualBox, por exemplo), o que me leva a acreditar que de alguma forma estou fazendo algo errado em termos de configuração. Tudo o que roda em máquinas virtuais parece ter esse problema.
- Diferentes distribuições Linux também parecem não fazer diferença
Aqui estão mais algumas informações sobre minha configuração e um benchmark. As duas máquinas virtuais são chamadas wireguard-client-01 e wireguard-server:
informações de rede wireguard-client-01:
[root@wireguard-client-01 ~]# ip a
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:d4:fa:89 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.41/24 brd 192.168.2.255 scope global dynamic noprefixroute enp1s0
valid_lft 863813sec preferred_lft 863813sec
inet6 fd00::5054:ff:fed4:fa89/64 scope global dynamic noprefixroute
valid_lft 7021sec preferred_lft 3421sec
inet6 fe80::5054:ff:fed4:fa89/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.8.0.2/24 scope global wg0
valid_lft forever preferred_lft forever
informações de rede do servidor wireguard:
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:73:c2:6d brd ff:ff:ff:ff:ff:ff
inet 192.168.2.40/24 brd 192.168.2.255 scope global dynamic noprefixroute enp1s0
valid_lft 863677sec preferred_lft 863677sec
inet6 fd00::5054:ff:fe73:c26d/64 scope global dynamic noprefixroute
valid_lft 6880sec preferred_lft 3280sec
inet6 fe80::5054:ff:fe73:c26d/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.8.0.1/24 scope global wg0
valid_lft forever preferred_lft forever
Configuração wg0 do servidor wireguard:
[Interface]
Address = 10.8.0.1/24
SaveConfig = true
ListenPort = 51820
PrivateKey = <my_private_key>
[Peer]
PublicKey = E0eS7oBffTDg8Qj4ZeIUhxA0GUC3HrSfacrjP54hFQI=
AllowedIPs = 10.8.0.2/32
Endpoint = 192.168.2.41:48671
Configuração do Wireguard-client-01 wg0:
[Interface]
PrivateKey = <my_private_key>
Address = 10.8.0.2/24
[Peer]
PublicKey = h+kDKK/2Y+WXRiO9lSQ0RT3HsRi0m6OckOkEJep/2jM=
AllowedIPs = 10.8.0.0/24
Endpoint = 192.168.2.40:51820
Benchmarks iperf3 em interfaces de rede 'normais':
[root@wireguard-client-01 ~]# iperf3 --client 192.168.2.40
Connecting to host 192.168.2.40, port 5201
[ 5] local 192.168.2.41 port 57836 connected to 192.168.2.40 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 913 MBytes 7.66 Gbits/sec 2 3.11 MBytes
[ 5] 1.00-2.00 sec 956 MBytes 8.00 Gbits/sec 2 3.11 MBytes
[ 5] 2.00-3.00 sec 958 MBytes 8.05 Gbits/sec 5 3.11 MBytes
[ 5] 3.00-4.00 sec 1.05 GBytes 9.00 Gbits/sec 3 3.11 MBytes
[ 5] 4.00-5.00 sec 998 MBytes 8.37 Gbits/sec 5 3.11 MBytes
[ 5] 5.00-6.00 sec 1014 MBytes 8.50 Gbits/sec 4 3.11 MBytes
[ 5] 6.00-7.00 sec 1.02 GBytes 8.75 Gbits/sec 4 3.11 MBytes
[ 5] 7.00-8.00 sec 960 MBytes 8.06 Gbits/sec 5 3.11 MBytes
[ 5] 8.00-9.00 sec 1.17 GBytes 10.0 Gbits/sec 2 3.11 MBytes
[ 5] 9.00-10.00 sec 1022 MBytes 8.58 Gbits/sec 3 3.11 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 9.90 GBytes 8.50 Gbits/sec 35 sender
[ 5] 0.00-10.03 sec 9.89 GBytes 8.47 Gbits/sec receiver
iperf Done.
Benchmarks iperf3 em túnel wireguard (observe que a diferença na taxa de bits cai cerca de 80%):
[root@wireguard-client-01 ~]# iperf3 --client 10.8.0.1
Connecting to host 10.8.0.1, port 5201
[ 5] local 10.8.0.2 port 39384 connected to 10.8.0.1 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 125 MBytes 1.05 Gbits/sec 106 1.59 MBytes
[ 5] 1.00-2.00 sec 120 MBytes 1.01 Gbits/sec 0 1.74 MBytes
[ 5] 2.00-3.00 sec 132 MBytes 1.11 Gbits/sec 0 1.83 MBytes
[ 5] 3.00-4.00 sec 176 MBytes 1.48 Gbits/sec 22 1.40 MBytes
[ 5] 4.00-5.00 sec 221 MBytes 1.85 Gbits/sec 0 1.50 MBytes
[ 5] 5.00-6.00 sec 191 MBytes 1.61 Gbits/sec 0 1.58 MBytes
[ 5] 6.00-7.00 sec 42.5 MBytes 357 Mbits/sec 0 1.58 MBytes
[ 5] 7.00-8.00 sec 191 MBytes 1.60 Gbits/sec 0 1.65 MBytes
[ 5] 8.00-9.00 sec 194 MBytes 1.63 Gbits/sec 169 1.21 MBytes
[ 5] 9.00-10.00 sec 214 MBytes 1.79 Gbits/sec 0 1.36 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 1.57 GBytes 1.35 Gbits/sec 297 sender
[ 5] 0.00-10.04 sec 1.57 GBytes 1.34 Gbits/sec receiver
iperf Done.
Eu apreciaria muito qualquer conselho sobre este problema e agradeço antecipadamente pela sua ajuda!