Record verified RTT filter and RTO recovery fixes

This commit is contained in:
evgeny committed 2026-10-24 17:26:59 +02:00
1 parent d5114f36b4
commit e1dcee3c86
2 files changed
+75 -3

No files matched your search

+60
View File
@@ -3,6 +3,66 @@ ETCP: независимая обратная связь каналов и до
Статус
24.10.2026: исправлены возраст RTT-фильтра, сроки PROBE_RTT и замораживание DATA-измерений при росте RTT.
min_rtt_us теперь копируется вместе с probe_rtt_min_stamp_tb. Повторное использование
сохранённого короткого минимума не ставит текущее время на старое измерение.
Модель 20->100мс заменяет прежний минимум после его 10-секундного окна: 10.1с
при шаге измерений 100мс вместо прежних 15.1с. Тест границы проверяет ровно 10с и +1 TB.
Сохраняются принятие меньшего RTT сразу, обновление короткого окна через5с и при выходе из PROBE_RTT.
Метки/hold уже хранились в uint64, но вычисление и сравнение обрезали их до32бит.
Теперь используются полные TB: длительный idle не теряется через4.97суток,
а срок с нулевыми младшими32битами остаётся действующим сроком hold.
PROBE_RTT ждёт одновременно >=200мс и завершённый ACK-раунд; выход восстанавливает окно.
DEBUG показывает старое/новое значение minRTT, обе метки, причину expiry и срок/окончание hold.
Сетевой стенд с уже исправленным фильтром обнаружил второй дефект: после20->100мс
DATA EWMA остался25.353мс, RTO34.135мс, хотя timestamp-RTT показывал103..106мс.
Все физические попытки удалялись до ACK, DATA ACK-счётчик остановился на282;
за12с накопились2035 повторов. Логическая доставка продолжалась, модель канала не обновлялась.
Для RTO теперь RTT=max(DATA EWMA, последний timestamp/keepalive RTT того же линка).
Формула ceil(1.2*RTT+1.5*DATA_jitter+3000) и clamp10мс..1с прежние.
Это нижняя граница срока повтора; BBR RTT/min_rtt/BW получают только собственный действующий DATA ACK.
Новых очередей/таймеров/полей нет. Ранняя уже назначенная проверка применяет текущий RTO.
Контрольный временный бинарник восстановил DATA-измерения примерно за200мс и дал5 переходных повторов.
В репозитории добавлен профиль rtt-change: один канал8Мбит/с, небольшая нагрузка,
RTT20->100->20мс. Проверяет прогресс DATA ACK после скачка, снятие stalled,
старение прежнего минимума, быстрое принятие снижения и полную упорядоченную доставку после drain.
В полной нативной матрице DATA EWMA начал учитывать рост через202мс. Через1с
DATA104.667мс, timestamp104.6мс, RTO129.595мс, stalled=0, переходных повторов6.
minRTT вырос до103.271мс по возрасту исходной точки; после возврата —24.068мс в течение1с.
ASAN/UBSan: этот же профиль PASS, DATA104.777мс, min103.507мс, после возврата min23.596мс,
четыре переходных повтора, без ошибок/утечек. Порог скорости здесь не вводится: проверяется обратная связь RTT.
Регрессии до фикса: BBR20/24 (четыре новых FAIL), рост RTT с настоящим retrans-таймером FAIL.
После: BBR24/24; test_etcp_windows62 сценария с ускоренными и обычными часами PASS.
Покрыты основной/быстрый путь, 32-битная граница TB, длительный idle, свежий равный/меньший RTT,
нулевой RTT, границы окна и hold, ACK-раунд до/после срока. Четыре профильных ASAN/UBSan-теста
и отдельно ASAN rtt-change с detect_leaks=1 PASS. check.sh:186/186, proxy9/9, burst1/1,
load8/8 PASS,134217728 проверенных байт,186с со сборкой.
Полная матрица: первые6 скоростных профилей, все9 отказных и новый rtt-change PASS.
Единственный FAIL — прежняя нестабильность одиночного дуплекса2Мбит/с:1.699<1.700Мбит/с.
Путь8Мбит/с даёт7.085/7.063, агрегат8.734/8.820 из10Мбит/с на направление.
Goodput агрегатов: equal14.454/16, bandwidth9.014/10, rtt14.507/16, fast-distant9.248/10,
slow-distant9.086/10, three11.139/12 (минимум app/fresh DATA).
Two-stuck: gap207.859мс, max latency376.227мс; load-drop/load-hold: gap55.690/56.164мс,
steady7.479/7.243 из8Мбит/с. Общая задача остаётся открытой.
Дальше: малый одиночный дуплекс, STCP backpressure, смена RTT нескольких путей/BW и повторный отказ.
Логи: /tmp/etcp-rtt-age-before.log, /tmp/etcp-rtt-growth-before.log,
/tmp/etcp-rtt-change-probe.log, /tmp/etcp-rtt-change-control.log;
/tmp/etcp-rtt-final-{bbr,windows,windows-real,transport,session,model-debug,full-check}.log,
/tmp/etcp-rtt-final-asan-*.log, /tmp/etcp-rtt-final-matrix.log/.csv,
/tmp/etcp-rtt-final-matrix-diag.csv. Проверены8678 срезов; отчёт /tmp/etcp-rtt-final-matrix.html.
Отдельные330 срезов RTT и графики: /tmp/etcp-rtt-final-rtt-change.csv/.html;
сводка /tmp/etcp-rtt-final-summary.json. Повтор: UTUN_MULTIPATH_DIAG=/tmp/rtt.csv
./tests/test_etcp_multipath rtt-change. Диагностика модели: UTUN_TEST_DEBUG=1 ./tests/test_etcp_bbr.
Предыдущий этап: выбор часов BW.
24.10.2026: устранена недооценка BW из-за растяжения ACK обратной очередью.
Прежний max(send_us,ack_us,RX-bound) мог только уменьшать BW по точке приёма:
при разгоне дуплекса интервал ACK 181424 мкс перекрывал RX-bound 130689 мкс
+15 -3
View File
@@ -102,6 +102,20 @@
Windows/FreeBSD runtime не проверялся.
[ ] **ETCP: полезная утилизация нескольких каналов и доставка при зависании части линков** — общая задача открыта.
24.10.2026: исправлены RTT. min_rtt наследует метку короткого минимума, вместо омоложения кеша каждым ACK;
прежний минимум20мс заменяется после10с своего возраста (прежде15с). Метки/hold PROBE_RTT используют полные uint64 TB;
проверены 32-битная граница, нулевые младшие32бита срока, длительный idle, hold>=200мс и ACK-раунд.
Исправлено замораживание DATA-измерений при скачке RTT: RTO берёт max(DATA EWMA, timestamp-RTT своего линка).
Формула1.2*RTT+1.5*DATA_jitter+3мс и clamp10мс..1с сохранены; BBR обновляют только действующие DATA ACK.
Новый профиль rtt-change:20->100->20мс, проверяет обновление RTT, снятие stalled, старение/снижение minRTT и доставку.
DATA-измерения возобновились примерно за202мс, после перехода повторов нет; minRTT103.271мс, после возврата24.068мс.
До фикса стенд дал2035 повторов и остановку DATA ACK-модели; отдельная регрессия настоящего retrans-таймера также FAIL.
BBR24/24; test_etcp_windows62 сценария в обоих режимах часов PASS; четыре ASAN/UBSan-теста и ASAN rtt-change без ошибок/утечек.
Check.sh186/186, proxy9/9, burst1/1, load8/8 PASS,134217728 проверенных байт,186с.
Полная матрица: первые6 скоростных профилей, все9 отказов и rtt-change PASS; остался1 FAIL2Мбит/с:1.699<1.700.
Одиночный8Мбит/с7.085/7.063, агрегат8.734/8.820 из10. Далее —2Мбит/с, STCP backpressure, смена RTT нескольких путей/BW и повторный отказ.
Логи/CSV /tmp/etcp-rtt-final-*;8678 срезов проверены, отдельные330 RTT: /tmp/etcp-rtt-final-rtt-change.csv/.html.
Детали: doc/etcp_multipath_plan.txt. Предыдущий этап — исправление BW:
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/окно не менялись.
@@ -113,9 +127,7 @@
Ранних 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. Код пока не менялся.
Обнаруженный на этом этапе дефект возраста min_rtt исправлен и проверен следующим этапом выше.
Логи/CSV: /tmp/etcp-rx-clock-*; 8372 среза проверены, HTML /tmp/etcp-rx-clock-matrix.html.
Подробности и предыдущие этапы: doc/etcp_multipath_plan.txt.
Предыдущий этап — диагностика до исправления ACK: