跳转到内容

性能调优

本文档介绍 Monibuca V6 的关键性能参数及其调优方法,帮助在不同规模的部署场景下获得最佳性能。

dispatcher_workers 控制流分发线程数,是影响吞吐量和延迟的最核心参数。

config.yaml
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: 6

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)传递数据。

subscribe:
channel_size: 64 # 每个订阅者的通道容量
说明
16最低延迟,但网络波动时容易丢帧
32较低延迟,适度缓冲
64推荐默认值
128高缓冲,适合网络不稳定场景

通道满时的行为取决于配置策略:

  • 丢弃旧帧:保持实时性,可能出现画面跳跃
  • 阻塞等待:保持完整性,可能增加延迟

每个网络连接消耗一个文件描述符。大规模场景需要提高系统限制。

Terminal window
# 查看当前限制
ulimit -n
# 临时修改
ulimit -n 1000000
# 永久修改 /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000

估算公式:

所需 fd ≈ (发布者数 + 订阅者数) × 1.2 + 基础开销(约 1000)
/etc/sysctl.conf
# 增大 TCP 缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 87380 16777216
# 增大连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 启用 TCP 快速回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
# 增大端口范围
net.ipv4.ip_local_port_range = 1024 65535
# 增大网络设备接收队列
net.core.netdev_max_backlog = 65535

应用配置:

Terminal window
sudo sysctl -p

对于 NUMA 架构的多核服务器,绑定进程到特定 CPU 可以减少跨 NUMA 节点的内存访问:

Terminal window
# 绑定到 CPU 0-7
taskset -c 0-7 ./monibuca

Monibuca 默认使用系统分配器。在高并发场景下,可以通过 LD_PRELOAD 使用 jemalloc 获得更好的多线程性能:

Terminal window
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so ./monibuca

以下数据基于测试环境(Intel Xeon 8 核、32GB 内存、万兆网络):

场景流数量订阅者总数CPU 使用内存使用延迟(P99)
RTMP→FLV1001,00015%800 MB< 500ms
RTMP→FLV5005,00045%3.5 GB< 800ms
RTMP→HLS10010,00025%1.2 GB3-6s
RTMP→WebRTC5050030%1.0 GB< 200ms
混合协议2002,00035%2.0 GB协议相关
指标数值
单流最大订阅者10,000+
单流最大码率50 Mbps
最大流数量10,000+
引擎启动时间< 1s
GET /api/sysinfo

返回 CPU、内存、网络 I/O 等实时指标。结合 report 插件可以将指标上报到 Prometheus/Grafana。

启用 debug 插件获取更详细的内部状态:

features = ["debug"]
GET /debug/ringbuffer/{stream_path}
GET /debug/dispatcher
GET /debug/connections

运行时动态调整日志级别:

PUT /config/global
Content-Type: application/json
{
"log": { "level": "debug" }
}

联系我们

微信公众号:不卡科技 微信公众号二维码
腾讯频道:流媒体技术 腾讯频道二维码
QQ 频道:p0qq0crz08 QQ 频道二维码
QQ 群:751639168 QQ 群二维码