Document reduced RTT multiplier and jitter margin for RTO

This commit is contained in:
evgeny committed 2026-10-23 12:52:59 +02:00
1 parent 9dbef48eb3
commit e0f28bf851
3 files changed
+10 -5

No files matched your search

+5 -2
View File
@@ -12,7 +12,8 @@ STARTUP в DRAIN после целого раунда RTT выше min_rtt+бю
Логический seq/payload отделён от физических ETCP_TX_ATTEMPT. Новый DATA содержит
seq+attempt_id; ACK своего пути содержит seq+attempt_id+receiver_delay_us.
Till подтверждает только логическую доставку. Собственные очереди попыток,
ACK, RTT/jitter и RTO принадлежат линку. RTO=clamp(2*(RTT+jitter),10мс,1с);
ACK, RTT/jitter и RTO принадлежат линку. RTO=clamp(1.2*RTT+1.5*jitter+3мс,10мс,1с),
с округлением вверх до целой микросекунды;
до DATA ACK используется KA RTT того же пути, без него начальное значение 1с.
Retry обходит каналы относительно last_link фрагмента; курсор фиксируется только
после принятия send транспортом. Поздние/чужие ACK не меняют чужой flight/BBR.
@@ -30,7 +31,7 @@ check.sh завершён успешно за166с: дополнительные
load — 8/8 соединений,134217728 байт с проверкой содержимого за13.66с.
Лог: /tmp/etcp-attempts-final-check.log. Он не включает долгую multipath-матрицу.
Вся штатная multipath-матрица пока FAIL: 20 нарушений порогов.
До изменения формулы RTO штатная multipath-матрица FAIL: 20 нарушений порогов.
RTT20/200мс: 13.552/16Мбит/с, длинный канал wire7.173/8Мбит/с;
после исправления STARTUP пики очереди около 23мс вместо 220мс.
Есть недобор bidirectional (обратное направление 7.116/10Мбит/с).
@@ -291,6 +292,8 @@ uint8: хранить факт состоявшейся отправки отд
До первого DATA ACK использовать RTT того же KA-пути как начальную оценку
либо консервативный начальный RTO. Расчёт по собственным RTT/jitter с запасом
ограничить диапазоном 10мс..1с; 10мс — нижняя граница, не верхняя.
Текущая формула по выбору пользователя: 1.2*RTT+1.5*jitter+3мс, округление вверх;
начальный jitter после первого DATA ACK равен RTT/2, установившийся — EWMA отклонения.
Добавить ротацию retry сразу, пока старый канал ещё UP; не откладывать до DOWN.
Не оставлять промежуточный формат,
в котором новый ACK продолжает обращаться только к last_link.
+2 -1
View File
@@ -36,7 +36,8 @@ HELLO/CHALLENGE/CONFIRM и keepalive передаются своим незав
после сканирования проверяем появились ли в linked-list собранные данные которые можно переместить в выходную очередь. и перемещаем если есть.
Таймер попыток каждого линка (etcp_tx.c):
- RTO = clamp(2*(data_rtt_us+data_jitter_us), 10000, 1000000) мкс.
- RTO = clamp(ceil(1.2*data_rtt_us + 1.5*data_jitter_us + 3000), 10000, 1000000) мкс.
Целочисленный расчёт использует uint64 и округляет вверх до целой микросекунды.
RTT использует собственный DATA ACK минус receiver_delay; EWMA RTT=1/8, jitter=1/4 |RTT-EWMA|.
Первый RTT задаёт jitter=RTT/2. До DATA ACK используется RTT keepalive этого же пути, без него RTO=1с.
- FIFO содержит физические попытки в порядке принятия транспортом. Таймер назначается по старейшей;
+3 -2
View File
@@ -8,11 +8,12 @@
Реализованы начальный pacing от 4*MSS/RTT, точные DATA B/s и ограниченный кредит shaper,
разделение логического seq/payload и физических attempt_id, ACK/RTT/RTO каждого пути,
ротация повторов A→B→C→A при UP-каналах, rollback отказавшего send и запрос потерянного till.
RTO=clamp(2*(RTT+jitter),10мс,1с). Пределы памяти: попытки 16384/линк, 32768/соединение, ACK 16384/линк.
RTO=clamp(ceil(1.2*RTT+1.5*jitter+3мс),10мс,1с), округление до мкс. Пределы: попытки 16384/линк,
32768/соединение, ACK 16384/линк. Без RTT начальный RTO=1с.
STARTUP завершается после целого раунда устойчивой очереди выше бюджета, без искусственного изменения BW.
BBR20/20, windows26 сценариев PASS; восемь тестов ASAN/UBSan с detect_leaks=1 PASS; основной набор183/183 PASS.
check.sh завершён успешно; дополнительные tcp_proxy_full/burst/load PASS (8 соединений,134217728 проверенных байт).
Полная штатная multipath-матрица: FAIL, 20 нарушений. Есть недобор RTT20/200мс и bidirectional;
Полная штатная multipath-матрица до смены формулы RTO: FAIL, 20 нарушений. Есть недобор RTT20/200мс и bidirectional;
slow-drop даёт паузу401мс, два зависших пути676мс, DROP/HOLD под нагрузкой229–243мс.
Ранние копии до RTO, здоровье/пробы каналов и STCP backpressure пока не реализованы; пороги тестов сохранены.
OOM после принятия данных исправлен аварийной сменой эпохи с сохранением физических линков.