nginx-rtmp-module的缺陷分析
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的缺陷分析相关推荐
- Nginx Rtmp Module - HLS切片和级联播放
#Nginx Rtmp Module - HLS切片和播放 1.名词解释 媒体片段文件(.ts): 媒体片段是由源站生成的,基于编码后的媒体源,并且是由一系列的 .ts 格式的文件组成,其中包含了你想 ...
- nginx rtmp module 代码详解 各模块主要功能
ngx_rtmp_dash_module http模块里播放MPEG-DASH相关处理 ngx_rtmp_mp4_module 主要支持rtmp MP4这块点播相关功能,支持seek操作 ngx_rt ...
- ffmpeg,rtmpdump和nginx rtmp实现录屏,直播和录制
ffmpeg,rtmpdump和nginx rtmp实现录屏,直播和录制 2014年 四月 19日 周六 | tags: ffmpeg, rtmp, rtmpdump, nginx, -- (perm ...
- Nginx RTMP 功能研究
Nginx-RTMP功能调研 1. RTMP协议介绍...2 2.RTMP server.3 2.1当前的流媒体server.3 2.2Wowza功能...3 3.Nginx-based RTMP s ...
- Qt显示视频流——nginx+rtmp搭建直播服务器(二)
上次介绍的是使用ffmpeg推流,这次介绍的是使用nginx + rtmp搭建直播服务器. 环境:ubuntu 16.04 一. 安装nginx 和 rtmp模块 1. 下载安装 nginx 和 ng ...
- [转]Nginx RTMP 功能研究(Nginx流媒体)
转自:http://blog.csdn.net/cccallen/article/details/8440191 看点: 1. Nginx 配置信息与使用. (支持 rtmp与HLS配置) 2 ...
- linux 搭建nginx + rtmp服务器
linux 搭建nginx + rtmp服务器 一 环境准备 虚拟机ubuntu 装备,安装一些nginx 必要的依赖和服务 sudo apt-get install libpcre3 libpcr ...
- 树莓派搭建nginx+rtmp服务器
树莓派搭建nginx+rtmp服务器 http://bbs.eeworld.com.cn/thread-506444-1-1.html 1.安装依赖包 sudo apt-get install bui ...
- mysql 5.7 缺点_MySQL · 特性分析 · MySQL 5.7 外部XA Replication实现及缺陷分析
MySQL 5.7 外部XA Replication实现及缺陷分析 MySQL 5.7增强了分布式事务的支持,解决了之前客户端退出或者服务器关闭后prepared的事务回滚和服务器宕机后binlog丢 ...
- Mac使用nginx+rtmp服务器
一.安装Homebrow 已经安装了brow的可以直接跳过这一步. 执行命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/ ...
最新文章
- python中head_Python pandas.DataFrame.head函数方法的使用
- [react-router] React-Router怎么设置重定向?
- ngOnInit与constructor的区别
- GDB调试打印STL对象
- .NET采集数据,放入数据库总结
- rest framework 节流
- php mysql 降_php fork太多进程导致整体性能下降,mysql down掉的解决._PHP教程
- Python使用pandas读取Excel文件多个WorkSheet的数据并绘制柱状图和热力图
- JAVA----简单的自旋锁
- php 腾讯短信接口api,腾讯云短信发送功能API-PHP接入
- photoshop标尺工具_工具设置:PhotoShop
- java 通过ffmpeg 将海康视频转码
- MySql重装出错, Staring the server出错,日志3306 with user root with no password...
- 叠氮PEG叠氮,N3-PEG-N3
- Python绘制双坐标图
- 深大uooc学术道德与学术规范教育第四章
- Linux环境下安装tomcat并配置开机自启
- 家用净水器哪个牌子好,家用净水器评测
- 国际商务英语学习[十七]
- 浏览器开发者模式下你不可错过的Network面板知识
热门文章
- vb用计算机模拟掷骰子游戏,vb掷骰子程序代码
- html纵向滚动条隐藏,css隐藏滚动条(横向,坚向)
- LeetCode:912. 排序数组
- 人工神经网络——感知器介绍
- 左移运算符和右移运算符的使用
- 关于StringUtils的isNotBlank方法
- 解决 “LoadLibrary(D:\IDA 6.8\plugins\python.plw) error: %1 不是有效的 Win32 应用程序。“
- Android 在部分华为手机上出现乱码的问题
- 多路全协议45W快充充电器,带12864监控屏
- 港科夜闻|香港科大EMBA校友杜强企业小白世纪登上中国AI医健行业榜单