Nginx 的 RTMP 模块的在线统计功能 stat 在 multi-worker 模式下存在 Bug
《 让你的 Nginx 的 RTMP 直播具有统计某频道在线观看用户数量的功能》一文介绍了 Nginx 的在线统计模块。
我们的在线直播服务使用了 Nginx 的 Rtmp 模块(请参阅《
Nginx RTMP 模块 nginx-rtmp-module 指令详解》)。总体来讲,这个模块的功能稳定性和性能等方面都是很出色的。只要你的直播源头数据供给没问题,Nginx 的直播发布就 No Problem。
对于闲置频道,就是没人观看的直播频道,为了节省系统资源,我们进行了定时清理。那么怎么判定一个频道是闲置的呢?一开始我们使用了《
让你的 Nginx 的 RTMP 直播具有统计某频道在线观看用户数量的功能》介绍的方法,Java 使用 Apache 的 http client 调用 Nginx 的 nclients,即
http://直播服务器IP/nclients?app=app应用名&name=频道名,所得结果为 0 的即为闲置频道。
但在实际环境中,我们发现,这个在线统计功能并不靠谱。有时有人正在播放的频道,被统计为 0。这样造成统计错误,进而使不应该被清理的频道被清理掉,严重影响了直播效果的稳定性。
一开始我们以为是自己没有配置好 Nginx,但重新检查并反复部署仍然如此。
有次我们使用
http://直播服务器IP/stat 直接用页面跟踪直播频道的在线统计情况,发现统计结果正常的几率在 80% 以上。然而那错误的 20% 的统计结果足以让我们的清理程序犯下致命的错误了。我们不禁对 Nginx 的在线统计功能产生了怀疑,这个靠谱不靠谱?
经过多方求证,其中包括 RTMP 模块的作者的权威确认,我们终于得到结论,这确实是 Nginx 的一个 Bug。
原来是 Nginx 的 stat 对 multi-worker 模式的并发支持不够好造成的。
官方给出两种解决方法:让 Nginx 工作在 single-worker 模式,或者为每个 Nginx worker 配置单独的 stat file。
第一种方法对于 Nginx 提供的性能肯定大有影响,尤其是对于多核服务器。第二种方法,官方却没有说明如何单独配置。
结合实际情况,我们没有使用这两种方法,而是自己去管理维护每个直播频道的连接数量。当然这也不是最好的办法,还是希望 Nginx 能够尽快支持 multi-worker 模式下的 stat。
参考链接:
https://github.com/arut/nginx-rtmp-module/issues/159。
Nginx 的 RTMP 模块的在线统计功能 stat 在 multi-worker 模式下存在 Bug的更多相关文章
- Nginx模块之———— RTMP 模块的在线统计功能 stat 数据流数据的获取(不同节点则获取的方式不同)
一.目前只有一个Live节点存在 单节点获取方式如下: public function getStreamByIp($outerIP, $streamName) { //查询录像模块的IP地址外网,根 ...
- OSX安装nginx和rtmp模块(rtmp直播服务器搭建)
1.安装Homebrew,执行命令 1 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...
- Mac系统安装nginx+rtmp模块
1.安装命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install) ...
- Windows 编译安装 nginx 服务器 + rtmp 模块
有关博客: <Windows 编译安装 nginx 服务器 + rtmp 模块>.<Ubuntu 编译安装 nginx>.<Arm-Linux 移植 Nginx> ...
- 就publish/subscribe功能看redis集群模式下的队列技术(一)
Redis 简介 Redis 是完全开源免费的,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中 ...
- Nginx学习之配置RTMP模块搭建推流服务
写在开始 小程序升级实时音视频录制及播放能力,开放 Wi-Fi.NFC(HCE) 等硬件连接功能.同时提供按需加载.自定义组件和更多访问层级等新特性,增强了第三方平台的能力,以满足日趋丰富的业务需求. ...
- Nginx基础知识之————RTMP模块专题(实践文档)
on_publish 语法:on_publish url上下文:rtmp, server, application描述:这个可以设置为一个API接口(GET方式接受所有参数),会给这个API接口返回8 ...
- Ubuntu中使用Nginx+rtmp模块搭建流媒体视频点播服务
1. 背景 不知不觉笔者来到流媒体部门已经一年半多了,积攒了不少的流媒体知识,但平时工作也比较忙,很少进行总结性的梳理,最近准备花几个周末时间写一个流媒体系列的实践文章,也算是给自己做总结的同时帮助有 ...
- 利用Nginx搭建RTMP视频直播,点播服务器,ffmpeg推流,回看
一.环境和工具 ubuntu 14.04 desktop 不用server的原因是一部分的演示用到了linux视频播放和直播软件,自己还要装桌面,麻烦. 不建议使用 最新的16TLS,我一开始 ...
随机推荐
- linux echo命令的-n、-e两个参数
echo -n 不换行输出 $echo -n "123" $echo "456" 最终输出 123456 而不是 123 456 echo -e 处理特殊字符 ...
- Mysql避免全表扫描sql查询优化 .
对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引: .尝试下面的技巧以避免优化器错选了表扫描: · 使用ANALYZE TABLE tbl_n ...
- 1.解剖Linq to object
LINQ想必大家都不陌生了,它的出现使得我们的代码变得更短.更优雅了.至于LINQ是什么,Linq to object这类的扩展方法到底做了些什么.我们使用的EF是如何实现的(如何解析Expressi ...
- 请教下 Yii 和 Ajax来验证用户名是否存在
添加一个 Custom, Model页面: CustomForm中: public function rules() { // 使用ajax 校验数据 return array( array('nam ...
- LruCache--远程图片获取与本地缓存
Class Overview A cache that holds strong references to a limited number of values. Each time a value ...
- 关于python中字典的一些总结
1. 获取字典中的值,但是无异常 当在字典中取值的时候,可以使用如下两种方式: >>> d = {'name':'kel'} >>> d {'name': 'kel ...
- linux 条件变量
互斥量就是一把锁,在访问数据时能保证同一时间内只有一个线程访问数据,在访问完以后再释放互斥量上的锁. 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条 ...
- Python进程和线程
引入进程和线程的概念及区别 1.线程的基本概念 概念 线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但 ...
- jetty8的多实例部署(LT项目开发参考)
LT项目使用的EIP是运行在JETTY上,此文供开发和实施参考 1.windows下 win下部署多个jetty8很简单,首先将jetty8复制多个文件夹,其次按分配的端口号修改[JETTY_HOME ...
- xargs 简单功能
之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: find /sbin -perm +700 |ls -l 这个命 ...