RTSP性能优化
夏楚 edited this page 2022-05-19 15:07:34 +08:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

概述

在最近ZLMediaKit的一次提交中我对rtsp服务器的性能做了一次改进,本次改进中,核心的思想是:

  • 缓存时间戳相同的RTP包(意味着是同一帧数据),作为一个数据包进行分发

理论上,这样做可以大大减少多线程分发时线程切换次数、多余发送逻辑代码的执行以及系统调用次数预期在不增加播放延时的情况下能大幅提高rtsp服务器的性能.

测试

为了验证本次优化的预期目标我在linux服务器上做了一系列的测试对比以下是测试环境

  • 操作系统ubuntu16 desktop 64bit
  • cpu 4核心的Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
  • 编译器gcc 5.4.0开启Release编译(cmake -DCMAKE_BUILD_TYPE=Release)
  • malloc库连接jemalloc
  • 网络: 127.0.0.1本地循环网络
  • 测试客户端:test_benchmark
  • 测试服务器:MediaServer
  • 测试码流4K H264的RTSP流通过MP4 Rtsp点播实现文件200秒190MB,码流大概8Mb/s
  • 测试方法通过test_benchmark播放500路RTSP 4K点播总码流大概4Gb/s分别测试新老版本的MediaServer的进程。

测试数据

  • 启动的播放器个数: image
  • 实时码流: image

性能对比

老版本数据

  • cpu使用率(浮动比较大最高200%+) image image

  • 性能分析(perf top) image

  • 总结 cpu占用主要发生在内核态的系统调用(syscall)、tcp_sendmsg、内存拷贝。

新版本数据:

  • cpu使用率(浮动比较小50%以下) image image

  • 后面我又测试了2000个播放器掉了一批最后稳定在1800个左右实时流量17.5Gb/s(单向)左右,cpu占用300%左右: image image image image

  • 性能分析(perf top) image

  • 总结 cpu占用主要发生在内核态内存拷贝系统调用(syscall)、tcp_sendmsg的开销很小。

总结

本次性能测试基本证明了预想性能提升大概有4倍以上。 本机器为i7-4790 4核心8线程的所以cpu占用率最高为800%现在ZLMediaKit在上面支撑500个4K RTSP播放器实时流量大概4Gb/s时cpu使用率50%不到,通过简单换算该cpu可以支撑大概8000个4K RTSP播放器实时流量最高能达到64Gb/s考虑到性能折损我们保守估计可以支持6000个4K RTSP播放器50Gb/s的流量。

最后

在ZLMediaKit流媒体服务器中通过智能指针引用计数的方式实现了多线程的数据分发不管分发多少次数据拷贝次数都是固定的所以ZLMediaKit可以达到如此夸张的性能参数但是在测试中我们也能发现性能占用已经大部分发生在内核态了应用层的cpu占用反而不是瓶颈了。这是因为在内核态写socket缓存需要做内存拷贝随着播放器个数的增加内存拷贝会越来越多此时性能瓶颈不再是应用层而是由于内存带宽瓶颈导致的内核性能瓶颈。