Files
obsidian-vault/personal/tech/multistream-single-flow-limit.md
T
Taiga b53dd70a15 [2026-09-26 09:10:28] syncthing: personal/tech/archive-org-collection-harvest.md personal/tech/balda-go-fx-pitfalls.md personal/tech/bilety-oxota-interaktiv.md personal/tech/cloudflare-tunnel-ssh-published-route.md personal/tech/deepseek-language-drift.md personal/tech/docker-data-root-mount-race.md personal/tech/docker-mac-disk-issues.md personal/tech/docker_colima_setup.md personal/tech/eagle-dashboard-launchd.md personal/tech/hermes-agent-improvements.md personal/tech/hermes-browser-toolsets.md personal/tech/hermes-fork-vs-upstream.md personal/tech/hermes-git-repo.md personal/tech/hermes-memory-architecture.md personal/tech/hermes-secret-redaction-bypass.md personal/tech/hermes-self-improvement-review.md personal/tech/home-network-config.md personal/tech/inter-site-throughput-taiga-to-mac.md personal/tech/inter-site-throughput-taiga-to-mac.md.bak-nedstab2 personal/tech/jellyfin-db-schema-mismatch.md personal/tech/karabiner-keyboard-config.md personal/tech/kraken-media-inventory-facts.md personal/tech/kraken-truenas-media-copies.md personal/tech/lampa-jellyfin-plugin.md personal/tech/lampac-deployment.md personal/tech/lampac-torrserver.md personal/tech/llm-model-selection-2026.md personal/tech/mac-print-shared-services.md personal/tech/modbus-rtu-sniffer-debugging.md personal/tech/multistream-single-flow-limit.md personal/tech/multistream-single-flow-limit.md.bak-nedstab2 personal/tech/music-tags-repair-truenas.md personal/tech/obsidian-mcp-ecosystem.md personal/tech/original-xbox-2025-guide.md personal/tech/prowlarr-flaresolverr-cloudflare.md personal/tech/radarr-sonarr-phantom-records.md personal/tech/roundtrip-key-verification.md personal/tech/ryujinx-mac-setup.md personal/tech/skill-arr-media-stack-setup-additions.md personal/tech/skill-docker-data-root-mount-race.md personal/tech/skill-lampac-kraken-deploy.md personal/tech/tirith-trust.md personal/tech/truenas-local-tree-comparison.md personal/tech/truenas-nfs4-acl-and-arrmultiuser.md personal/tech/truenas-zfs-panic-recovery.md personal/tech/vault-doc-pruning.md personal/tech/vless-space-subscription-egress.md personal/tech/watchlist-sync-feed.md personal/tech/watchtower-docker-updates.md personal/tech/xray-outbound-subscription-3xui.md personal/tech/xray-reverse-limits-private-network.md personal/tech/xray-reverse-tunnel-kraken-truenas.md personal/tech/xray-reverse-tunnel-kraken-truenas.md.bak-nedstab2 personal/tech/yandex-music-api.md
2026-09-26 09:10:28 +00:00

13 KiB
Executable File
Raw Blame History

title, created, updated, type, namespace, status, tags, related
title created updated type namespace status tags related
Многопоточный стриминг и обход single-flow лимита (Jellyfin / webOS / TorrServer) 2026-09-21 2026-09-22 research personal research-complete
jellyfin
webos
streaming
tcp
lampa
torrserver
bandwidth
personal/tech/inter-site-throughput-taiga-to-mac
personal/tech/xray-reverse-tunnel-kraken-truenas
family/how-to/kraken-network

Многопоточный стриминг — что реально существует

Контекст: Jellyfin на TrueNAS (Новосибирск) тормозит при просмотре из Бишкека. Speedtest через reverse-туннель показывает до 120 Мбит/с, но видео дёргается. Разбор: почему, и какие пути обхода существуют. Дата: 2026-09-21.


1. Почему speedtest 120 Мбит, а видео тормозит

Speedtest открывает 8+ параллельных TCP-сессий. Каждая независимо разгоняется своим congestion window. 8 сессий × ~15 Мбит = 120 Мбит. Это доказывает, что канал физически пропускает 120 Мбит.

Но одна TCP-сессия не берёт 120 Мбит. Скорость ≈ окно / RTT. При RTT ~104 мс для 120 Мбит нужно окно ≈ 1.5 МБ «в полёте», не подтверждённых. Одна сессия разгоняется не сразу, при потерях окно режется вдвое, на межоператорском стыке потери почти всегда есть.

Замеры межсайтовой пропускной способности (2026-09-02):

Режим Пропускная способность
Mac → TrueNAS, 1 SCP-поток ~28 Мбит/с
Mac → TrueNAS, 4 параллельных ~51 Мбит/с (×1.8)
Speedtest (8 потоков) до 120 Мбит/с

Рост ×1.8 при 4 потоках доказывает: ограничение — не полоса транзита, а один TCP-поток при высоком RTT.

Аналогия (уточнена Alex): не «узкая труба», а 8 касс, где канал пропустит 120 чел/мин — если открыты все 8. Один покупатель с одной корзиной в одной кассе уедет не быстрее этой кассы. Узкое — не канал, а одно соединение на длинном пути.


2. Почему туннели не помогают

Замеры 2026-09-02 через xray-test-client:

Режим Egress Down Стабильность
kraken-user (reverse) 92.62.70.41 (Kraken) ~45 Мбит 2.0–6.98 МБ/с (разброс замеров)
user1 (direct/REALITY) 90.189.160.148 (TrueNAS) ~37 Мбит 3.67–5.63 МБ/с
Контроль (Mac → Cloudflare напрямую) — ~55 МБ/с —

VLESS/REALITY идёт через тот же маршрут ТТК → Ростелеком (хоп 8, +50 мс). Меняется инкапсуляция, не физика. REALITY/Vision добавляет обёртки → обычно чуть хуже прямого, не лучше.

🔴 Несколько xray-туннелей НЕ дадут скорости

Это MPTCP/bonding — он агрегирует разные физические пути. Путь один. N туннелей по одному пути разделят тот же congestion window — суммарно не больше одного, плюс оверхед. Подтверждено замерами: reverse 45 и direct 37 — один коридор, не ×2.

Реальная агрегация требует второго независимого линка (мобильный 4G/5G как backup-WAN).


3. Многопоточный HLS — существует, но не реализован

Решение Статус
Jellyfin feature request «multiple parallel connections» ✅ Planned, 230 голосов (features.jellyfin.org/posts/2171). Issue #3206 (2020) закрыт как stale. 5 лет, кода нет
hls.js issue #6753 (multi-segment prefetch) Открыт Oct 2024, milestone 1.8.0, «Top priorities». Кода нет, PR отсутствует
ExoPlayer #5978 (parallelize DASH/HLS) Android, не webOS

Механизм, которого все ждут: клиент тянет N сегментов одновременно → N независимых TCP-окон → 120 Мбит. Ровно то, что нужно. Но нигде не реализовано.

⚠️ На webOS это безнадёжно: приложения используют нативный media pipeline (Starfish / HTML5 <video>). Это чёрный ящик — подменить логику загрузки нельзя. Все клиенты (официальный, Moonfin, Breezyfin) одинаково однопоточны.

Вывод: ждать нечего — ни от Jellyfin, ни от новых клиентов.


4. Что реально умеет многопоток

Решение Многопоток Пригодность
aria2 / aria3 ✅ до 16 соединений Качает файл, не стримит в плеер
jspeedstreamer, node-HLS-Proxy ✅ параллельный prefetch сегментов ✅ работает
nginx proxy_cache + slice ✅ кэш byte-ranges ✅ база для prefetcher
Infuse (Apple TV) ✅ параллельные Range ✅ но не webOS
Торрент (много пиров) ✅ N пиров = N соединений ✅ по природе
Jellyfin / Moonfin / Breezyfin ❌ 1 соединение —
8 xray-туннелей + mux ❌ одно логическое окно —
MPTCP по одному пути ❌ —

Ключевое: все рабочие многопоточные решения — внешние прокси/префетчеры, не клиенты. Прокси стоит рядом с клиентом, тянет параллельно, отдаёт из локального кэша.


5. Lampa + TorrServer + Lampac (webOS)

TorrServer

YouROK/TorrServer (3.0k★, GPL-3.0). Качает торрент, отдаёт HTTP-поток, управляет размером кэша.

  • Docker: ghcr.io/yourok/torrserver:latest, порт 8090
  • Health check: http://<ip>:8090/echo → версия сервера
  • Флаги: -d PATH (БД/конфиг), -a (HTTP Auth), -m BYTES (макс. размер потока), -t DIR (автозагрузка), --gst (GStreamer HLS/fMP4 транскод, сборки 141.10+), --proxyurl
  • Многопоточность по природе торрента (каждый пир = отдельное соединение)

Lampa

UI-каталог. Установка на LG webOS: Media Station X или LG Content Store. ⚠️ Установка .ipk с флешки на розничных LG не работает.

  • Настройки → TorrServer → «Использовать основную ссылку» → kraken:8090
  • Проверка: http://<ip>:8090/echo
  • Буфер настраивается: 50–100 МБ (Настройки → Плеер) ← этого нет в webOS Jellyfin-клиенте
  • Качество по скорости: до 10 Мбит → 720p; 10–25 → 1080p; >25 → 4K
  • Plugin API открыт (window.Lampa): Lampa.Component.add, Lampa.Activity.push, Lampa.Controller.add, Lampa.Player.play, Lampa.Scroll
  • Плагины: etor (TorrServer), kinopoisk.js (папка «Буду смотреть», лимит 50), synology_dlna.js (DLNA)

🔥 Lampac — всё в одном контейнере

immisterio/Lampac / lampac-nextgen/lampac (MIT, .NET 10, порт 9118). Внутри: TorrServer (subprocess) + JacRed (Jackett-совместимый индексатор) + GStreamer транскод + DLNA + TmdbProxy + LampaWeb (хостит UI, отдаёт /lg.ipk для LG).

  • Плагин для Lampa: http://<IP>:9118/online.js
  • Проверка: curl -fsS "http://localhost:9118/version?type=hash"
  • ⚠️ В контейнере рабочий каталог /lampac, файлы читаются из корня, не из config/. Volumes по умолчанию закомментированы

⚠️ Торрент-стримеры НЕ смотрят твою библиотеку

Показывают публичные раздачи, не файлы локальной библиотеки. Popcorn Time на webOS нэйтивно не было.


6. 🔴 TorrServer/Lampac на Кра́кене проблему НЕ решает

Многопоточность торрента работает только на участке «пиры → TorrServer». Участок «Lampac/TorrServer → ТВ» — тот же один TCP-поток через узкий линк.

Lampac на Кра́кене:   пиры → Кра́кен → [УЗКИЙ ЛИНК, single-flow] → ТВ    ❌

Но Lampac даёт то, чего не было: буфер 50–100 МБ + GStreamer HLS-транскод — можно отдать ТВ лёгкий поток 10–15 Мбит, который проходит одним соединением.

Это другое решение той же проблемы: не «обойти узкий канал», а «сделать поток достаточно лёгким».


7. Ранжированные пути (актуальный вывод)

# Путь Усилие Шанс
1 Ограничить битрейт в webOS-клиенте (10–15 Мбит) 2 мин Средний, работает сегодня
2 Moonfin / Breezyfin — нативный pipeline, буфер ~30 мин sideload Средний
3 Lampac на Кра́кене — буфер + GStreamer транскод Среднее Средний
4 Prefetch-proxy (nginx slice / node-HLS-Proxy) Высокое (пилить) Высокий, но сложно
5 Второй ISP на TrueNAS + MPTCP Дорого Единственный честный путь к агрегации

🟡 Развилка: Lampac НЕ смотрит локальную библиотеку

Путь №3 подходит для «просто кино» — публичные раздачи через TorrServer. Для «своей библиотеки» нужно отдельное решение: Lampac/TorrServer файлы библиотеки не отдают → идти в путь №4 (prefetch-proxy) либо в шаг 7 плана (плагин библиотеки).

⚠️ Развилка помечена 2026-09-22 как выдуманная мной, а не поставленная Alex. Alex на неё ответил «Чё блядь». Не требовать от Alex ответа на этот вопрос повторно. Делать шаги 1–6 плана — они от развилки не зависят.

Разбор и отвергнутые варианты: personal/plans/lampac-kraken.


Факты webOS-клиентов (проверено)

Moonfin Breezyfin
Версия 2.5.1, 409★ v0.2.1 (авг 2026), 63★, beta
webOS 3.0+ (2016+) 5.0+
Движок Starfish (нативный) HTML5 + Enact Sandstone
Транскод-лимит в UI ✅ явно есть (Transcoding Limits) не заявлен
Диагностика «кто отказал в Direct Play» ✅ есть (Diagnostics & Logging) есть
Jellyfin backend 10.9.0+, Jellyfin 12 ✅ 12 auth fix
Установка без истечения ✅ Homebrew Channel (не Dev Mode) ✅ Homebrew catalog

⚠️ Dev Mode на LG истекает через 50 часов → sideloaded app исчезает. Homebrew Channel не истекает — оба клиента есть в его каталоге.

⚠️ Ни один не распараллеливает поток. Кодеки определяет железо ТВ, не клиент.


Связанные заметки