Browse Source

Document namespace stream bench and completion after consumer drain

master
evgeny 1 day ago
parent
commit
e78eaf45f7
  1. 26
      doc/stream.txt
  2. 12
      tests/stream_netns/README.md

26
doc/stream.txt

@ -674,3 +674,29 @@ OVERLOAD_SELECT: request_id:8, selected_count:1, handles:8*selected_count; не
Эти пределы общие для ручных выдач, INFO-only проб и автоматических перекрытий; исчерпание не обходится планировщиком. Эти пределы общие для ручных выдач, INFO-only проб и автоматических перекрытий; исчерпание не обходится планировщиком.
Снимки кандидатов — отдельно от DATA-кольца, по n субпотоков только у опрошенных узлов; Снимки кандидатов — отдельно от DATA-кольца, по n субпотоков только у опрошенных узлов;
невыбранные снимки освобождаются через 60с (либо после действующего backoff), не создают дополнительных DATA-буферов. невыбранные снимки освобождаются через 60с (либо после действующего backoff), не создают дополнительных DATA-буферов.
18. Стенд с реальной сетью Linux
Отдельный каталог tests/stream_netns; запуск вручную через make -C tests check-stream-netns.
16 процессов ядра/CHAT, по одному на veth в своём network namespace; 10 узлов за шестью NAT-шлюзами.
Три сегмента стран: RTT 50/100/150мс, jitter 2/5/10мс, loss 0.2/0.5/1% в одну сторону;
общая полоса межстрановых каналов 50/30/20Мбит/с. Внутри страны RTT около 2мс.
Задержки/потери — receiver ingress IFB/netem, полоса — WAN TBF; очереди ограничены, offload veth отключён.
Cone (EIM/EIF), restricted (EIM/APDF) и строгий NAT (ADM по IP назначения/APDF) проверяются реальными UDP-пробами до старта ядра.
Главный namespace не настраивается: новые user/mount/PID/network namespace, без uplink наружу и без именованных ip netns;
снимки адресов/маршрутов/rules/qdisc до и после сравниваются, естественный ход DHCP/cache timers исключается.
Членство создаётся штатным JOIN; источник/подписки распространяются штатным Merkle.
Перед стартом проверяются BGP-пути и подписанные профили всех участников, включая собственный профиль узла.
Нагрузка — opaque пачки 6+2 с sequence, ID источника, общей monotonic меткой времени и SHA256.
Проверяются DATA после FEC, порядок, явные GAP, конечный cursor, END, 32-МБ предел кольца и прекращение DATA после close подписки.
Baseline по умолчанию 120с реального времени; наблюдается оборот 16-битного source timestamp.
Дополнительный сценарий: уменьшение A-C до 2Мбит/с, RTT 300мс, loss 5%, восстановление и отключение двух подписчиков.
Источник можно выбрать за NAT; UDP, UDP+TCP и принудительный TCP доступны как отдельные режимы.
Снимки сохраняют пути субпотоков, rates/lag/stops, буферы, пробы/миграции и внешнюю one-way latency;
логи каждого процесса, команды network/tc/nft и PASS/FAIL с причиной находятся в каталоге запуска.
END, принятый от первого поставщика, сообщает границу источника, но не завершение локального потребителя.
Оптимизатор продолжает выбор/восстановление до consumer cursor > last_seq (либо подписанного пустого END).
Это проверяет регрессия test_stream_service: ранний END при неполной FEC-пачке не блокирует последующую DATA и END приложения.
Инструкция и параметры стенда: tests/stream_netns/README.md.

12
tests/stream_netns/README.md

@ -34,6 +34,12 @@ python3 tests/stream_netns/run.py --duration 120 --faults
python3 tests/stream_netns/run.py --publisher n05 --tcp --faults python3 tests/stream_netns/run.py --publisher n05 --tcp --faults
``` ```
Чтобы требовать именно TCP/STCP, без возможности выбрать UDP:
```sh
python3 tests/stream_netns/run.py --publisher n05 --tcp-only --duration 20
```
Ту же проверку запускает отдельная ручная цель: Ту же проверку запускает отдельная ручная цель:
```sh ```sh
@ -82,12 +88,14 @@ One-way latency измеряется по общему CLOCK_MONOTONIC ядра
По умолчанию результаты находятся в новом `tests/stream_netns/runs/<date-time>/`: По умолчанию результаты находятся в новом `tests/stream_netns/runs/<date-time>/`:
- `result.json` — PASS/FAIL, ошибка и фазы; `host-check.json` — сравнение основной сети, с исключением естественно уменьшающихся DHCP lifetime/cache timers. - `result.json` — PASS/FAIL, ошибка, фазы, транспорт, bitrate, наблюдаемые обороты timestamp и результат сравнения основной сети; `host-check.json` — снимок сравнения, с исключением естественно уменьшающихся DHCP lifetime/cache timers.
- `calibration.json`, `topology.json`, `namespaces.json` — измерения, параметры, PID и inode namespace. - `calibration.json`, `topology.json`, `namespaces.json` — измерения, параметры, PID и inode namespace.
- `samples.jsonl`, `final-stats.json`, `summary.csv` — доставленные записи, GAP, p50/p95/p99/max latency, буферы, пробы, миграции и пути каждого субпотока. - `samples.jsonl`, `final-stats.json`, `last-stats.json`, `summary.csv` — доставленные записи, GAP, p50/p95/p99/max latency, буферы, пробы, миграции, source timestamp, rates/lag/stops и пути каждого субпотока. Последний снимок сохраняется также при FAIL.
- `network.jsonl`, `network-initial.json`, `network-final.json`, `g_*.nft` — точные команды, ошибки, маршруты, tc counters и правила NAT. - `network.jsonl`, `network-initial.json`, `network-final.json`, `g_*.nft` — точные команды, ошибки, маршруты, tc counters и правила NAT.
- `nXX/utun.log`, `stderr.log`, `rpc.jsonl`, `node.conf`, `db/` — диагностика и состояние каждого процесса. Конфиги содержат **тестовые** приватные ключи. - `nXX/utun.log`, `stderr.log`, `rpc.jsonl`, `node.conf`, `db/` — диагностика и состояние каждого процесса. Конфиги содержат **тестовые** приватные ключи.
Категория `stream=debug`, JOIN/Merkle/BGP/connection — `info`; ошибки остальных категорий сохраняются. Для диагностики очередей можно запросить RPC `{"id":"1","op":"stats","loads":"1"}`; обычные снимки не опрашивают отсутствующие peer-load записи, чтобы не засорять лог. Stdout агента зарезервирован для JSONL. Категория `stream=debug`, JOIN/Merkle/BGP/connection — `info`; ошибки остальных категорий сохраняются. Для диагностики очередей можно запросить RPC `{"id":"1","op":"stats","loads":"1"}`; обычные снимки не опрашивают отсутствующие peer-load записи, чтобы не засорять лог. Stdout агента зарезервирован для JSONL.
Ctrl+C и нормальное завершение закрывают процессы и namespace. PID namespace с `--kill-child` также ограничивает время жизни процессов при аварии launcher; namespace не закрепляются mount-именами на хосте. Файлы результатов сохраняются для анализа. Ctrl+C и нормальное завершение закрывают процессы и namespace. PID namespace с `--kill-child` также ограничивает время жизни процессов при аварии launcher; namespace не закрепляются mount-именами на хосте. Файлы результатов сохраняются для анализа.
Короткий TCP-only прогон выявил остановку оптимизатора при END первого поставщика, до дочитывания потребителем FEC-пачки. Для этого случая добавлена регрессия в `test_stream_service`: END устанавливает подписанную границу, автоматические пробы и восстановление продолжаются до прохождения consumer cursor за эту границу. Стенд проверяет завершение у всех подписчиков, а не наличие END в одном сетевом handle.

Loading…
Cancel
Save