WebRTC 服务器之SRS服务器性能优化配置

1.概述

SRS (Simple Realtime Server) 中提供的各种性能优化选项。这些选项允许您针对不同场景优化 SRS,从而在延迟、吞吐量和资源利用率之间取得平衡。有关常规配置的信息,请参阅配置。

1.1 性能提升目标

流媒体服务器的性能通常通过以下方式衡量:

  • 吞吐量:可以处理的并发连接数
  • 延迟:录制和播放之间的延迟
  • 带宽效率:系统对可用网络资源的利用程度
  • 资源使用情况:CPU、内存和 I/O 要求

如上图所示,SRS 提供了几类性能优化,可以对其进行配置以匹配您的特定使用。

2. 网络 I/O 优化

2.1 合并读取 (MR)

合并读取通过减少系统调用来提高读取性能。SRS 不是单独读取少量数据,而是等待积累更多数据,然后再分批处理数据。

复制代码
 play {
        # 启用/禁用
        mr on;
        
        # 睡眠持续时间,以毫秒为单位
        mr_latency 350;
    }

2.2 合并写入 (MW)和TCP_NODELAY

Merged Write 通过批处理传出消息来提高发送性能。SRS 不是单独编写每条消息,而是累积消息并一起发送。

在 SRS 中默认启用TCP_NODELAY。禁用 Nagle 算法,该算法缓冲小数据包,减少延迟,但代价可能是更多的数据包,有利于实时应用程序。

复制代码
vhost your_vhost {
    play {
        # 缓冲时间由 (以毫秒为单位)
        # Default: 350
        mw_latency 350;
    }
}
vhost __defaultVhost__ {
    tcp_nodelay     off;
}

3. 内存优化

3.1 RTMP 内存块

RTMP 块大小决定了如何拆分 RTMP 消息以进行传输。较大的块大小通过减少标头开销来提高效率。

复制代码
#减少协议开销
#将吞吐量提高约 10%
#默认值 60000 适用于大多数客户端
#允许的最大值为 65536
chunk_size 60000;

3.2 块流缓存

src/core/srs_core_performance.hpp125-130 非配置文件优化,SRS 可以缓存 Chunk 流,以提高处理 RTMP 消息时的性能。

  • 对于小块大小,性能提高了大约 10%
  • 对于较大的数据块大小,性能提高了大约 5%
  • 减少内存分配/释放开销

4. 延迟设置

SRS 提供最小延迟模式,该模式优先考虑减少延迟,而不是其他性能方面。

启用后的效果:

禁用虚拟主机的合并读取 (MR)

对使用者队列中的条件变量等待使用超时 trunk/conf/full.conf 中1168-1179

优先考虑立即交付而不是批处理

复制代码
vhost your_vhost {
    # Whether enable the minimal latency mode.
    # Default: off
    min_latency on;
}

4.1 GOP 缓存

GOP(图片组)缓存存储最近的视频数据,以便为新观看者提供快速启动和更流畅的播放。

优势:

  • 为新查看者提供即时播放

  • 查看者无需等待关键帧

  • 平滑播放开始体验

  • 可以禁用以减少内存使用量或实现绝对最小延迟

    vhost your_vhost {
    play {
    # Whether to enable the GOP cache.
    # Default: on
    gop_cache on;

    复制代码
          # The max GOP cache size in frames
          # Default: 256
          gop_cache_max_frames 256;
      }

    }

4.2 播放队列

播放队列设置客户端的最大缓冲时间。效果:

  • 限制每个客户端可以缓冲的最大数据数

  • 防止速度较慢的客户端积累过多数据

  • 还可以防止内存耗尽

    vhost your_vhost {
    play {
    # The queue length in seconds for player.
    # Default: 30
    queue_length 30;
    }
    }

5. 系统级选项

5.1 最大连接数

控制服务器将接受的最大连接数。可能需要使用命令增加系统限制ulimit -HSn

复制代码
# the max connections.
# if exceed the max connections, server will drop the new connection.
# default: 1000
max_connections 1000;

5.2 Pithy Print

控制打印日志消息的频率。降低日志频率可以提高繁忙系统的性能。

复制代码
# config for the pithy print in ms,
# which always print constant message specified by interval,
# whatever the clients in concurrency.
# default: 10000
pithy_print_ms 10000;

6.高级性能调优

SRS 支持各种 TCP 套接字选项,这些选项可以针对特定环境进行调整:

选择 Default 描述
TCP_NODELAY 启用 禁用 Nagle 算法
SO_SNDBUF 自动计算 套接字发送缓冲区大小
SO_RCVBUF 默认情况下未设置 套接字接收缓冲区大小
SO_REUSEADDR 启用 允许重复使用本地地址

7. 示例配置

7.1 低延迟场景

复制代码
vhost low_latency {
    min_latency on;
    
    play {
        gop_cache off;
        queue_length 5;
        mr off;
        mw_latency 100;
    }
}

7.2 高吞吐量场景

复制代码
vhost high_throughput {
    play {
        gop_cache on;
        queue_length 60;
        mr on;
        mr_latency 700;
        mw_latency 500;
    }
}

7.3 平衡配置

复制代码
vhost balanced {
    play {
        gop_cache on;
        queue_length 30;
        mr on;
        mr_latency 350;
        mw_latency 350;
    }
}

结论

优化 SRS 性能关键注意事项:

  1. 延迟与吞吐量:较低的延迟通常是以吞吐量降低为代价的,反之亦然
  2. 资源使用:更积极的缓存可以提高性能,但需要更多的内存
  3. 客户端兼容性:某些优化可能不适用于所有客户端

从默认配置开始,该配置在大多数情况下都能提供良好的平衡,然后根据您的特定要求和监控数据进行调整。

相关推荐
judezh10 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker
百万蹄蹄向前冲10 小时前
双端同步!云服务器装最新Node.js v26.10全过程追踪
服务器·人工智能·node.js
春天花会开13110 小时前
内网 HTTPS 部署实战:私有 CA + Nginx 反向代理全流程复盘
运维·nginx·https
AllFiles10 小时前
K8s Node Exporter 异常 Write 超时排查实录
运维·后端·kubernetes
虎头金猫6 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
AI职业加油站6 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
此冬歌咏6 天前
K8s 节点故障实战:优雅驱逐 31 秒,硬故障 331 秒,以及那个永远 Pending 的 Pod
运维·k8s
-梅6 天前
linux(8) 软硬链接
linux·运维·服务器
Wang's Blog6 天前
Java 项目实战: 外卖平台-文件下载与ServletOutputStream回写浏览器
服务器·项目开发
张洛闻Eren6 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github