Arut最初在开发nginx-rtmp-module的时候只实现了单进程模式,好处是架构简单,推送和播放,数据统计,流媒体控制等都在一个进程上完成。但是这显然浪费了Nginx多进程(在Linux和FreeBSD平台上每个进程都可以绑定一个CPU核心,以减少进程切换带来的开销)的处理能力。但是,如果开启多进程模式,推送和播放如果不在同一个进程上,会造成播放失败的问题:

另外,请求数据统计信息也是个问题,因为采取HTTP方式请求数据统计信息时,在多进程模式下,请求被Nginx随机分配给了worker进程,可能造成我想看worker 1上的数据统计信息,但是Nginx返回的是worker 3上的数据统计信息。流媒体控制也采取了HTTP请求的方式,所以也存在着同样的问题:

针对推送和播放不在同一个进程上的问题,Arut后来加入了auto push的功能,即把原始的推流数据再relay到其他进程上去。这个功能需要Unix domain socket的支持(所以类Unix系统都支持,Windows在Windows 10的某个版本后才开始支持):

这样处理后,不管播放请求落在哪个进程上,都能获得推送数据。

对于后面两个问题,Arut给出了一个布丁,需要修改Nginx本身的源代码,详情见per-worker-listener。这样处理后,在HTTP请求时加上端口号信息,就可以指定请求某个进程上的数据统计信息了,流媒体控制类似:

在测试中发现auto push的并发性能并不能随着CPU个/核数的提高而提高,一般在400~500路后就无法再提升(笔记本测试)。是什么原因呢?简单分析一下:假设服务器的CPU个/核数为N(Nginx的进程数一般配置为跟CPU个/核数相等),推流路数为M,且有M>>N,例如M=1000,N为4。假设M个推流请求被平均分配到N个进程上(实际上是不会被绝对平均分配的,但是相差不会很大),那么每个进程需要处理分配给自己本身的请求数为:

另外,要保证某个播放请求不管被哪个进程接受都能成功,那么每个进程都要接受另外N-1个进程的auto push过来的流,即:

那么每个进程需要处理的推送路数为:

即每个进程需要处理的推流数跟CPU个/核数是没有关系的,并不能用增加CPU个/核数来试图提高推流并发性能,即相当于原本能将M个推流请求“平均”分配到N个进程上的方案不但没起作用,还让每个进程都处理了全部M个推流请求。

那么怎么解决这个问题呢?答案是使用被动拉的方案替代主动推(auto push)的方案。此方案要用到共享内存和互斥锁,当一个推流请求被某个进程接受后,在共享内存中记录推送的流和某个进程的映射信息。而当一个播放请求被某个进程接受后,需要先查找要播放的流是在哪个进程上发布的,然后再到发布流的进程上去请求数据:

这样就解决了上述的每个进程都要处理全部进程接收到的推流请求的问题。

关于nginx-rtmp-module的缺陷暂时介绍到这儿,其实nginx-rtmp-module还有很多其他的缺陷,后续有时间我会写文章介绍。

欢迎关注我在nginx-rtmp-module的基础上开发的项目:nginx-http-flv-module。本项目已有多家商用案例。另外,欢迎关注我们的团队:Car-eye-team和网站:liveoss流媒体平台。

其他文章:

nginx-rtmp-module的缺陷(二)

nginx-rtmp-module的缺陷(三)

基于nginx-rtmp-module模块实现的HTTP-FLV直播模块nginx-http-flv-module(一)

基于nginx-rtmp-module模块实现的HTTP-FLV直播模块nginx-http-flv-module(二)

基于nginx-rtmp-module模块实现的HTTP-FLV直播模块nginx-http-flv-module(三)

nginx-rtmp-module的缺陷分析相关推荐

  1. Nginx Rtmp Module - HLS切片和级联播放

    #Nginx Rtmp Module - HLS切片和播放 1.名词解释 媒体片段文件(.ts): 媒体片段是由源站生成的,基于编码后的媒体源,并且是由一系列的 .ts 格式的文件组成,其中包含了你想 ...

  2. nginx rtmp module 代码详解 各模块主要功能

    ngx_rtmp_dash_module http模块里播放MPEG-DASH相关处理 ngx_rtmp_mp4_module 主要支持rtmp MP4这块点播相关功能,支持seek操作 ngx_rt ...

  3. ffmpeg,rtmpdump和nginx rtmp实现录屏,直播和录制

    ffmpeg,rtmpdump和nginx rtmp实现录屏,直播和录制 2014年 四月 19日 周六 | tags: ffmpeg, rtmp, rtmpdump, nginx, -- (perm ...

  4. Nginx RTMP 功能研究

    Nginx-RTMP功能调研 1. RTMP协议介绍...2 2.RTMP server.3 2.1当前的流媒体server.3 2.2Wowza功能...3 3.Nginx-based RTMP s ...

  5. Qt显示视频流——nginx+rtmp搭建直播服务器(二)

    上次介绍的是使用ffmpeg推流,这次介绍的是使用nginx + rtmp搭建直播服务器. 环境:ubuntu 16.04 一. 安装nginx 和 rtmp模块 1. 下载安装 nginx 和 ng ...

  6. [转]Nginx RTMP 功能研究(Nginx流媒体)

    转自:http://blog.csdn.net/cccallen/article/details/8440191 看点: 1.    Nginx 配置信息与使用.  (支持 rtmp与HLS配置) 2 ...

  7. linux 搭建nginx + rtmp服务器

    linux 搭建nginx + rtmp服务器 一  环境准备 虚拟机ubuntu 装备,安装一些nginx 必要的依赖和服务 sudo apt-get install libpcre3 libpcr ...

  8. 树莓派搭建nginx+rtmp服务器

    树莓派搭建nginx+rtmp服务器 http://bbs.eeworld.com.cn/thread-506444-1-1.html 1.安装依赖包 sudo apt-get install bui ...

  9. mysql 5.7 缺点_MySQL · 特性分析 · MySQL 5.7 外部XA Replication实现及缺陷分析

    MySQL 5.7 外部XA Replication实现及缺陷分析 MySQL 5.7增强了分布式事务的支持,解决了之前客户端退出或者服务器关闭后prepared的事务回滚和服务器宕机后binlog丢 ...

  10. Mac使用nginx+rtmp服务器

    一.安装Homebrow 已经安装了brow的可以直接跳过这一步. 执行命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/ ...

最新文章

  1. wxWidgets:wxOwnerDrawnComboBox类用法
  2. ioc spring 上机案例_通过实例解析Spring Ioc项目实现过程
  3. window服务器上搭建git服务,window server git!!!
  4. SQL中的条件语句case-when-then-else(就像C中的switch case语句)
  5. 罗马音平假名片假名转换器_零基础日语萌新该如何学习五十音?
  6. Git教程——回到从前 (reset)
  7. 计算机网络第七版和课后答案百度网盘下载
  8. W3school练习
  9. 7万字总结Spring,这回能看懂Spring源码了!
  10. HCIA-Cloud Computing华为云计算IA认证笔记
  11. The type 类名 is already defined
  12. Fluent多组分设置及化学反应
  13. 我在51CTO微职位学软考——东隅已逝,桑榆非晚
  14. iOS 指纹支付和面容支付
  15. python黑屏改成白底_详解Python给照片换底色(蓝底换红底)
  16. 段码液晶屏笔段电压范围_一种笔段式液晶屏测试装置的制作方法
  17. 科大讯飞活跃竞赛汇总!(12个)
  18. 主引导区,分区表,硬盘逻辑锁,坏道四种故障修复
  19. matlab自带的traffic,Matlab Traffic ToolBox
  20. 项目经验分享:基于昇思MindSpore,使用DFCNN和CTC损失函数的声学模型实现

热门文章

  1. 【牛客前端刷题】JS拔高篇
  2. Unity汽车漂移轮胎印胎痕效果实现
  3. SpringAOP学习--SpringAOP简介及原理
  4. 用pyocd读写gd32f4系列mcu的otp区
  5. 塔望食业洞察丨大健康黄金赛道,低GI食品风起
  6. 玩转CSS的前生今生与基础语法,选择器的使用
  7. 基于H5和C3的静态电商网站
  8. html 在线阅读器 flexpaper的使用
  9. HackRFOne无线射频遥控信号重放攻击
  10. 写一个计算器,要求实现加减乘除功能