Files
obsidian-vault/personal/tech/multistream-single-flow-limit.md

210 lines
13 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Многопоточный стриминг и обход single-flow лимита (Jellyfin / webOS / TorrServer)
created: '2026-09-21'
updated: '2026-09-22'
type: research
namespace: personal
status: research-complete
tags:
- jellyfin
- webos
- streaming
- tcp
- lampa
- torrserver
- bandwidth
related:
- '[[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 не истекает** —
оба клиента есть в его каталоге.
⚠️ **Ни один не распараллеливает поток.** Кодеки определяет железо ТВ, не клиент.
---
## Связанные заметки
- [[personal/tech/inter-site-throughput-taiga-to-mac]] — замеры RTT/полосы Taiga ↔ Mac
- [[personal/tech/xray-reverse-tunnel-kraken-truenas]] — reverse-туннель, замеры egress
- [[personal/plans/lampac-kraken]] — план развёртывания Lampac + блокер «не библиотека»
- [[family/how-to/kraken-network]] — линки ТВ, история торможения 4K
- [[family/how-to/arr-stack-taiga]] — медиа-стек TrueNAS