Network/Linux: Shaping, Policing, Impairment, Traffic Control. Ограничение полосы пропускания (Linux: tc, wondershaper; Network: Cisco, Mellanox), внесение задержек и потерь в сетевой трафик

Влияние потери и задержек на Throughput подробно описано в отдельной статье.

Пример кейсов использования impairment:

    • эмуляция гео-распределенной сети
    • эмуляция wireless/satellite/mobile
    • приближение к real world
    • тестирование edge case сценариев

При этом в сетевом тестировании с impairment нужно обращаться “аккуратно”.

EANTC Carsten Rossenhoevel
The benchmarking methodology could be complemented with synthetic loss/delay, but this is out of scope of this draft ((netsecopen)). In fact, adding synthetic frame loss in TCP test environments often creates results that are quite cumbersome to interpret. We would not recommend it.

(tcp, impairment, metrics) Грубо говоря (взято отсюда):

    • без задержек с 2% потерями полоса деградирует в 20 раз,
    • с задержками 100мс и без потерь канал так же деградирует в 20 раз
    • каждые 30мс уменьшают производительность в +5 раз от исходных эталонных
    • когда в канале и задержки и потери – все, очевидно, еще печальней

Network devices
Пример работы полсера

Шейпер (по факту полсер) на mellanox сделан по baud rate, а не througput. Потери начинаются примерно ровно в 50% baud rate (как и настроено на девайсе), независимо от фактического размера payload.

Framesize Rx Throughput (% Line Rate) Rx Throughput (Mbps)
1472      50.1853004         49512.5752044
1408      50.1913476         49488.3875923
1344      50.1979646         49461.9240503
1280      50.2052332         49432.8450123
1216      50.2132581         49400.7458045
1152      50.2221625         49365.1289785
1088      50.2321001         49325.3834443
1024      50.2432680         49280.7533005
960         50.2558900         49230.2596314
832         50.2868496         49106.4070830
768         50.3061164         49029.3114288
704         50.3288090         48938.5104262
576         50.3889325         48698.0287265
384         50.5512663         48048.7284116
256         50.7868002         47106.5973284
192         51.0132740         46200.7009995
74           49.0080371         38580.7951303
74           49.0080360         38580.7943359
Config
Cisco 3850

Policer (работает на практике более стабильно)

3850(config)#policy-map policer-bw
3850(config-pmap)#class class-default
3850(config-pmap-c)#police rate percent 90
3850(config-pmap-c)#conform-action transmit # не обязательная строка (default)
3850(config-pmap-c)#exceed-action drop # не обязательная строка (default)

3850(config)#interface Gi1/0/1
3850(config-if)#service-policy output policer-bw

Shaper (работает на практике менее стабильно)

3850(config)#policy-map shaper-bw
3850(config-pmap)#class class-default
3850(config-pmap-c)#shape average percent 30

3850(config)#interface Gi1/0/1 3850(config-if)#service-policy output shaper-bw
3850(config-pmap-c)#shape average ?
<15000-100000000000>  Target Bit Rate (bits/sec). (postfix k, m, g optional; decimal point allowed)
  percent               % of interface bandwidth for Committed information rate

PPS

Policy Map system-cpp-policy
 Class system-cpp-police-dhcp-snooping
police rate 500 pps
conform-action transmit
exceed-action drop
#police rate 100 ?
bps Treat 'rate' value in bits-per-second
burst Specify 'burst' parameter
conform-action action when rate is less than conform burst
peak-rate Specify peak rate or PCR for single-level ATM 4.0 policer policies
pps Treat 'rate' value in packets-per-second
Mellanox
mlnx-sw1 [standalone: master] (config interface ethernet 1/49) # bandwidth shape 50G

 

VMWare Fusion

VMware Fusion можно ограничивать полосу для VM, генерировать потери пакетов и задержки (Network Simulation Settings) на разных сетевых интерфейсах. Без использования отдельных утилит аля TC. Безусловно точно далеко не так высока, как у TC, не говоря про Ixia Network Emulator или даже Apposite Technologies Linktropy – погрешность работы latency impairment в 10мс. Это значит, что при настройке в 200мс порчи нужно ожидать фактическую порчу в 200-210мс. 

https://docs.vmware.com/en/VMware-Fusion/12/com.vmware.fusion.using.doc/GUID-8C628EDA-16F1-412E-935B-FD21E56E34F0.html
https://docs.vmware.com/en/VMware-Workstation-Pro/16.0/com.vmware.ws.using.doc/GUID-7BFFA8B3-C134-4801-A0AD-3DA53BBAC5CA.html
You can use advanced virtual network adapter settings to limit the bandwidth, specify the acceptable packet loss percentage, and create network latency for incoming and outgoing data transfers for a virtual machine.
Expect actual network latency to be up to 10 ms above the number you set. For example, if you set latency at 200 ms, expect the actual latency to be between 200 to 210 ms.

 

Легковесные

Очень легковесные, но не слишком функциональные:

  • Trickle
  • wondershaper 

wondershaper – юзал для SOCKS5 proxy Dante, работает норм.

wondershaper An easy tool to limit bandwidth of a particular interface.

sudo apt-get install wondershaper
sudo wondershaper eth0 1024 1024 # if you want to limit the bandwidth of interface eth1 to 1024 kbps downlink and 1024 kbps uplink
sudo wondershaper clear eth0 #To clear the limit

Clumsy

Пример “урезанного”, но зато простого tc для Windows.

 

 

Продвинутые
Ixia: Network Emulator II, IMPAIRNET

Ixia Network Emulator II (Ixia Net Em) (brief video)– аппаратные ухудшители трафика на FPGA. Топовый из всех аппаратных ниже. Очень точный impairment напр. гранулярность задержки до 6.4 нс и макс. создаваемая задержка до 2 секунд для канала 10G. Мега точность ухудшения.  В том числе управление через API, запись небольших pcap и прочие полезные «bells and whistles”. Можно в том числе ухудшать только часть трафика.

Resolution (Min Delay Increment) 6.4 ns (наносекунды)

GPL Price для нового Ixia Network Emulator II – 30000 – 70000 USD

https://www.shi.com/Products/ProductDetail.aspx?SHISystemID=ShiCommodity&ProductIdentity=31927771
https://www.shi.com/product/30369287/Ixia-Network-Emulator-II%3A-Ethernet-10GE%2C-1GE-%26-100MbE-Network-Emulator-Software-and-8-Port-License-Bundle

Позволяет вносить управляемые (повторяемые) и точные (ухудшать часть трафика, гранулирование) потери/задержки к трафику.

Есть возможность вносить ухудшения 20G на одном устройстве в трафике или до 100G в схеме с использованием нескольких Ixia Network Emulator подключенных к packet broker Ixia Vision Edge E100.

Поддерживает управление как с использованием GUI, так и с использованием CLI.

Порты/банки портов
– Производительность на 1 банк (2 пары портов, 1-4 или 5-8) – 11Gbps
– Поддерживаются только SFP+ OTPLINK: SFP+ Avago SFBR709SMZ-DC1, DAC Intel FTLX8571D3BCV-IT, DAC кабели Cisco не поддерживаются

Настройки порчи:


ixia traffic generator
Какие то stateless генераторы трафика ixia поддерживают impairment на портах генерации – отдаешь два порта под это и получаешь impairment. Подробнее в Ixia Black Book QoS Validation.
The test verifies that drop and delay impairments can be introduced in the traffic stream based on precedence based traffic classifiers. The impairment profiles are independent of each other and each traffic flow is impaired independently. The drop and delay measurements can be used to verify the statistics report generated by DUT.
You can apply, reorder, and duplicate BER impairments in addition to drop impairment. Reorder and duplicate impairments are present in the Packet Actions tab.

Increase Delay Introduce delay to a maximum of 6s for every impairment profile on a 1G impairment module and to a maximum of 600 ms for a 10 G impairment module. Apply different kind of delays Introduce delay in us, ms or km. 1 km of WAN Link cause a delay of 5 us.
 

 
 
SPIRENT

Гранулярность задержки 20 микросекунд (<20µs).

Spirent Attero-100G (совместный продукт с Calnex) – очень точный impairment (напр. гранулярность задержки до 5 нс). 

Timing Accuracy  5 ns

 

Apposite Technologies Linktropy

Аппаратное решение, но не сказать что мега производительное и точное – каналы до 1 Gbps, минимальная задержка 100 мксек (Linux tc порядка 140 мксек, но плавающая по факту и для задач высокой точности не подходит). Для каких то кейсов такой производительности и такой минимальной задержки недостаточно – напр. тестирование самих генераторов, тестирование высокопроизводительных канальных устройств (шифраторы, macsec, L2VPN, etc).

Test your applications performance against potential network impairments by emulating network latency, bandwidth, constraints, jitter, and loss at speeds up to 1Gbps. Linktropy enables users to import live traffic, vary impairments, and measure their impact in real time.

https://www.manualslib.com/manual/1334452/Apposite-Technologies-Linktropy-Mini2.html?page=17#manual
The Delay parameter specifies the link latency in milliseconds, and is set independently for eachdirection.
Delay can be set from 0 milliseconds to 10 seconds. Entered values are rounded to the nearest 0.1 millisecond. The delay parameter will not reorder fram

 

 

 

Wanem

Старый, но работающий WANEM.

WANEM (Wide Area Network EMulator) — эмулятор глобальной сети. Позволяет эмулировать большое количество характеристик глобальной сети, в том числе джиттер, большие задержки, потерю пакетов, разрывы соединений и ряд других характеристик. Разрабатывается в Performance Engineering Research Centre, TATA Consultancy Services, в Индии, в Мумбаи (Mumbai). Распространяется с открытым исходным кодом по лицензии GPL.

Доступен в виде ISO-образа и образа виртуальный машины для VMware.
tc

самый продвинутый по функционалу, но довольно сложный инструмент. Тут можно как приоритизировать по очередям траки, так и шейпить и снижать его характеристики (traffic impairment). Для задач высокой точности (десятки микросекунд или наносекунды) не подходит – тут нужны аппаратные ухудшители на базе FPGA (Ixia Network Emulator).

Большая часть – конспект из этой статьи на habr.

Add/Change/Delete/Show

Add – добавлем, Delete – удаляем, Change – изменяем, Show – смотрим как политику, так и статистику по пакетам. Мне показалось удобнее всего не пользоваться вообще change, а при необходимости изменения политики просто удалять существующую. Поэтому все команды ниже без использования change.

tc qdisc add dev ens32 root netem delay 750ms  # create
tc -s qdisc show dev ens32 # show
tc qdisc change dev ens32 root netem rate 100ms # create
tc -s qdisc show dev ens32 # show
tc qdisc del dev ens32 root netem delay # удаляем через del

Пример вывода show (netem настроен для входящего трафика).

# tc -s qdisc ls dev ens34
qdisc netem 1: root refcnt 2 limit 1000 delay 1.0s
Sent 168 bytes 4 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc ingress ffff: parent ffff:fff1 ----------------
Sent 2528 bytes 31 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0

Пример порчи ICMP – задержка трафика, перемешивания пакетов, дублирование, порча, потери. Полный фарш (кроме bandwidth, но в ICMP его и не увидишь кроме как в виде потерь).

root@dut:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=110 time=416 ms
...
64 bytes from 8.8.8.8: icmp_seq=38 ttl=110 time=416 ms (DUP!)
64 bytes from 8.8.8.8: icmp_seq=39 ttl=110 time=416 ms
64 bytes from 8.8.8.8: icmp_seq=39 ttl=110 time=416 ms (DUP!)
64 bytes from 8.8.8.8: icmp_seq=40 ttl=110 time=416 ms
64 bytes from 8.8.8.8: icmp_seq=42 ttl=110 time=416 ms
64 bytes from 8.8.8.8: icmp_seq=43 ttl=110 time=416 ms
64 bytes from 8.8.8.8: icmp_seq=45 ttl=110 time=16.1 ms
64 bytes from 8.8.8.8: icmp_seq=45 ttl=110 time=416 ms (DUP!)
--- 8.8.8.8 ping statistics ---
54 packets transmitted, 44 received, +8 duplicates, 18.5185% packet loss, time 236ms
rtt min/avg/max/mdev = 15.930/377.491/417.494/117.894 ms

 

Misc

Смешанная “суровая” порча – 2 mbit bandwidth, 400 ms delay, 10% loss, 10% corrupt, 10% duplicate, 10% reorder. И более реальная на практике.

tc qdisc add dev ens2f0 root netem rate 2mbit delay 400ms loss 10% corrupt 10% duplicate 10% reorder 10%

# alternate
tc qdisc add dev ens2f0 root netem rate 5mbit delay 100ms loss 0.5% corrupt 0.5% duplicate 0.5% reorder 0.5%

Особенности “порчи” входящего трафика

Для порчи входящего трафика нужно использовать bridge или создавать интерфейс ifb (описано ниже), на который редиректим трафик с физического интерфейса через tc filter. Политики так же применяются к этому ifb интерфейсу.

By default, netem will only affect outbound traffic, not inbound.
How can I use netem on incoming traffic? You need to use the Intermediate Functional Block pseudo-device IFB. This network device allows attaching queuing discplines to incoming packets.

# initialization
modprobe ifb
ip link set dev ifb0 up
tc qdisc add dev ens34 ingress
tc filter add dev ens34 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0

# configure
tc qdisc add dev ifb0 root netem loss 1.5% latency 70ms

Пропускная способность – ограничиваем полосу 56 kbps или 5 mbps:

tc qdisc add dev ens2f0 root netem rate 56kbit 
tc qdisc add dev ens2f0 root netem rate 5mbit

Задержка в 500 миллисекунд, 1 секунду:

tc qdisc add dev lo root netem delay 500ms
tc qdisc add dev enp0s20f0 root netem latency 70ms
tc qdisc add dev lo root netem delay 1s # меняем на 1сек

Можно так же сделать задержку вариативной (на хабре подробно).

tc qdisc add dev lo root netem delay 500ms 400ms 50 distribution normal 

Потери – потери 50% от трафика. Есть три метода создания потерь, этот самый очевидный. Можно опционально указывать корреляцию 25% в рамках первого значения (напр. 50%) – тогда потери будут от 25% до 75%.

tc qdisc add dev lo root netem loss 50%
tc qdisc add dev lo root netem loss 50% 25%

Потери + задержка

tc qdisc add dev enp0s20f0 root netem loss 1.5% latency 70ms

Повреждение пакетов (фаззинг) с 50% вероятностью.

tc qdisc add dev lo root netem corrupt 50%

Дублирование пакетов с 50% вероятностью и корреляцией 25%.

tc qdisc add dev lo root netem duplicate 50% 25%

Перемешивание (реордеринг) пакетов – каждый пакет с указанной вероятностью будет отправлен без задержки или каждый n’ый пакет с указанной вероятностью будет отправлен без задержки. Остальные пакеты передаются с заданной задержкой.

tc qdisc add dev lo root netem delay 10ms reorder 25% 50%
tc qdisc add dev lo root netem delay 10ms reorder 25% 50% gap 5
TC QoS

Для начала продемонстрируем самый обычный случай, который, к счастью, достаточно прост. Допустим, что у нас имеется дисциплина PRIO, с дескриптором 10:, которая содержит три класса и нам нужно весь трафик, отправляемый на 22 порт и с 80 порта, отдать в самую высокоприоритетную полосу, тогда набор фильтров мог бы выглядеть так:

# tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match \ 
ip dport 22 0xffff flowid 10:1
# tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match \
ip sport 80 0xffff flowid 10:1
# tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2

О чем говорят эти строки? Они говорят: “Присоединить к eth0, к узлу 10:, фильтр u32, с приоритетом 1, который отбирает пакеты, направляемые на порт 22, и передает их в полосу 10:1”. Аналогичное высказывание делается относительно пакетов, отправленных с порта 80. И последняя строка говорит о том, что весь неклассифицированный трафик должен отправляться в полосу 10:2.

Tail drop очереди в 100 pps.

# tc -s qdisc ls dev eth0 
qdisc pfifo 8001: dev eth0 limit 100p
Sent 45894 bytes 681 pkts (dropped 0, overlimits 0)

https://www.opennet.ru/man.shtml?topic=tc-pfifo&category=8&russian=2
ALGORITHM
A list of packets is maintained, when a packet is enqueued it gets inserted at the tail of a list. When a packet needs to be sent out to the network, it is taken from the head of the list.
If the list is too long, no further packets are allowed on. This is called 'tail drop'.
PARAMETERS
limit
Maximum queue size. Specified in bytes for bfifo, in packets for pfifo.
The output of tc -s qdisc ls contains the limit, either in packets or in bytes, and the number of bytes and packets actually sent. An unsent and dropped packet only appears between braces and is not counted as 'Sent'.
In this example, the queue length is 100 packets, 45894 bytes were sent over 681 packets. No packets were dropped, and as the pfifo queue does not slow down packets, there were also no overlimits.
 
iptables

У iptables есть режим random, которым тоже можно внести нестабильность (по аналогии с tc), скажем в 1% потерь:

sudo iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

Leave a Reply