SRS和nginx-rtmp性能对⽐
SRS(Simple Rtmp Server)单进程能⽀持9000并发,nginx-rtmp单进程最多⽀持3000个,单进程的性能SRS(Simple Rtmp Server)是nginx-rtmp的三倍。SRS(Simple Rtmp Server)单进程性能如何做到nginx-rtmp的三倍的?SRS(Simple Rtmp Server)哪⼏个结构极⼤提升了性能?
先来看看我们遇到的问题,RTMP协议和HTTP协议是⼜很⼤不同的。nginx在分发HLS,即m3u8⽂本⽂件和ts视频⽂件时,对所有连接发送的都是同⼀个内容,甚⾄可以调⽤sendfile让内核⾃⼰发fd去,nginx服务器⾃⼰要⼲的事情很少了;如果nginx必须把每个ts的内容读出来,修改⾥⾯某些字节,然后每个客户端⼀次发送的数据前还得加点什么,nginx就会很忙了。
这就是RTMP,每个video或audio包,在发送给某个连接之前,都得修改下时间戳(⾄少FMS是每个连接收到的媒体数据都是从0开始的时间戳),然后把包再拆分成⼀些⼩⽚段(chunked),每个chunk包前⾯加⼏个字节的头信息,然后发送。我勒个去~
举个例⼦,假设有个视频的I帧有200000bytes,默认的chunk包最⼤是128字节,所以得拆分成200000/128=1562个chunk包来发送,每个chunk包前⾯都要加chunk头。没有办法sendfile了吧?可以想象得到内存要被蹂躏成什么样⼦吧?这就是RTMP流媒体服务器⿇烦的地⽅了,客官可以⾃⼰想下搞个什么样⼦的算法能最⾼效发送粗去~
nginx-rtmp是性能最⾼的服务器,⽐crtmpd都要⾼,red5根本就低两个级别,wowza也没有它⾼。SRS(Simple Rtmp Sever)做了什么能够⽐nginx-rtmp单进程还要⾼三倍?
第⼀点,st-load,这个是SRS(Simple Rtmp Sever)能做到⾼性能的最重要的原因,⼀个st-load可以模拟2000+的客户端。⼀个⽜逼的benchmark的⼯具;如果没有st-load,如何知道系统的性能瓶颈在哪⾥?总不能打开3000个flash页⾯播放rtmp流吧?开启3000个ffmpeg来抓流?不靠谱。这就是⾼性能第⼀定律:⾼性能不是想象和猜测粗来的,⽽是测试、调试和改进粗来的。
nginx和apache区别第⼆点,gperf/gprof性能benchmark功能。在编译SRS(Simple Rtmp Sever)时,就可以打开gcp或者gprof的性能分析选项,灰常⽅便就可以拿到数据。缩短了改进和优化的开发周期。
第三点,引⽤计数的msgs避免内存拷贝。从编码器收到的video/audio数据,转换成SrsSharedPtrMessage放到每个连接的发送队列,避免每个都拷贝⼀次;因为发送给每个客户端的消息(不是chunked包)头可能不⼀样,譬如时间戳不⼀样,但是消息的payload是⼀样的。
第四点,使⽤writev发送chunked包,避免消息到chunked包的内存拷贝。可以开辟⼀个header的缓冲区,专门放每个chunked包的header,然后⽤iovc保存头的指针和⼤⼩,payload的指针和⼤⼩,⽤writev就可以⼀次发送。
第五点,mw(merged-write)技术,即⼀次发送多个消息。虽然每个消息使⽤writev可以避免拷贝,还有更⾼效的是⼀次发送多个消息,即把多个消息的chunked头写在header的缓冲区,iovc保存多个消息的chunked头和payload指针,⼀次writev发送多个消息。这个是最关键所在。
第六点,减少timeout recv,每个连接都是⼀个st-thread在服务。在发送之前,线程得尝试从连接收取消息,譬如客户端的stop之类的;所以只能recv时指定timeout,譬如300毫秒如果还没有收到消息,就发送连接队列中的消息。这个会导致st的timeout红⿊树操作频繁。实际上,可以直接开启⼀个recv线程,因为客户端的消息⾮常少,避免timeout接收。
第七点,fast buffer和cache。譬如每次取消息的数组,使⽤cache;使⽤fast buffer避免频繁删除;使⽤header的cache。
第⼋点,vector还是list?有的地⽅看起来list更⾼效,譬如simple buffer这种频繁删除头,以及在结尾加⼊数据,看起来是list应该做的事情。但是实际上测试发现,vector⽐list⾼10%性能。所以,回到第⼀点,⾼性能不是猜测和想象粗来的;有的时候有些代码写得很慢,但是这个频率⾮常低,那么就不要考虑性能,⽽要考虑可读性。我觉得可以算是⾼性能第⼆定律:不要总是考虑⾼性能,可读性更重要。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。