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

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

Bandwidth

3850(config)#policy-map policer-bw
3850(config-pmap)#class class-default
3850(config-pmap-c)#shape average percent 30
3850(config-if)#service-policy output policer-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

IXIA

Ixia Traffic Impairment – аппаратные ухудшители трафика на FPGA. Мега точность ухудшения. Ухудшаем только часть трафика.

 

VMWare Fusion

VMware Fusion можно ограничивать полосу для VM, генерировать потери пакетов и задержки (Network Simulation Settings) на разных сетевых интерфейсах. Без использования отдельных утилит аля TC. Безусловно точно далеко не так высока, как у TC, не говоря про 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.

Продвинутые
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.
Wanem

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

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

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

самый продвинутый, но довольно сложный инструмент. Тут можно как шейпить трафик, так и снижать его характеристики (traffic impairment).

Большая часть – конспект из этой статьи на 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
 
iptables

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

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

Leave a Reply