Record duplex validation and remaining BBR follow-ups

This commit is contained in:
evgeny committed 2026-10-24 17:26:59 +02:00
1 parent 8ff4a0bf46
commit deee734e6c
2 files changed
+66 -13

No files matched your search

+50
View File
@@ -3,6 +3,56 @@ ETCP: независимая обратная связь каналов и до
Статус
24.10.2026: устранена недооценка BW из-за растяжения ACK обратной очередью.
Прежний max(send_us,ack_us,RX-bound) мог только уменьшать BW по точке приёма:
при разгоне дуплекса интервал ACK 181424 мкс перекрывал RX-bound 130689 мкс
и send 138456 мкс. STARTUP завершался с оценкой около 5.2 Мбит/с на пути 8 Мбит/с.
Отключение только PROBE_RTT или только задержечного выхода STARTUP не устраняло все FAIL.
При достоверных положительных RX-дельтах теперь interval=max(send_us,RX-bound),
RX-bound=ceil(delivered*delta_rx_us/delta_rx_bytes). Без базы/прогресса остаётся
max(send_us,ack_us). Сохраняются send-граница против сжатия времени, проверка пары,
монотонность точки, защита от переполнения и очистка после idle/reset.
Изменён только выбор часов BW: wire, RTT/min_rtt, окно, RTO, ACK deadlines и очереди прежние.
DEBUG ACK показывает clock=RX/ACK и исходные send/ACK/RX интервалы.
Регрессия до фикса FAIL: /tmp/etcp-rx-clock-before.log. Новые точные сценарии
увеличивают ACK-интервал 20->100мс при неизменной доставке, проверяют send-границу,
неизвестную/нулевую RX-дельту и отсутствующую базу. test_etcp_windows: 61 сценарий PASS
с обоими режимами часов; BBR 20/20 и ещё пять профильных ETCP-тестов PASS.
Восемь ASAN/UBSan-тестов ETCP/STCP с detect_leaks=1 PASS без ошибок/утечек.
Полный check.sh после rebase и этого фикса: 186/186, proxy 9/9, burst 1/1,
load 8/8 PASS, 134217728 проверенных байт; 201с со сборкой.
Полная последовательная матрица: все 7 скоростных и 9 отказных профилей PASS.
Goodput агрегата, Мбит/с: equal 14.711/16, bandwidth 9.093/10, rtt 14.296/16,
fast-distant 8.860/10, slow-distant 9.074/10, three 10.761/12, дуплекс 8.768/8.789 из10.
В этом прогоне одиночный дуплекс 2Мбит/с — 1.730/1.775, 8Мбит/с — 7.078/7.080.
В трёх прогонах рабочего кода (матрица и два отдельных) путь 8Мбит/с даёт
7.045..7.081 в обе стороны; агрегат 8.768..8.801 / 8.700..8.820 проходит каждый раз.
Ранних ACK-пакетов 0, retries в steady дуплекса 0, пик очереди 22.5/23.4/27.8мс;
ACK на одиночном 8Мбит/с пути занимает 0.170..0.180Мбит/с.
В третьем прогоне остаётся один FAIL 2Мбит/с: 1.672<1.700Мбит/с. Общая задача открыта;
разовый PASS полной матрицы не закрывает нестабильность малого одиночного дуплекса.
Two-stuck: gap 223.404мс, max latency 377.634мс. Load-drop/load-hold: gap 42.841/57.655мс,
steady 7.227/7.492 из8Мбит/с, max latency насыщенного источника 174.541/102.388мс.
Дальше: отдельно диагностировать 2Мбит/с, затем STCP backpressure, смену RTT/BW и повторный отказ.
До проверки смены RTT исправить подтверждённый дефект возраста min_rtt:
при копировании старого probe_rtt_min_us min_rtt_stamp_tb обновляется на каждом ACK.
Точный стенд с единственным RTT=20мс и последующими RTT=100мс удерживает старый минимум
15100мс вместо окна 10000мс. Нужны время исходного минимума, регрессии возраста и TB wrap;
это отдельное изменение контроллера, к семисекундным steady-замерам не относится.
Стенд/лог: /tmp/etcp-min-rtt-stamp-probe.c/.mk/.log.
Логи: /tmp/etcp-rx-clock-{windows,windows-real,bbr,full-check}.log,
/tmp/etcp-rx-clock-asan-*.log, /tmp/etcp-rx-clock-matrix.log/.csv,
/tmp/etcp-rx-clock-matrix-diag.csv, /tmp/etcp-rx-clock-duplex-{2,3}.log/.csv.
8372 среза матрицы проверены tools/etcp_diag_report.py; отчёт /tmp/etcp-rx-clock-matrix.html,
сводка /tmp/etcp-rx-clock-summary.json. Контрольные прототипы: /tmp/etcp-bbr-next-*.
Предыдущий этап: абсолютные сроки ACK.
24.10.2026: исправлены абсолютные сроки ACK и конкуренция ACK/DATA разных путей.
Обычный ACK-only обслуживается от received_at_us головы своего пути + 2 мс;
piggyback готового DATA и срочный ответ остаются немедленными. Среди готовых ACK
+16 -13
View File
@@ -102,19 +102,22 @@
Windows/FreeBSD runtime не проверялся.
[ ] **ETCP: полезная утилизация нескольких каналов и доставка при зависании части линков** — общая задача открыта.
24.10.2026: исправлен обход срока ACK посторонним wake. Абсолютный срок головы пути +2 мс,
один общий таймер, пересчёт после piggyback/частичной отправки; новые DATA не отодвигают старые ACK.
Наступивший ACK другого пути имеет приоритет перед DATA; свой DATA забирает его piggyback.
Сохранены срочный ответ, bounded burst, OOM fallback и очистка при reset/close; wire/BBR/RTO не менялись.
Windows 60 сценариев с обоими режимами часов PASS; восемь ASAN/UBSan-тестов и ASAN two-stuck без ошибок/утечек.
В трёх дуплексных прогонах ранних ACK-пакетов 0; на 8 Мбит/с ACK занимают 0.143..0.169 вместо прежних 0.347/0.390 Мбит/с.
Агрегат проходит все свои пороги: 8.667..8.804 / 8.695..8.796 из 10 Мбит/с; одиночные каналы ещё дают FAIL.
Полная матрица: первые 6 скоростных профилей и все 9 профилей отказов PASS, агрегат дуплекса 8.750/8.768.
Остались 2 FAIL одиночного дуплекса: 1.609<1.700 и 6.730<6.800 Мбит/с; дальше разбирать BW/PROBE_RTT и STCP backpressure.
Load-drop/load-hold: паузы 41.402/41.845 мс, steady 7.229/7.466 из 8 Мбит/с; max latency 180.693/89.239 мс записана.
Check.sh 184/184, proxy 9/9, burst 1/1, load 8/8 PASS, 134217728 проверенных байт, 185 с.
Диагностика 106 полей различает раннюю запись в готовой пачке и отправку всего ACK-пакета раньше срока.
Логи/CSV: /tmp/etcp-ack-deadline-*; HTML: /tmp/etcp-ack-deadline-duplex.html; детали — doc/etcp_multipath_plan.txt.
24.10.2026: исправлена недооценка BW растянутыми ACK: достоверный RX clock заменяет ACK clock,
interval=max(send_us,ceil(delivered*delta_rx_us/delta_rx_bytes)); без RX-базы/прогресса max(send_us,ack_us).
Сохранены send-граница, проверка пары/переполнения/idle и логические ACK; wire/RTT/RTO/окно не менялись.
DEBUG ACK показывает исходные интервалы и выбранные часы. До фикса точная регрессия FAIL, после PASS.
test_etcp_windows: 61 сценарий с обоими режимами часов PASS; BBR 20/20, восемь ASAN/UBSan-тестов без ошибок/утечек.
Check.sh 186/186, proxy 9/9, burst 1/1, load 8/8 PASS, 134217728 проверенных байт, 201с.
Полная последовательная матрица: все 7 скоростных и 9 отказных профилей PASS; дуплексный агрегат 8.768/8.789 из10.
Три прогона рабочего кода: одиночный 8Мбит/с даёт 7.045..7.081 в обе стороны, агрегат проходит каждый раз.
Ранних ACK-пакетов 0; steady retries=0; ACK на одиночном 8Мбит/с пути 0.170..0.180Мбит/с.
Остаётся нестабильность одиночного дуплекса 2Мбит/с: один повтор дал 1.672<1.700Мбит/с.
Далее — этот недобор, STCP backpressure, отдельные проверки смены RTT/BW и повторного отказа.
До смены RTT исправить отдельный подтверждённый дефект возраста min_rtt: старый probe minimum
обновляет min_rtt_stamp_tb на каждом ACK. При RTT20->100мс старое значение живёт 15.1с вместо10с;
стенд /tmp/etcp-min-rtt-stamp-probe.c/.mk/.log, нужны регрессии возраста и TB wrap. Код пока не менялся.
Логи/CSV: /tmp/etcp-rx-clock-*; 8372 среза проверены, HTML /tmp/etcp-rx-clock-matrix.html.
Подробности и предыдущие этапы: doc/etcp_multipath_plan.txt.
Предыдущий этап — диагностика до исправления ACK:
Продолжение 24.10.2026: диагностика срезов 100 мс (настройка 10..1000 мс), 104 поля; CSV и лог буферизуются до drain.
Видны очереди, callbacks/deferred waiter, DATA/ACK, flight/cwnd, BBR/RTT/RTO, долг/готовность pacer и канал эмулятора.