2015-04-02 5 views
1

Je cherche à simuler des retards pour un ensemble de services qui s'exécutent sur différents ports d'un hôte. Je voudrais simuler différents retards pour différents services, potentiellement beaucoup sur un hôte donné, sans aucune limite.tc: attacher de nombreux netems à une interface

La seule façon que j'ai trouvé pour faire ceci est avec un prd qdisc. Voici un exemple:

IF=eth0 
tc qdisc add dev $IF root handle 1: prio bands 16 priomap 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

# this loop is only a sample to make the example runnable; values will vary in practice 
for handle in {2..16}; do 
# add a delay for the service on port 20000 + $handle 
tc qdisc add dev $IF handle $handle: parent 1:$handle netem delay 1000ms # example; this will vary in practice 
# add a filter to send the traffic to the correct netem 
tc filter add dev $IF pref $handle protocol ip u32 match ip sport $((20000 + $handle)) 0xffff flowid 1:$handle 
done 

Si vous exécutez la commande ci-dessus, vous remarquerez que les poignées 11-16 ne sont pas créés et échouent avec une erreur.

NB. Voici une annulation pour ce qui précède.

IF=eth0 
for handle in {2..16}; do 
tc filter del dev $IF pref $handle 
tc qdisc del dev $IF handle $handle: parent 1:$handle netem delay 1000ms 
done 
tc qdisc del dev $IF root 

Est-il possible d'ajouter plus de 10 netems à une interface?

Répondre

1

Résolu à l'aide de HTB et les classes:

IF=eth0 
tc qdisc add dev $IF root handle 1: htb 
tc class add dev $IF parent 1: classid 1:1 htb rate 1000Mbps 

for handle in {2..32}; do 
tc class add dev $IF parent 1:1 classid 1:$handle htb rate 1000Mbps 
tc qdisc add dev $IF handle $handle: parent 1:$handle netem delay 1000ms 
tc filter add dev $IF pref $handle protocol ip u32 match ip sport $((20000 + $handle)) 0xffff flowid 1:$handle 
done