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 выглядят иначе:
Уникальность проекта Starlink состоит именно в том, что используется большое количество не стационарных, а низкоорбитальных спутников, чтобы гарантировать минимальную задержку, сравнимую с наземными каналами.
Естественно, профили Comcast можно редактировать или добавлять.
Разработчик Comcast допускает поддержку Windows через
wipfw
или встроенный сетевой стек. Но вообще под Windows уже есть похожие симуляторы. Например, программа clumsy на КДПВ, которая для работы задействует библиотеку WinDivert (Windows Packet Divert).В браузере Google Chrome тоже частично реализована такая функциональность. Этот режим работы (Device Mode) можно включить в инструментах разработчика (
F12
), нажав сочетание клавиш Ctrl
+ Shift
+ M
или кликнув соответствующую иконку в левом верхнем углу панели инструментов разработчика. Но здесь всего три варианта симуляции слабого железа и мобильного интернета.Для macOS есть продвинутый инструмент под названием Network Link Conditioner, который можно найти в пакете “Additional Tools for Xcode” или скачать со страницы для разработчиков (Additional Tools).
Здесь тоже изменяются стандартные параметры сети: полоса (аплинк и даунлинк), задержка и уровень потери пакетов.
В наличии следующие профили:
- 100% потеря пакетов
- 3G
- DSL
- EDGE
- Большая задержка DNS
- LTE
- Очень плохая сеть
- WiFi
- WiFi 802.11ac
Или и создаём собственный профиль с произвольными параметрами:
Более того, Network Link Conditioner реализован в iOS, если подключить гаджет к персональному компьютеру и активировать настройки для разработчиков через Xcode (Window — Devices & Simulators — “Use for Development”).
Наверняка это не полный список симуляторов плохой сети. Пользователи Comcast в шутку предлагают реализовать ряд патологических состояний, которые встречаются у коммерческих провайдеров и в корпоративных сетях: несколько уровней NAT со странными настройками, заблокированные случайные порты, странные сетевые «оптимизации», очень медленные ответы DNS и так далее.
1 Примечание. Comcast — крупнейший в США оператор кабельного телевидения и широкополосного доступа в интернет. [вернуться]
Комментарии (5)
Golex
02.09.2021 11:01Пользователи Comcast в шутку предлагают реализовать ряд патологических состояний, которые встречаются у коммерческих провайдеров и в корпоративных сетях: несколько уровней NAT со странными настройками, заблокированные случайные порты, странные сетевые «оптимизации», очень медленные ответы DNS и так далее.
Это прям план отдельной статьи! Бомба будет, если написать в стиле блога Крока.
alliumnsk
12.10.2021 20:11Низкоорбитальные спутники могут в теории дать меньшие задержки чем наземные линии т.к. скорость света в атмосфере почти равна скорости света в вакууме, а не ~1.5 раза медленее как в стекле.
Greendq
12.10.2021 22:26Слишком скомкано как-то. Винду упомянули, скрин Clumsy показали, но ничего про него не написали.
nikhotmsk
Актуально. Я как раз пишу программу для видео-конференций на GTK. Хочу посмотреть, как она себя поведет на медленном соединении