Problemas de rendimiento al ejecutar Wireguard entre máquinas virtuales Linux. La misma configuración en hosts físicos funciona bien

Problemas de rendimiento al ejecutar Wireguard entre máquinas virtuales Linux. La misma configuración en hosts físicos funciona bien

Tengo problemas de rendimiento con los túneles Wireguard que se ejecutan entre dos máquinas virtuales en el mismo hipervisor (que se ejecutan bajo Qemu/KVM) y agradecería mucho cualquier información o consejo sobre este problema. El problema que tengo es que varios puntos de referencia muestran que la velocidad de la conexión/túnel Wireguard es aproximadamente un 80-90% más lenta que la velocidad de la conexión de red "normal" sobre la que se ejecuta Wireguard. La configuración de Wireguard es una configuración simple punto a punto.

La misma configuración de Wireguard entre dos computadoras físicas funciona bien y solo resulta en una pérdida de rendimiento de alrededor del 4-5%. Lo que me lleva a creer que el problema está en alguna parte de la capa de virtualización. Ya he probado muchas cosas sin resultados positivos:

  • Aumentar la CPU y la RAM de las máquinas virtuales no tiene ningún efecto.
  • Las pruebas de rendimiento de las tareas de cifrado/descifrado en estas máquinas virtuales no muestran ningún impacto significativo en el rendimiento. Por tanto, el rendimiento de la CPU parece estar bien para estas máquinas virtuales.
  • El soporte de virtualización para la CPU está habilitado en el BIOS del hipervisor
  • Probé algunos tamaños de MTU diferentes y no hubo diferencias reales.
  • La fijación de CPU y varias configuraciones de CPU dentro de Qemu/KVM no hacen ninguna diferencia.
  • Wireguard se ejecuta en modo kernel
  • Me encuentro con los mismos problemas con la misma configuración en diferentes combinaciones de máquinas/hipervisor (VirtualBox, por ejemplo), lo que me lleva a creer que de alguna manera estoy haciendo algo incorrecto en cuanto a la configuración. Todo lo que se ejecuta en máquinas virtuales parece tener este problema.
  • Las diferentes distribuciones de Linux tampoco parecen hacer ninguna diferencia

Aquí hay más información sobre mi configuración y un punto de referencia. Las dos máquinas virtuales se denominan wireguard-client-01 y wireguard-server:

información de red 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

Información de red del 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

Configuración wg0 del 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

Configuración de 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

Puntos de referencia de iperf3 sobre interfaces de red "normales":

[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. 

Puntos de referencia de iperf3 sobre el túnel Wireguard (tenga en cuenta que la diferencia en la tasa de bits cae aproximadamente un 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.

Agradecería mucho cualquier consejo sobre este problema y gracias de antemano por su ayuda.

información relacionada