性能调优
本文档介绍 Monibuca V6 的关键性能参数及其调优方法,帮助在不同规模的部署场景下获得最佳性能。
Dispatcher Workers 调优
Section titled “Dispatcher Workers 调优”dispatcher_workers 控制流分发线程数,是影响吞吐量和延迟的最核心参数。
dispatcher_workers: 0 # 0 = 自动(CPU 核数)| 值 | 行为 | 适用场景 |
|---|---|---|
0 | 自动检测 CPU 核数并创建等量线程 | 推荐默认值,适合大多数场景 |
1 | 单线程分发 | 低并发、低延迟优先场景 |
N | 指定 N 个分发线程 | 精确控制资源分配 |
- 小规模(< 100 路流):
dispatcher_workers: 0即可 - 中规模(100-1000 路流):设置为 CPU 核数的 50%-75%,留余量给其他任务
- 大规模(> 1000 路流):设置为 CPU 核数,确保分发不成为瓶颈
- 超低延迟:设置为
1,减少线程切换开销(牺牲吞吐量)
# 8 核 CPU,1000 路流场景dispatcher_workers: 6RingBuffer 环形缓冲区
Section titled “RingBuffer 环形缓冲区”RingBuffer 是 Monibuca 零拷贝分发的核心数据结构。每个流的每个 Track 拥有独立的 RingBuffer。
# 全局默认配置publish: ring_size: 256 # RingBuffer 容量(帧数)| 容量 | 内存占用(估算/Track) | 适用场景 |
|---|---|---|
64 | ~2 MB | 低延迟直播,内存紧张 |
128 | ~4 MB | 一般直播场景 |
256 | ~8 MB | 推荐默认值,兼顾延迟与容错 |
512 | ~16 MB | 高码率流、多订阅者场景 |
1024 | ~32 MB | 超高并发订阅 |
总内存估算公式:
内存 ≈ 流数量 × Track数 × ring_size × 平均帧大小例如:100 路流 × 2 Track × 256 × 16KB ≈ 800 MB
Bounded Channel 队列
Section titled “Bounded Channel 队列”订阅者与分发器之间通过有界通道(Bounded Channel)传递数据。
subscribe: channel_size: 64 # 每个订阅者的通道容量| 值 | 说明 |
|---|---|
16 | 最低延迟,但网络波动时容易丢帧 |
32 | 较低延迟,适度缓冲 |
64 | 推荐默认值 |
128 | 高缓冲,适合网络不稳定场景 |
通道满时的行为取决于配置策略:
- 丢弃旧帧:保持实时性,可能出现画面跳跃
- 阻塞等待:保持完整性,可能增加延迟
每个网络连接消耗一个文件描述符。大规模场景需要提高系统限制。
# 查看当前限制ulimit -n
# 临时修改ulimit -n 1000000
# 永久修改 /etc/security/limits.conf* soft nofile 1000000* hard nofile 1000000估算公式:
所需 fd ≈ (发布者数 + 订阅者数) × 1.2 + 基础开销(约 1000)TCP 参数调优
Section titled “TCP 参数调优”# 增大 TCP 缓冲区net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.ipv4.tcp_rmem = 4096 87380 16777216net.ipv4.tcp_wmem = 4096 87380 16777216
# 增大连接队列net.core.somaxconn = 65535net.ipv4.tcp_max_syn_backlog = 65535
# 启用 TCP 快速回收net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_fin_timeout = 15
# 增大端口范围net.ipv4.ip_local_port_range = 1024 65535
# 增大网络设备接收队列net.core.netdev_max_backlog = 65535应用配置:
sudo sysctl -pCPU 亲和性
Section titled “CPU 亲和性”对于 NUMA 架构的多核服务器,绑定进程到特定 CPU 可以减少跨 NUMA 节点的内存访问:
# 绑定到 CPU 0-7taskset -c 0-7 ./monibucaMonibuca 默认使用系统分配器。在高并发场景下,可以通过 LD_PRELOAD 使用 jemalloc 获得更好的多线程性能:
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so ./monibuca性能基准参考
Section titled “性能基准参考”以下数据基于测试环境(Intel Xeon 8 核、32GB 内存、万兆网络):
| 场景 | 流数量 | 订阅者总数 | CPU 使用 | 内存使用 | 延迟(P99) |
|---|---|---|---|---|---|
| RTMP→FLV | 100 | 1,000 | 15% | 800 MB | < 500ms |
| RTMP→FLV | 500 | 5,000 | 45% | 3.5 GB | < 800ms |
| RTMP→HLS | 100 | 10,000 | 25% | 1.2 GB | 3-6s |
| RTMP→WebRTC | 50 | 500 | 30% | 1.0 GB | < 200ms |
| 混合协议 | 200 | 2,000 | 35% | 2.0 GB | 协议相关 |
单流极限测试
Section titled “单流极限测试”| 指标 | 数值 |
|---|---|
| 单流最大订阅者 | 10,000+ |
| 单流最大码率 | 50 Mbps |
| 最大流数量 | 10,000+ |
| 引擎启动时间 | < 1s |
GET /api/sysinfo返回 CPU、内存、网络 I/O 等实时指标。结合 report 插件可以将指标上报到 Prometheus/Grafana。
Debug 插件
Section titled “Debug 插件”启用 debug 插件获取更详细的内部状态:
features = ["debug"]GET /debug/ringbuffer/{stream_path}GET /debug/dispatcherGET /debug/connections运行时动态调整日志级别:
PUT /config/globalContent-Type: application/json
{ "log": { "level": "debug" }}联系我们
微信公众号:不卡科技
腾讯频道:流媒体技术
QQ 频道:p0qq0crz08
QQ 群:751639168