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)


  1. nikhotmsk
    04.08.2021 22:22
    +1

    Актуально. Я как раз пишу программу для видео-конференций на GTK. Хочу посмотреть, как она себя поведет на медленном соединении


  1. telesis
    05.08.2021 12:31

    Актуальненька, надо попробовать!


  1. Golex
    02.09.2021 11:01

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

    Это прям план отдельной статьи! Бомба будет, если написать в стиле блога Крока.


  1. alliumnsk
    12.10.2021 20:11

    Низкоорбитальные спутники могут в теории дать меньшие задержки чем наземные линии т.к. скорость света в атмосфере почти равна скорости света в вакууме, а не ~1.5 раза медленее как в стекле.


  1. Greendq
    12.10.2021 22:26

    Слишком скомкано как-то. Винду упомянули, скрин Clumsy показали, но ничего про него не написали.