CoreELEC and Linux tuning¶
NeNeTeePee-Stream-Kodi runs well out of the box. This page is an advanced, optional reference for a specific demanding scenario: 4K Dolby Vision playback running concurrently with heavy TMDBHelper cache-warming on a low-memory ARM device.
None of this is required to use NeNeTeePee-Stream-Kodi. It documents a real, tested configuration for a CoreELEC box on an Amlogic S922X (6-core big.LITTLE, 4 GB RAM, Samsung T5 SSD over USB 3.0), which you can adapt if you push a similar device hard.
Device-specific
These values were tuned for one hardware profile. Treat them as a worked
example, not universal settings. CoreELEC uses a read-only squashfs root, so
persistent tuning lives under /storage/, applied via
/storage/.config/autostart.sh and systemd units in
/storage/.config/system.d/.
What gets tuned, and why¶
| Area | Change | Why it helped |
|---|---|---|
| USB storage (UAS) | Load a cross-compiled uas.ko and rebind the SSD from usb-storage to UAS, raising queue depth from 1 to 30 |
Parallel SCSI queuing dropped write latency from ~10 ms to ~6 ms; SQLite checkpoints flush across NAND channels instead of serially |
| SSD hints | echo 0 > /sys/block/sda/queue/rotational |
Stops HDD heuristics (anticipatory merging, oversized readahead) that add latency on an SSD hidden behind a USB bridge |
| Dirty pages | Absolute limits: dirty_background_bytes=64 MB, dirty_bytes=256 MB, 1 s writeback, 10 s expiry |
The default 20% ratio allowed ~760 MB of dirty pages, causing write stalls; absolute byte limits keep the dirty set shallow so fsync() returns quickly |
| Network (RPS) | rps_cpus=3f across all 6 cores + a flow table |
The meson6-dwmac NIC has a single RX queue; nearly all NET_RX softirqs landed on one core, capping throughput under 90+ concurrent connections. RPS spreads packets across all cores |
| TCP | tcp_tw_reuse=1, tcp_fin_timeout=30, ephemeral port range 1024–65535 |
Hundreds of short-lived HTTP connections per second exhausted the default port range in TIME_WAIT. Existing 16 MB socket buffers were already fine |
| Memory margin | vm.min_free_kbytes=32 MB |
Kodi's peak reaches ~3.8 GB during 4K DV; the default 16 MB margin left almost no room before emergency reclaim |
| zram swap | 2 GB lz4 compressed swap, priority 100 | The S922X has no disk swap; at peak load this turns OOM kills into manageable swap pressure (~700 MB physical for 2 GB swap) |
| Page-cache warmup | Read Textures13.db into cache at boot |
Kodi queries the 545 MB texture DB for every on-screen image; pre-warming turns cold ~0.5 ms SSD reads into ~0.001 ms RAM hits |
| Process priority | Warmup services set to Nice=19, best-effort I/O priority 7 |
Keeps background warmup from competing with Kodi's I/O, without SIGSTOP throttling |
| CPU governor | performance on all cores (CoreELEC default) |
Eliminates frequency-scaling latency for HDR tone mapping and UI bursts; power draw is irrelevant on a plugged-in device |
Verifying¶
cat /sys/block/sda/device/queue_depth # expect 30 (UAS active)
cat /sys/class/net/eth0/queues/rx-0/rps_cpus # expect 3f (RPS active)
lsmod | grep uas # expect uas loaded
How this relates to NeNeTeePee-Stream-Kodi¶
NeNeTeePee-Stream-Kodi doesn't apply or depend on any of the preceding OS tuning. Nothing in the add-on changes kernel, sysctl, or systemd settings. The tuning is a separate layer that keeps storage and the network responsive when Kodi and background warmup services compete for a small pool of RAM and a single-queue NIC. On a roomier device (more RAM, a multi-queue NIC, native SATA), most of it isn't needed.
These NeNeTeePee-Stream-Kodi settings address playback smoothness at the app layer (Advanced → Pass-through validation):
- Read-ahead buffer size in MB (default 256, 0 turns it off). Keeps filling while playback is paused.
- Max seconds to wait for a slow/stalled backend before giving up (default 120, 0 turns it off).
See Stream proxy for how they work. Both were added in 2.0.0-beta.1 and are available on the Beta channel.
The one Kodi-side change NeNeTeePee-Stream-Kodi itself recommends is in
advancedsettings.xml: set <cache><memorysize>0</memorysize></cache> so
large files can play in pass-through mode with full seeking on 32-bit Kodi
builds. NeNeTeePee-Stream-Kodi only suggests this in a dialog; it never edits the file. See
advancedsettings.xml and seeking.