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. 客户端兼容性:某些优化可能不适用于所有客户端

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

相关推荐
陈希12313 分钟前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡1 小时前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
@兽血沸腾1 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
讯捷蓝达7 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
数字新视界9 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落9 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
lisanmengmeng10 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮10 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
上火的金鱼妹11 小时前
k8s生产实际问题排查(网关,数据库读写等)
运维·服务器
孙克旭_11 小时前
k8s基础组件与创建资源
运维·docker·容器·kubernetes