Auteur Sujet: Algo de contrôle de la congestion TCP: BBR  (Lu 77814 fois)

0 Membres et 3 Invités sur ce sujet

LROB

  • Abonné Orange Fibre
  • *
  • Messages: 149
  • Orléans (45)
    • LRob.fr
Algo de contrôle de la congestion TCP: BBR
« Réponse #144 le: 18 mars 2024 à 00:54:14 »
Et encore t'as pas vu la pile TCP de Netflix.

Je vois pas trop le souci avec ce que fait Netflix pour le coup, mais un détail m'échappe peut-être (l'article est super long, donc j'ai lu la partie sur TCP RACK Stack de Netflix), ça m'a l'air plutôt consciencieux au contraire.

Sur un BSD pour lancer le BBR c'est easy.

https://groups.google.com/g/bbr-dev/c/bSvfbe9JQXI?pli=1

Le chacun sa poire ça va se calmer avec l'adoption de BBR comme ça ils se boufferont le nez entre eux.

Sous Debian c'est tout aussi simple (voir plus simple) :

modprobe tcp_bbr
sysctl net.core.default_qdisc=fq
sysctl net.ipv4.tcp_congestion_control=bbr

Pour rendre ça persistant et appliquer d'un coup :

echo "tcp_bbr" >> /etc/modules-load.d/bbr.conf
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
modprobe tcp_bbr
sysctl -p

LROB

  • Abonné Orange Fibre
  • *
  • Messages: 149
  • Orléans (45)
    • LRob.fr
Algo de contrôle de la congestion TCP: BBR
« Réponse #145 le: 19 mars 2024 à 02:03:35 »
Comme promis, différence d'upload de mon plus gros backup incrémental nocturne en Cubic (14.0Go) VS BBR (13.9Go) depuis Hetzner vers OVH FTTH.



On gagne environ 20-25Mbit/s et 10 secondes sur la durée du backup. Toujours bon à prendre, mais pas très intéressant sur ce cas spécifique.

Fyr

  • Abonné Free fibre
  • *
  • Messages: 1 035
  • Talissieu 01
Algo de contrôle de la congestion TCP: BBR
« Réponse #146 le: 19 mars 2024 à 12:02:37 »
Tu sais les algos de congestion ça marche... quand il y a de la congestion.

LROB

  • Abonné Orange Fibre
  • *
  • Messages: 149
  • Orléans (45)
    • LRob.fr
Algo de contrôle de la congestion TCP: BBR
« Réponse #147 le: 19 mars 2024 à 12:56:54 »
On pourra voir après le 26 mars quand je serai chez Orange si c'était une limitation du serveur en upload (ce dont je doute car c'est du serveur 24 threads haute fréquence, 128Go de RAM, full SSD NVMe et liaison 1Gbit/s, donc ça ne peine pas à sortir du 900Mbit/s+ en théorie) ou bien d'OVH.

Edit: Après analyse des graphes du serveur source et cible, ni le CPU ni l'IO ne sont saturés (ni le réseau), ce qui laisse supposer que c'est bien le réseau qui bottleneck à 50% de la vitesse max théorique en direction Hetzner > OVH FTTH pour un envoi en FTPS passif.
« Modifié: 19 mars 2024 à 14:58:11 par LROB »

LROB

  • Abonné Orange Fibre
  • *
  • Messages: 149
  • Orléans (45)
    • LRob.fr
Algo de contrôle de la congestion TCP: BBR
« Réponse #148 le: 28 mars 2024 à 09:16:40 »
Comme promis, la vitesse de Hetzner vers Orange Pro FTTH en XGS-PON, toujours depuis un serveur 1G.



C'est le point de vue serveur, cette fois, et un backup bien plus gros (complet serveur, y'en a pour 666.25Go).
Comme on le voit, on sature en gros le gigabit avec une vitesse 2x plus rapide qu'avec OVH FTTH et ce sur toute la durée de l'upload.
Toujours en BBR du coup, je laisse mon serveur comme ça pour améliorer le débit vers mes clients ayant une interco pourrie (freenautes/20).
« Modifié: 28 mars 2024 à 09:54:14 par LROB »

kgersen

  • Modérateur
  • Abonné Orange Fibre
  • *
  • Messages: 9 547
  • Paris (75)
Algo de contrôle de la congestion TCP: BBR
« Réponse #149 le: 08 décembre 2024 à 01:18:27 »
pour info:

BBR2 est activable sur Windows 11 depuis quelques temps déja mais il pose des gros problemes de fonctionnement par moment. Notamment tout ce qui est trafic TCP sur l'interface loopback ('localhost').
J'ai mis un temps fou a trouver que c'est lui qui m'empêchait d'ouvrir une console hyper-vm (vmconnect) sur une vm par exemple...
Autre symptôme: débit sur localhost de quelques Mbps au lieu de plusieurs Gbps entre 2 iperf3 par exemple (ou nspeed ou un serveur web local et un navigateur).

Donc en attendant une maj officielle je déconseille vivement de l'activer sauf si la machine ne fait "que" serveur d'envoie vers Internet.

netsh int tcp set supplemental Template=Internet CongestionProvider=BBR2
Ok.

.\nspeed.exe b h1g

 #1| 125.5 Mbps|       0 bps| 8.00|   125.5 MB|           0 B|get http://[::1]:51282/20g (IPv6 - 0.0 ms - HTTP/1.1 - )

netsh int tcp set supplemental Template=Internet CongestionProvider=CUBIC
Ok.

.\nspeed.exe b h1g

 #1|  32.3 Gbps|       0 bps| 4.96|    20.0 GB|           0 B|get http://[::1]:51295/20g (IPv6 - 1.9 ms - HTTP/1.1 - )


djgreg13

  • Abonné Orange Fibre
  • *
  • Messages: 54
  • Strasbourg (67)
Algo de contrôle de la congestion TCP: BBR
« Réponse #150 le: Hier à 15:03:38 »
Hello

ça fait des années que j'ai un tunnel Wireguard site à site entre deux sites ayant comme FAI Orange

On a 22ms de ping entre les 2 sites.

Depuis le début je suis sur BBR + FQ sur les serveurs des deux cotés du VPN, mais depuis quelque temps la vitesse est tombé en dessous de 100 Mbit/s (les liens sont 1Gbps/s symétrique), j'ai repassé les serveurs en CUBIC mais en gardant FQ en qdisc et depuis je repasse la barre des 500 Mbit/s sans problème.

Une idée de pourquoi BBR ne fonctionne pas dans ce cas d'usage ?

Merci

vivien

  • Administrateur
  • *
  • Messages: 50 500
    • Bluesky LaFibre.info
Algo de contrôle de la congestion TCP: BBR
« Réponse #151 le: Hier à 19:01:13 »
C'est intéressant, c'est reproductible avec iPerf3 d'un  côté et de l'autre sans tunnel ?

iPerf3 permet de sélectionner le protocole de congestion dans la ligne de commande.

djgreg13

  • Abonné Orange Fibre
  • *
  • Messages: 54
  • Strasbourg (67)
Algo de contrôle de la congestion TCP: BBR
« Réponse #152 le: Hier à 19:59:52 »
Hello

Depuis le post j'ai avancé sur l'investigation

Alors j'ai testé avec scp, je suis autour de 500 Mbit/s avec iperf3 le premier coup je suis à 600 et les autres à 30/40 Mbit/s en BBR et 300 Mbit/s en CUBIC. Si j'attends ou que je relance l'interface alors le début revient. Ça ressemble à un soucis de TCP avec sysctl (paramètres par défaut de Debian)

J'ai un autre bug sur un second tunnel, ou je suis obligé de redémarrer la passerelle VPN (un N100 qui fait que le VPN site à site), le traffic en forward est ridiculement bas quand le bug arrive, c'est full aléatoire, ça peut tenir une semaine comme 1 mois, j'ai essayé de recharger netfilter, relancer le vpn, rien à faire à part relancer le noyau avec kexec et la le débit est de retour aussi. Idem je suspecte un soucis de sysctl sur la passerelle

Je suis sur le noyau 6.8.12

En direct sans VPN je suis à 800 Mbit/s

vivien

  • Administrateur
  • *
  • Messages: 50 500
    • Bluesky LaFibre.info
Algo de contrôle de la congestion TCP: BBR
« Réponse #153 le: Hier à 21:34:04 »
Pour décorrélation les tests successifs et ne plus avoir besoin d'attendre ou relancer l'interface, je te conseille

net.ipv4.tcp_no_metrics_save=1

3/ Optimisations réseau et swappiness :

nano /etc/sysctl.d/90-server-optimization.conf
Copier / coller la configuration BBR ou la configuration Cubic en fonction de votre choix.

Serveur BBR :
Copier / coller le texte ci-dessous dans le fichier :
# Algorithme d’évitement de congestion TCP et qdisc
net.ipv4.tcp_congestion_control=bbr
net.core.default_qdisc=fq

# décorrélation des tests successifs
net.ipv4.tcp_no_metrics_save=1

# Paramétrage de la fenêtre TCP à 32 Mio
net.ipv4.tcp_rmem=4096 131072 33554432
net.ipv4.tcp_wmem=4096 87380 33554432
net.core.rmem_max=33554432
net.core.wmem_max=33554432

# Limiter l’utilisation du swap
vm.swappiness = 1

# Augmentation de la file d'attente dans le noyau Linux où le trafic est stocké après réception par la carte réseau
net.core.netdev_max_backlog=4000

# Réduire le seuil où un DDOS impacte le serveur
net.ipv4.tcp_max_syn_backlog = 4096

# Augmenter le nombre de connexions entrantes
net.core.somaxconn = 4096

Serveur Cubic : Copier / coller le texte ci-dessous dans le fichier :
# Algorithme d’évitement de congestion TCP et qdisc
net.ipv4.tcp_congestion_control=cubic
net.core.default_qdisc=fq_codel

# décorrélation des tests successifs
net.ipv4.tcp_no_metrics_save=1

# Paramétrage de la fenêtre TCP à 32 Mio
net.ipv4.tcp_rmem=4096 131072 33554432
net.ipv4.tcp_wmem=4096 87380 33554432
net.core.rmem_max=33554432
net.core.wmem_max=33554432

# Limiter l’utilisation du swap
vm.swappiness = 1

# Augmentation de la file d'attente dans le noyau Linux où le trafic est stocké après réception par la carte réseau
net.core.netdev_max_backlog=4000

# Réduire le seuil où un DDOS impacte le serveur
net.ipv4.tcp_max_syn_backlog = 4096

# Augmenter le nombre de connexions entrantes
net.core.somaxconn = 4096



Explications de la configuration proposée :

Configuration BBR vs Cubic :

Cubic et BBR sont les deux algorithmes les plus utilisés côté serveur pour décider de la vitesse d’envoi des paquets.
Aujourd’hui, la majorité de l’internet utilise Cubic, créé en 2006, qui s’appuie sur la perte de paquets comme signal pour réduire le débit. Cubic est l'implémentation par défaut sous Linux, Android et MacOS.
Google a développé en 2016 BBR (pour « Bottleneck Bandwidth and Round-trip propagation time ») qui utilise un modèle différent se basant sur la bande passante maximale et le temps d’aller-retour (RTT ou « round trip time »). Cette approche permet à BBR de proposer un débit nettement plus élevé que Cubic sur un réseau qui perd des paquets sans lien avec une congestion. BBR est de plus en plus utilisé par certains grands acteurs de l’Internet.

« net.ipv4.tcp_congestion_control=bbr » va utiliser l’algorithme de congestion BBR, conçu par Google, à la place de Cubic, afin d’avoir de meilleures performances réseau.
Important : Le paramétrage "qdisc", le protocole de queuing discipline doit être adapté au protocole de congestion :
- Pour Cubic, on recommande fq_codel
- Pour BBR, on recommande fq

Optionnel, pour la configuration Cubic, proposer BBR en protocole de congestion optionnel : Si vous souhaitez qu'il soit disponible pour un outil tel que iperf3 qui permet de sélectionner le protocole de congestion, il faut créer un fichier pour charger le module :
nano /etc/modules-load.d/tcp_allowed_congestion_control.conf

Copier / coller le texte ci-dessous dans le fichier :
# TCP congestion control protocol
# cat /proc/sys/net/ipv4/tcp_allowed_congestion_control
tcp_bbr



Décorrélation des tests successifs : tcp_no_metrics_save=1

Par défaut, TCP enregistre diverses métriques de connexion dans le cache de routage lorsque la connexion se ferme, de sorte que les connexions établies dans un proche avenir peuvent les utiliser pour définir les conditions initiales. Habituellement, cela augmente les performances globales, mais peut parfois entraîner une dépendance du test N au test N-1.
Dans le cadre des tests de débit, et afin d’assurer une décorrélation des tests successifs, la mémorisation des tests précédents a été désactivée sur le serveur via « tcp_no_metrics_save=1 » afin d’éviter que le serveur bride tous les tests, à la suite d’une performance limitée.




Paramétrage de la fenêtre TCP : maximum de 32 Mio

TCP utilise un mécanisme de fenêtrage glissante pour empêcher qu'un émetteur rapide ne surcharge un récepteur plus lent. Le récepteur annonce la quantité de données que l'émetteur doit envoyer avant d'attendre l'actualisation de la fenêtre par le récepteur. Le délai le plus rapide d'actualisation d'une fenêtre correspond à un aller-retour, ce qui conduit à la formule suivante pour calculer l'une des limites de performance du transfert de données groupées sur une connexion TCP : Débit <= taille de la fenêtre / latence du délai aller-retour (DAR).

Une fenêtre TCP trop petite peut limiter artificiellement le débit pour les connexions à très haut débit ou forte latence. La configuration par défaut des serveurs peut limiter artificiellement les débits, notament pour les  utilisateurs ultramarines (quand le serveur est en métropole).

La taille de la fenêtre TCP est affectée par les 4 paramètres suivants :
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
net.core.rmem_max
net.core.wmem_max
Note : le paramétrage net.ipv4.xxx s’applique également au protocole IPv6.

Les deux premiers paramètres configurables affectent la taille de fenêtre TCP pour les applications qui laissent la fonction de réglage automatique de Linux se charger de cette tâche.
Les deux derniers paramètres configurables affectent la taille maximale de fenêtre TCP pour les applications qui tentent de contrôler directement la taille de la fenêtre TCP, en limitant la requête des applications à ces valeurs seulement.

Paramètres de la mémoire tampon de réception TCP (net.ipv4.tcp_rmem=4096 131072 33554432).  Les 3 valeurs sont :
• Taille minimale du tampon de réception pouvant être allouée à un socket TCP.
• Taille par défaut du tampon de réception.
• Taille maximale de la mémoire tampon de réception pouvant être allouée à un socket TCP.

Paramètres de la mémoire tampon d’envoi TCP (net.ipv4.tcp_wmem=4096 87380 33554432).  Les 3 valeurs sont :
• Espace minimal du tampon d'envoi TCP disponible pour un socket TCP.
• Espace par défaut du tampon autorisé pour un socket TCP.
• Espace maximal du tampon d'envoi TCP.

Taille maximale de la mémoire tampon de réception du système d'exploitation pour tous les types de connexions :
net.core.rmem_max= 33554432

Taille maximale de la mémoire tampon d'envoi du système d'exploitation pour tous les types de connexions :
net.core.wmem_max= 33554432




Limiter l’utilisation du swap :vm.swappiness = 1

Le paramètre « vm.swappiness = 1 » ne concerne pas TCP/IP, mais demande au système de limiter l’utilisation de l’espace d’échange situé sur disque (swap). Cet espace est utilisé par le système d'exploitation pour déplacer des données peu utilisées des programmes en cours d'exécution, afin d'utiliser l'espace libéré comme cache du système de fichiers.
Ce comportement risque de dégrader les performances réseau au moment où des données peu utilisées en mémoire vive sont mises dans le SWAP. Afin de fiabiliser le flux de données généré par le serveur, on met « vm.swappiness = 1 », ce qui permet de limiter l’utilisation du swap aux cas où c’est nécessaire.


djgreg13

  • Abonné Orange Fibre
  • *
  • Messages: 54
  • Strasbourg (67)
Algo de contrôle de la congestion TCP: BBR
« Réponse #154 le: Hier à 22:57:59 »
J'ai tenté avec ton paramètre, ça reste catastrophique, pas de suite, ça a commencé au 7ème run.


Citer
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  56.2 MBytes   472 Mbits/sec
[  5]   1.00-2.00   sec  79.8 MBytes   670 Mbits/sec
[  5]   2.00-3.00   sec  79.6 MBytes   667 Mbits/sec
[  5]   3.00-4.00   sec  6.30 MBytes  52.8 Mbits/sec
[  5]   4.00-5.00   sec  4.60 MBytes  38.6 Mbits/sec
[  5]   5.00-6.00   sec  3.76 MBytes  31.6 Mbits/sec
[  5]   6.00-7.00   sec  5.62 MBytes  47.1 Mbits/sec
[  5]   7.00-8.00   sec  6.07 MBytes  50.9 Mbits/sec
[  5]   8.00-9.00   sec  6.75 MBytes  56.6 Mbits/sec
[  5]   9.00-10.00  sec  6.52 MBytes  54.7 Mbits/sec

Et une fois que c'est comme ça, la relance de carte ne marche pas à tous les coups, là je suis bon à relancer le kernel et les débits sont de retour, mais pour combien de temps, avec iPerf3, j'arrive à l'envoyer dans le mur relativement rapidement.

La j'ai basculé du coup sur la passerelle de secours qui est là même et ça donne ça :
Citer
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  66.9 MBytes   561 Mbits/sec
[  5]   1.00-2.00   sec  93.4 MBytes   784 Mbits/sec
[  5]   2.00-3.00   sec  87.4 MBytes   734 Mbits/sec
[  5]   3.00-4.00   sec  85.5 MBytes   718 Mbits/sec
[  5]   4.00-5.00   sec  90.4 MBytes   758 Mbits/sec
[  5]   5.00-6.00   sec  88.0 MBytes   738 Mbits/sec
[  5]   6.00-7.00   sec  89.5 MBytes   751 Mbits/sec
[  5]   7.00-8.00   sec  88.1 MBytes   739 Mbits/sec
[  5]   8.00-9.00   sec  89.2 MBytes   749 Mbits/sec
[  5]   9.00-10.00  sec  90.3 MBytes   757 Mbits/sec

et je relance la passerelle primaire, je poste dès qu'elle a reboot

Edit : mauvaise nouvelle, je ne retrouve plus le débit, je suis passé en UDP à une cadence de 800 Mbit/s sur iperf3 et là le débit est là

Citer
-----------------------------------------------------------
Server listening on 5201 (test #2)
-----------------------------------------------------------
Accepted connection from 10.0.99.30, port 35310
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  3.92 MBytes  32.9 Mbits/sec
[  5]   1.00-2.00   sec  5.31 MBytes  44.5 Mbits/sec
[  5]   2.00-3.00   sec  8.10 MBytes  67.9 Mbits/sec
[  5]   3.00-4.00   sec  8.31 MBytes  69.7 Mbits/sec
[  5]   4.00-5.00   sec  6.71 MBytes  56.3 Mbits/sec
[  5]   5.00-6.00   sec  3.59 MBytes  30.1 Mbits/sec
[  5]   6.00-7.00   sec  7.60 MBytes  63.7 Mbits/sec
[  5]   7.00-8.00   sec  7.87 MBytes  66.0 Mbits/sec
[  5]   8.00-9.00   sec  6.01 MBytes  50.4 Mbits/sec
[  5]   9.00-10.00  sec  5.62 MBytes  47.1 Mbits/sec
[  5]  10.00-10.02  sec   174 KBytes  60.0 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.02  sec  63.2 MBytes  52.9 Mbits/sec                  receiver
-----------------------------------------------------------
Server listening on 5201 (test #3)
-----------------------------------------------------------
Accepted connection from 10.0.99.30, port 56570
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-1.00   sec  78.9 MBytes   662 Mbits/sec  0.020 ms  9633/70137 (14%)
[  5]   1.00-2.00   sec  81.1 MBytes   681 Mbits/sec  0.024 ms  10938/73138 (15%)
[  5]   2.00-3.00   sec  81.1 MBytes   680 Mbits/sec  0.027 ms  10903/73076 (15%)
[  5]   3.00-4.00   sec  81.1 MBytes   680 Mbits/sec  0.010 ms  10940/73087 (15%)
[  5]   4.00-5.00   sec  81.0 MBytes   680 Mbits/sec  0.021 ms  11016/73107 (15%)
[  5]   5.00-6.00   sec  81.1 MBytes   680 Mbits/sec  0.031 ms  10969/73099 (15%)
[  5]   6.00-7.00   sec  81.2 MBytes   681 Mbits/sec  0.019 ms  10873/73093 (15%)
[  5]   7.00-8.00   sec  81.1 MBytes   681 Mbits/sec  0.026 ms  10911/73102 (15%)
[  5]   8.00-9.00   sec  81.1 MBytes   681 Mbits/sec  0.017 ms  10913/73102 (15%)
[  5]   9.00-10.00  sec  81.1 MBytes   680 Mbits/sec  0.024 ms  10982/73108 (15%)
[  5]  10.00-10.25  sec  3.22 MBytes   106 Mbits/sec  0.020 ms  472/2939 (16%)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-10.25  sec   812 MBytes   664 Mbits/sec  0.020 ms  108550/730988 (15%)  receiver

« Modifié: Hier à 23:42:58 par djgreg13 »

djgreg13

  • Abonné Orange Fibre
  • *
  • Messages: 54
  • Strasbourg (67)
Algo de contrôle de la congestion TCP: BBR
« Réponse #155 le: Aujourd'hui à 00:48:08 »
Hello

J'ai continué à faire pleins de tests et il y'a un comportement étrange

Si le iperf a un débit faible alors il suffit de le relancer et le débit va revenir

J'ai fais des iperfs long (2 min), si le débit est bon à l'établissement alors ça tient dans le temps, si le débit est catastrophique alors Cwnd est faible et le débit restera catastrophique pour toute la session tcp en cours, j'ai testé en cubic, Reno, bbr, et ce comportement ce reproduit

En iperf udp, pas de soucis, le débit est fort et plafonne à la valeur de -b que j'ai mis à 800M

Je ne sais pas si c'est un bug du wireguard kernel de Linux 6.8 ou  un soucis de réglage sur tcp pour mieux fonctionner à travers le wireguard