lid's stuff

Limiter la bande passante d'une machine

Problématique

Récemment, j'ai reçu un joli message d'un hébergeur avec qui un de mes clients travaille. En substance:
"Vous dépassez la bande passante maximum autorisée sur votre machine XYZ, si vous ne résolvez pas le problème au plus vite on vous coupe tout!". Bon le matin, y'a de quoi en avaler de travers son café.

Après vérification, en effet, la machine en question tapait allègrement au-dessus des 500Mbps autorisés: elle "maxait" son port Gigabit (normal, elle propose du contenu en téléchargement, la vitesse de téléchargement côté utilisateurs n'étant pas, par contre, une priorité ). Oups.

Il fallait donc trouver une solution rapidement.

Méthode "bon vieux temps"

Pour l'avoir utilisé il y a longtemps (il date de 2002), j'ai pensé au bon vieux wondershaper, ça tombe bien, le technicien chez l'hébergeur me le conseillait aussi dans son ticket:

sudo wondershaper eth0 500000 500000

aurait dû limiter la BP à 500000 kbps en down comme en up. Eh beh non. J'avais toujours un joli graphe m'indiquant que ça moulinait à 1Gbps. Donc le bon vieux wondershaper… ne fonctionne plus sur une distribution récente. Oups²

Méthode moderne

Bon, alors, wondershaper, il faisait quoi à la base? Il jouait avec les règles de traffic shaping et de QoS du noyau. Hors maintenant, on utilise iproute2. Et iproute2 a la bonne idée de proposer un utilitaire dédié, sympathiquement nommé tc.

Alors la syntaxe est assez… ésotérique au premier abord, et il y a des tonnes d'exemples assez foireux disponibles en ligne, mais on peut vraiment, vraiment faire plein plein de jolie QoS avec cet outil. Ça vaut le coup de lire un peu la manpage. Bon ma problématique étant simple, je ne vais pas rentrer dans les détails, mais pour limiter le trafic entrant et sortant sur une interface, ici eth0, ça se fait facilement:

# tc qdisc add dev eth0 handle 1: root htb default 11
# tc class add dev eth0 parent 1: classid 1:1 htb rate 499mbit
# tc class add dev eth0 parent 1:1 classid 1:11 htb rate 499mbit

On crée en premier la règle qdisc pour eth0, on va utiliser htb pour gérer notre file d'attente (plus simple que qdisc cbq).

Ensuite on limite en réception et en envoi à 499 megabits par seconde. Oui on utilise "mbit" pour l'unité et pas "mbps"…

On peut vérifier que nos règles s'appliquent bien:

# tc class ls dev eth0
class htb 1:11 parent 1:1 prio 0 rate 499Mbit ceil 499Mbit burst 1497b cburst 1497b
class htb 1:1 root rate 499Mbit ceil 499Mbit burst 1497b cburst 1497b

Si on veut effacer nos règles:

# tc qdisc del dev eth0 root

Et voilà, un joli graphe qui cappe à 62,5 Mo/s (soit 500 Mbps / 8 bits, comme prévu) au lieu de bourriner à 125Mo/s, et un technicien content côté hébergeur. Idéalement on créera une petite unité systemd pour que ce soit persistant au redémarrage. Je peux donc finir mon café, yeah!

avantapres


Tagged under: network, sysadmin, linux