如何实现高性能

流媒体服务器对性能要求极为苛刻。因为流媒体服务器属于高速系统,会有并发的长连接请求,协议封包解包和音视频格式的编解码都消耗着CPU以及内存,如何尽可能的减少消耗是必须考虑的问题。

内存使用

池化是一个不错的选择,所以尽量池化,在Monibuca中对[]byte类型,采用了github.com/funny/slab如何实现高性能 - 图1包来管理。其他结构体就用系统自带的pool包来池化对象。

协程的使用

golang自带的goroutine可以有效的减少线程的使用,并可以支持各种异步并发的情况。合理的创建goroutine很重要,这样才能尽可能高效利用CPU时间。在monibuca中,创建goroutine在如下场景中:

  • 通讯协议建立的长连接对于一个goroutine
  • 每个房间拥有一个goroutine用于接收指令和转发音视频数据
  • 每一个插件会使用一个goroutine来执行插件的Run函数

由于引擎本身比较轻量化,更多的性能的优化需要插件提供者自由发挥了。