Forum Linux.noyau Limitation de la bande passante avec tc

Posté par  .
Étiquettes : aucune
0
24
jan.
2011
Bonjour,

je cherche à limiter sur un serveur de backup la bande passante utilisée par des dump postgresql à 30mbps maximum.
En fouillant je n'ai rien trouvé d'autre que d'utiliser "tc" pour le faire, donc en suivant plusieurs howto j'ai ce script:

tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: htb default 1 r2q 160
tc class add dev eth0 parent 1: classid 1:1 htb rate 32000kbit burst 1m
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 32000kbit ceil 32000kbit burst 1m
tc class add dev eth0 parent 1:1 classid 1:3 htb rate 1000kbit ceil 1000kbit burst 1m
tc filter add dev eth0 protocol ip parent 1:2 prio 1 handle 12 fw flowid 1:2
tc filter add dev eth0 protocol ip parent 1:3 prio 1 handle 13 fw flowid 1:3
tc qdisc add dev eth0 parent 1:2 handle 2: sfq perturb 10
tc qdisc add dev eth0 parent 1:3 handle 3: sfq perturb 10

La 3eme classe est là juste pour tester. J'ai aussi ces règles dans mon firewall:

iptables -t mangle -A POSTROUTING -o eth0 -m tcp -m mark -p tcp --sport 5432 -j CLASSIFY --set-class 1:2 --mark 0x12
iptables -t mangle -A POSTROUTING -o eth0 -m tcp -m mark -p tcp --sport 80 -j CLASSIFY --set-class 1:3 --mark 0x13

Ce que je veux c'est que le trafic provenant d'un serveur pgsql n'utilise pas plus de 32 Mbps, et que le trafic provenant d'un serveur http n'utilise pas plus de 1 Mbps (afin de tester).

Le problème c'est qu'après avoir appliqué ces scripts, en faisant un wget du dernier kernel la vitesse monte à 8 voire 9 Mo/s, ce qui fait plus de 64 Mbps, donc clairement ça ne fonctionne pas.

Du coup je me demande, est-ce que tc est capable de faire ce que je veux ? Là j'ai l'impression qu'il ne limite pas tant que la bande passante est suffisante, autrement dit que si j'avais un trafic quelconque qui voudrait utiliser 90 Mbps, il pourrait pas car tc garantit 30 Mbps au trafic pgsql.
Ce ne sont que des suppositions, j'ai pas lu le manuel en entier.

Merci d'avance.
  • # tc limite la bande passante qui sort

    Posté par  . Évalué à 3.

    Tout est dans le titre. Tc ne peut que limiter la bande passante de ton interface en débit sortant. Il me semble que tu veux faire le contraire d’après les règles que tu as données. Ai-je bon ? Si oui, trois solutions : faire ton réglage sur chacun des serveurs qui envoient les données ; avec un routeur faire le réglage sur l’interface interne (qui parle au réseau privé) ; ou utiliser ifb.

    Voici le début de mon script en download avec ifb, ça devrait être suffisant pour comprendre comment ça fonctionne :
    IFB=ifb0
    DEV=eth0
    DOWNLINK=75
    modprobe ifb
    ip link set dev $IFB up
    tc qdisc add dev $DEV ingress
    tc filter add dev $DEV parent ffff: protocol ip \
    u32 match ip dst 0/0 action mirred egress redirect dev $IFB
    tc qdisc add dev $IFB root handle 1:0 htb default 1
    tc class add dev $IFB parent 1:0 classid 1:1 htb \
    rate ${DOWNLINK}kbps
    • [^] # Re: tc limite la bande passante qui sort

      Posté par  . Évalué à 1.

      Effectivement c'est bien le trafic entrant que je veux limiter. Je savais pas que tc ne s'appliquait que sur le trafic sortant...

      J'ai pas spécialement envie de mettre un iptables/tc sur le serveur de prod donc je vais voir du côté d'ifb.
      Merci.
  • # Chez moi

    Posté par  . Évalué à 3.

    Salut,

    J'utilise aussi tc et après quelques tests je pense que ça fonctionne chez moi. Voici par exemple comment je limite le trafic HTTP:


    if [ $(tc -d qdisc show dev eth0 | wc -l) != "1" ]; then
    tc qdisc del dev eth0 root
    fi
    iptables -t mangle -F

    tc qdisc add dev eth0 root handle 1: htb default 99 r2q 5

    # Classe HTTP = 40
    tc class add dev eth0 parent 1:0 classid 1:40 htb rate 256kbit burst 2k prio 4
    tc qdisc add dev eth0 parent 1:40 handle 140: sfq perturb 10
    tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 40 fw flowid 1:40

    # Marquage des paquets HTTP
    iptables -t mangle -A POSTROUTING -o eth0 -p tcp --tcp-flags SYN,ACK SYN,ACK --sport 80 -j CONNMARK --set-mark 40
    # Restore la marque sur les paquets identiques
    iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark


    En débit instantané je dépasse parfois les 256Kbps définis mais en débit moyen ça à l'air d'être environ 256Kbps.

    Pour information, l'attribut mbit est aussi compris par tc.
  • # ip_relay

    Posté par  (site Web personnel) . Évalué à 1.

    j'ai utilisé ip_realy (un proxy) pour tester un site web avec une bande passante limité.

    tu peux peut-être l'utiliser ?
    http://www.stewart.com.au/ip_relay/
    • [^] # Re: ip_relay

      Posté par  . Évalué à 1.

      Merci, je vais voir ça.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.