Skip to content

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.