24/05/2010

Eeegw – part III – Quality Of Service aka QOS

Scheduler / Ordonnanceur

Mise en place des outils

En tout premier lieu vous aurez besoin de iptables et de iproute2
iproute2 est une suite d’utilitaires en ligne de commande qui vous permettent de manipuler les structures kernel liées aux couches réseau de votre machine.

Gentoo :

emerge -av iproute2 iptables

Debian :

apt-get install iptables iproute2

Verifiez que vous avez bien l’utilitaire tc :

eeegw:~# tc
Usage: tc [ OPTIONS ] OBJECT { COMMAND | help }
       tc [-force] -batch file
where  OBJECT := { qdisc | class | filter | action | monitor }
       OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -p[retty] | -b[atch] [file] }

Traduction du manuel de tc

Les “classful qdiscs” sont :

  • CBQ
  • “Class Based Queueing” implémente une hierarchie de classes. il contient des éléments de shaping comme des fonctions de prioritisations. Le shape est calculé à partir de latence et de taille de packets

  • HTB
  • “Hierarchy Token Bucket”
    HTB permet de garantir de la bande passante a une classe, définir des limites entre les classes et de fixer des priorités entre elles.

  • PRIO
  • PRIO qdisc n’effectue pas de traffic shapping en tant que tel, il permet juste de fixer des priorités entre les différents type de protocoles transitant dans le lien.
    PRIO permet de classifier les classes qui prennent en priorité de la bande passante, en ne laissant aux autres que ce qui reste de bande passante disponible.

    Qu’est-ce qu’une classe

    Une classe forme, en fait, un arbre avec des branches.
    Le but est de former une classe root qui va permettre de faire rentrer tout le trafic et, en fonction des protocoles, on va faire passer le traffic dans différentes branches.

    ici nous définissons nos classes root :

    ## On met en place la classe root pour la BP disponible.
    /sbin/tc qdisc add dev $EXTERNAL_IFACE root handle 1: cbq avpkt 1000 bandwidth $BNDWIDTH
    ## Match ici l'upload de la connexion
    /sbin/tc class add dev $EXTERNAL_IFACE parent 1: classid 1:1 cbq rate ${UPLINK}kbit allot 1500 prio 5 bounded isolated
    

    Datagrame IPv4 et Type Of Service : TOS

    Tableau des TOS possible dans un Datagram IPv4


    BinaireDécimalSignification
    1000 8Minimise le Délai (Minimize delay) (md)
    01004Maximalise le Débit (Maximize throughput) (mt)
    00102Maximalise la Fiabilité (Maximize reliability) (mr)
    00011Minimalise le Coût Monétaire (Minimize monetary cost) (mmc)
    00000Service Normal

    TOSBinaireDécimalSignificationPriorité LinuxBande
    0x000000Service Normal0 Best Effort1
    0x200011Minimise le Coût Monétaire (mmc)1 Filler2
    0x400102http://fr.wikipedia.org/wiki/Mod%C3%A8le_OSI0 Best Effort1
    0x600113mmc+mr0 Best Effort1
    0x801004Maximalise le Débit (mt)2 Masse2
    0xa01015mmc+mt2 Masse2
    0xc01106mr+mt2 Masse2
    0xe01117mmc+mr+mt2 Masse2
    0x1010008Minimise le Délai (md)6 Interactive0
    0x1210019mmc+md6 Interactive0
    0x14101010mr+md6 Interactive0
    0x16101111mmc+mr+md6 Interactive0
    0x18110012mt+md4 Int. Masse1
    0x1a110113mmc+mt+md 4 Int. Masse 14 Int. Masse1
    0x1c111014mr+mt+md4 Int. Masse1
    0x1e111115mmc+mr+mt+md4 Int. Masse1

    Exemple de ce qu’on peut faire avec TOS

    L’intérêt de la QoS sous Linux est très souvent associé à la priorisation de flux interactifs via iptables.
    Par exemple, vous ne souhaitez pas que votre session ssh lag à cause d’un utilisateur qui est en train de monopoliser la bande passante de votre réseau en téléchargeant une bande annonce sur internet ?
    Nous allons ici, à titre d’exemple, optimiser les trafics courants avec iptables, à savoir ssh :

    # Priorisation des connexions ftp et ssh 
    iptables -A PREROUTING -t mangle -p tcp -sport ssh -j TOS -set-tos Minimize-Delay  
    # On donne un maximum de débit aux transferts scp
    iptables -A PREROUTING -t mangle -p tcp -sport ssh -j TOS -set-tos Maximize-Throughput