tc: присоединение множества нетемов к интерфейсу

Я хочу имитировать задержки для набора служб, которые работают на разных портах на хосте. Я хотел бы смоделировать разные задержки для разных служб, потенциально много на данном хосте, надеюсь, без каких-либо ограничений.

Я нашел единственный способ сделать это с помощью prio qdisc. Вот пример:

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

Если вы запустите приведенную выше команду, вы заметите, что дескрипторы 11-16 не создаются и завершаются с ошибкой.

NB. Вот отмена для вышеуказанного.

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

Есть ли способ добавить в интерфейс более 10 нетемов?


person Chris Adams    schedule 02.04.2015    source источник


Ответы (1)


Решил это с помощью htb и классов:

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
person Chris Adams    schedule 02.04.2015