Как симулировать плохую сеть под Linux, macOS и Windows

Kate

Administrator
Команда форума
btpy2sbvasa83emseeph5fa3av4.gif

Clumsy 0.2

Все распределённые системы — базы данных, мобильные приложения, корпративные SaaS и так далее — следует разрабатывать с учётом сбоев. Например, компания Stripe во время тестов убивала случайные инстансы — и смотрела, что произойдёт. Компания Netflix рандомно уничтожала инстансы прямо в продакшне с помощью программы Chaos Monkey (проект Simian Army).

Симуляция сбоев — необходимое средство тестирования. Проблема в том, что ситуации не делятся только на чёрное и белое, Есть огромная «серая» зона, где сбои явно не выражены, а проявляются в плохих условиях сети: ненадёжное соединение, узкий канал, потери пакетов, высокая задержка, дубликаты пакетов и так далее.
Другими словами, система должна быть устойчива не только к сбоям, но и к враждебным окружающим условиям — плохой сети. Специально для таких тестов был разработан симулятор Comcast1, представляющий удобную «обёртку» вокруг стандартных системных инструментов типа iptables и tc.

Инструмент работает путём упаковки некоторых системных инструментов в переносимый «контейнер». В системах семейства BSD, таких как mac OS, для «инъекции сбоя» используются ipfw и pfctl. В Linux — iptables и tc.

В любом случае, поддерживается несколько параметров: устройство, задержка, целевая/дефолтная пропускная способность, потеря пакетов, протокол и номер порта.

Например, такая команда…

$ comcast --device=eth0 --latency=250 --target-bw=1000 --default-bw=1000000 --packet-loss=10% --target-addr=8.8.8.8,10.0.0.0/24 --target-proto=tcp,udp,icmp --target-port=80,22,1000:2000

… добавит 250 мс задержки, ограничит пропускную способность до 1 Мбит/с и отбросит 10% пакетов на указанные адреса по указанным протоколам на указанных портах. Ограничение 1 Мбит/с действует для всего исходящего трафика.

В принципе, соответствующие команды можно запускать и без помощи comcast, а напрямую через iptables или tc.

Например, дропнуть 10% входящих и исходящих пакетов с помощью iptables в Linux:

$ iptables -A INPUT -m statistic --mode random --probability 0.1 -j DROP

$ iptables -A OUTPUT -m statistic --mode random --probability 0.1 -j DROP

В tc ещё больше параметров:

$ tc qdisc add dev eth0 root netem delay 50ms 20ms distribution normal

$ tc qdisc change dev eth0 root netem reorder 0.02 duplicate 0.05 corrupt 0.01

Comcast поддерживает следующие сетевые профили:

Название​
Задержка​
Полоса​
Потеря пакетов​
GPRS (good)​
500​
50​
2​
EDGE (good)​
300​
250​
1.5​
3G/HSDPA (good)​
250​
750​
1.5​
DIAL-UP (good)​
185​
40​
2​
DSL (poor)​
70​
2000​
2​
DSL (good)​
40​
8000​
0.5​
WIFI (good)​
40​
30000​
0.2​
Starlink​
20​
-​
2.5​

Как видим, разработчик уже добавил в профили Starlink с задержкой 20 мс и потерей пакетов 2,5%. Судя по всему, размер пинга взят из планов Илона Маска на будущее. В реальности же пока средние параметры по итогам практического опыта использования Starlink выглядят иначе:

afrtfs-oycfgndc2q8qcnupntzu.jpeg


nlnvylpsvcxe1srnz6c-tgfgck8.png


4g4c4cajo0dcriqkt18adwnfpla.png


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

Естественно, профили Comcast можно редактировать или добавлять.

Разработчик Comcast допускает поддержку Windows через wipfw или встроенный сетевой стек. Но вообще под Windows уже есть похожие симуляторы. Например, программа clumsy на КДПВ, которая для работы задействует библиотеку WinDivert (Windows Packet Divert).

В браузере Google Chrome тоже частично реализована такая функциональность. Этот режим работы (Device Mode) можно включить в инструментах разработчика (F12 ), нажав сочетание клавиш Ctrl + Shift + M или кликнув соответствующую иконку в левом верхнем углу панели инструментов разработчика. Но здесь всего три варианта симуляции слабого железа и мобильного интернета.

onsmuvat7gxgv6tkz_um34h48ra.png


Для macOS есть продвинутый инструмент под названием Network Link Conditioner, который можно найти в пакете “Additional Tools for Xcode” или скачать со страницы для разработчиков (Additional Tools).

qss03clgboexvnrfoqkg07cm-uq.png


Здесь тоже изменяются стандартные параметры сети: полоса (аплинк и даунлинк), задержка и уровень потери пакетов.

В наличии следующие профили:

  • 100% потеря пакетов
  • 3G
  • DSL
  • EDGE
  • Большая задержка DNS
  • LTE
  • Очень плохая сеть
  • WiFi
  • WiFi 802.11ac

Или и создаём собственный профиль с произвольными параметрами:

-lhy8fqtkfbzgpfe-v7rldm-scq.png


Более того, Network Link Conditioner реализован в iOS, если подключить гаджет к персональному компьютеру и активировать настройки для разработчиков через Xcode (Window — Devices & Simulators — “Use for Development”).

clg_6dc8ivksnszjpfgaendrc7a.png


Наверняка это не полный список симуляторов плохой сети. Пользователи Comcast в шутку предлагают реализовать ряд патологических состояний, которые встречаются у коммерческих провайдеров и в корпоративных сетях: несколько уровней NAT со странными настройками, заблокированные случайные порты, странные сетевые «оптимизации», очень медленные ответы DNS и так далее.

1 Примечание. Comcast — крупнейший в США оператор кабельного телевидения и широкополосного доступа в интернет.

 
Сверху