Repository navigation
librtmp2-server 0.6.5
What's Changed
- chore(deps): update rust crate rustls to v0.23.46 by @renovate[bot] in #307
- Gate mutating HTTP routes on Bearer before body parsing; drop stale staged keyframe by @AlexanderWagnerDev in #306
- chore(deps): move to librtmp2 0.14.0 by @AlexanderWagnerDev in #308
Full Changelog: v0.6.4...v0.6.5
Benchmarks
Measured automatically for this release on a CI runner; the machine is described below. Raw data: bench-results-v0.6.5.json.
- Measured: 2026-10-14 19:55:51 UTC ·
a9dddf3· crate version 0.6.5 · workflow run - Built on: librtmp2 0.14.0
- CPU: AMD EPYC 9V74 80-Core Processor · 4 vCPUs
- RAM: 15.6 GiB
- System: Linux 6.17.0-1022-azure x86_64 · rustc 1.99.0 · GitHub-hosted ubuntu24 (image 20261004.327.1)
- Noise: shared CI VM — CPU model, neighbouring load and the runner image change between runs, so treat absolute numbers as indicative.
- Comparable vs release v0.6.4: ❌ different hardware (AMD EPYC 7763 64-Core Processor, 4 vCPUs vs AMD EPYC 9V74 80-Core Processor, 4 vCPUs): only large changes (> 25 %) mean anything
http_api
| Benchmark | Time | Throughput | vs release v0.6.4 |
|---|---|---|---|
http_api/create_stream |
281.11 µs | — | ⚪ −11.1 % |
http_api/health |
147.27 µs | — | ⚪ −18.8 % |
http_api/list_streams |
466.9 ms | — | ⚪ +4.6 % |
🟢 faster · 🔴 slower · ⚪ within the noise band (5–25 % depending on how comparable the two environments are, plus both runs' Criterion confidence intervals). Lower time is better.
Cross-server sweep
Same RTMP client and ffmpeg source for every server, one server at a time: load viewers 500 1000 2000, publisher ffmpeg 1280x720@30 H.264 2.5 Mbps + AAC 128 kbps. One sweep per run, no repetitions — the shared runner makes single values noisy, so compare servers within this run rather than across runs.
Servers: librtmp2-server 0.6.5 (librtmp2 0.14.0) · MediaMTX v1.21.2 · LiveForge main @ 4e70fb3 · SRS v8.0-d0 · nginx-rtmp nginx 1.31.6 (nginx-rtmp-module @ 6c7719d)
librtmp2-server vs the baselines
| Metric | Now | vs release v0.6.4 |
|---|---|---|
| publish handshakes/s | 7,127 | — |
| publish handshake avg (ms) | 3.35 | — |
| publish handshake p95 (ms) | 5.54 | — |
| play handshakes/s | 5,704 | — |
| play handshake avg (ms) | 3.83 | — |
| play handshake p95 (ms) | 9.73 | — |
| join, 1 viewer: avg (ms) | 0.57 | — |
| join, 1 viewer: p95 (ms) | 0.57 | — |
| join, 25 viewers: avg (ms) | 1.38 | — |
| join, 25 viewers: p95 (ms) | 2.09 | — |
| join, 100 viewers: avg (ms) | 3.05 | — |
| join, 100 viewers: p95 (ms) | 5.92 | — |
| load, 500 viewers: join avg (ms) | 15.64 | — |
| load, 500 viewers: join p95 (ms) | 39.40 | — |
| load, 500 viewers: frames/viewer | 73.11 | — |
| load, 500 viewers: CPU (% of one core) | 38.00 | — |
| load, 500 viewers: peak RSS (MiB) | 22.50 | — |
| load, 1000 viewers: join avg (ms) | 19.71 | — |
| load, 1000 viewers: join p95 (ms) | 53.06 | — |
| load, 1000 viewers: frames/viewer | 73.13 | — |
| load, 1000 viewers: CPU (% of one core) | 71.00 | — |
| load, 1000 viewers: peak RSS (MiB) | 32.40 | — |
| load, 2000 viewers: join avg (ms) | 87.00 | — |
| load, 2000 viewers: join p95 (ms) | 290.8 | — |
| load, 2000 viewers: frames/viewer | 73.23 | — |
| load, 2000 viewers: CPU (% of one core) | 111.9 | — |
| load, 2000 viewers: peak RSS (MiB) | 53.10 | — |
Handshake latency
| Server | publish /s | avg ms | p95 | p99 | play /s | avg ms | p95 | p99 |
|---|---|---|---|---|---|---|---|---|
| librtmp2-server | 7,127 | 3.35 | 5.54 | 6.46 | 5,704 | 3.83 | 9.73 | 12.58 |
| MediaMTX | 5,295 | 4.67 | 7.58 | 8.11 | 4,454 | 5.38 | 9.60 | 10.10 |
| LiveForge | 5,884 | 4.30 | 8.28 | 9.33 | 4,862 | 5.26 | 10.28 | 13.25 |
| SRS | 556.1 | 48.95 | 55.42 | 57.37 | 585.0 | 47.48 | 52.52 | 55.27 |
| nginx-rtmp | 686.9 | 42.28 | 43.57 | 44.66 | 354.1 | 83.59 | 85.35 | 85.89 |
Join latency (avg / p95 ms)
| Server | 1 viewer | 25 viewers | 100 viewers |
|---|---|---|---|
| librtmp2-server | 0.57 / 0.57 | 1.38 / 2.09 | 3.05 / 5.92 |
| MediaMTX | 0.85 / 0.85 | 3.01 / 4.11 | 6.65 / 11.23 |
| LiveForge | 0.70 / 0.70 | 6.49 / 10.51 | 13.52 / 28.96 |
| SRS | 41.27 / 41.27 | 47.03 / 49.58 | 60.00 / 72.48 |
| nginx-rtmp | 82.49 / 82.49 | 82.79 / 83.63 | 85.11 / 86.84 |
Many viewers on one stream
| Viewers | Server | join avg / p95 ms | CPU % (one core) | peak RSS MiB | frames/viewer |
|---|---|---|---|---|---|
| 500 | librtmp2-server | 15.64 / 39.40 | 38.00 | 22.50 | 73.11 |
| 500 | MediaMTX | 37.74 / 65.49 | 91.70 | 110.5 | 73.08 |
| 500 | LiveForge | 113.9 / 213.7 | 59.90 | 94.10 | 73.12 |
| 500 | SRS | 221.8 / 268.7 | 8.10 | 136.4 | 73.14 |
| 500 | nginx-rtmp | 97.74 / 111.0 | 55.60 | 23.60 | 73.10 |
| 1000 | librtmp2-server | 19.71 / 53.06 | 71.00 | 32.40 | 73.13 |
| 1000 | MediaMTX | 112.3 / 204.4 | 180.9 | 157.1 | 73.12 |
| 1000 | LiveForge | 327.8 / 808.2 | 120.7 | 151.4 | 73.11 |
| 1000 | SRS | 456.9 / 1,136 | 16.40 | 183.3 | 73.15 |
| 1000 | nginx-rtmp | 135.3 / 214.5 | 87.20 | 29.60 | 58.32 |
| 2000 | librtmp2-server | 87.00 / 290.8 | 111.9 | 53.10 | 73.23 |
| 2000 | MediaMTX | 363.8 / 1,043 | 176.8 | 308.1 | 41.27 |
| 2000 | LiveForge | 1,466 / 3,484 | 157.8 | 261.5 | 74.26 |
| 2000 | SRS | 858.2 / 1,366 | 34.60 | 261.8 | 73.33 |
| 2000 | nginx-rtmp | 2,476 / 7,375 | 54.50 | 42.00 | 21.93 |
A competitor delivering fewer frames per viewer than the others was overloaded at that step (the delivered rate, not just latency, is the result).
What's Changed
- chore(deps): update rust crate rustls to v0.23.46 by @renovate[bot] in #307
- Gate mutating HTTP routes on Bearer before body parsing; drop stale staged keyframe by @AlexanderWagnerDev in #306
- chore(deps): move to librtmp2 0.14.0 by @AlexanderWagnerDev in #308
Full Changelog: v0.6.4...v0.6.5