如何实现高性能
流媒体服务器对性能要求极为苛刻。因为流媒体服务器属于高速系统,会有并发的长连接请求,协议封包解包和音视频格式的编解码都消耗着CPU以及内存,如何尽可能的减少消耗是必须考虑的问题。
内存使用
池化是一个不错的选择,所以尽量池化,在Monibuca中对[]byte
类型,采用了github.com/funny/slab包来管理。其他结构体就用系统自带的pool包来池化对象。
协程的使用
golang自带的goroutine可以有效的减少线程的使用,并可以支持各种异步并发的情况。合理的创建goroutine很重要,这样才能尽可能高效利用CPU时间。在monibuca中,创建goroutine在如下场景中:
- 通讯协议建立的长连接对于一个goroutine
- 每个房间拥有一个goroutine用于接收指令和转发音视频数据
- 每一个插件会使用一个goroutine来执行插件的Run函数
由于引擎本身比较轻量化,更多的性能的优化需要插件提供者自由发挥了。