让你的 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的更多相关文章

  1. Nginx模块之———— RTMP 模块的在线统计功能 stat 数据流数据的获取(不同节点则获取的方式不同)

    一.目前只有一个Live节点存在 单节点获取方式如下: public function getStreamByIp($outerIP, $streamName) { //查询录像模块的IP地址外网,根 ...

  2. OSX安装nginx和rtmp模块(rtmp直播服务器搭建)

    1.安装Homebrew,执行命令 1 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...

  3. Mac系统安装nginx+rtmp模块

    1.安装命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install) ...

  4. Windows 编译安装 nginx 服务器 + rtmp 模块

    有关博客: <Windows 编译安装 nginx 服务器 + rtmp 模块>.<Ubuntu 编译安装 nginx>.<Arm-Linux 移植 Nginx> ...

  5. 就publish/subscribe功能看redis集群模式下的队列技术(一)

    Redis 简介 Redis 是完全开源免费的,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中 ...

  6. Nginx学习之配置RTMP模块搭建推流服务

    写在开始 小程序升级实时音视频录制及播放能力,开放 Wi-Fi.NFC(HCE) 等硬件连接功能.同时提供按需加载.自定义组件和更多访问层级等新特性,增强了第三方平台的能力,以满足日趋丰富的业务需求. ...

  7. Nginx基础知识之————RTMP模块专题(实践文档)

    on_publish 语法:on_publish url上下文:rtmp, server, application描述:这个可以设置为一个API接口(GET方式接受所有参数),会给这个API接口返回8 ...

  8. Ubuntu中使用Nginx+rtmp模块搭建流媒体视频点播服务

    1. 背景 不知不觉笔者来到流媒体部门已经一年半多了,积攒了不少的流媒体知识,但平时工作也比较忙,很少进行总结性的梳理,最近准备花几个周末时间写一个流媒体系列的实践文章,也算是给自己做总结的同时帮助有 ...

  9. 利用Nginx搭建RTMP视频直播,点播服务器,ffmpeg推流,回看

        一.环境和工具 ubuntu 14.04 desktop 不用server的原因是一部分的演示用到了linux视频播放和直播软件,自己还要装桌面,麻烦. 不建议使用 最新的16TLS,我一开始 ...

随机推荐

  1. ANDROID5.0触摸屏校准

    1.校准原理: 1)首先生成校准用的参数,可以适用tslib生成校准参数,也可以使用校准app生成:使用校准app进行校准对使用者要求比较低,使用者可以不用学习复杂的命令:本文使用app方式 2)生成 ...

  2. Android fragment源码全解析

    Fragment 相信基本上每个android developer都用过,但是知晓其原理 用的好的还是不多,今天就从源码的角度上来带着大家分析一下Fragment的源码,对fragment有了更深层次 ...

  3. C# winform 自定义控件

    近来因为项目的问题,开始研究winform自定义控件,这篇主要是将自定义控件的属性在属性编辑器中可编辑,如果你对自定义控件比较了解的,就不用继续往下看了 首先,我创建了一个类UserButton,继承 ...

  4. [转] C#中的Dictionary的使用

    txw1958 的 原文 说明    必须包含名空间System.Collection.Generic     Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)     键 ...

  5. Golang 做的几个跟性能有关的工具

    1.Vegeta https://github.com/tsenart/vegeta Vegeta 是一个万能的 HTTP 负载测试工具,提供命令行工具和一个开发包. 使用方法: $ vegeta a ...

  6. qq互联登陆开发流程

    宋正河整理 百度文库在线观看: http://wenku.baidu.com/view/96da9744e518964bcf847c47.html?st=1 csdn免积分下载: http://dow ...

  7. Python异常记录

    1.常用异常名 AttributeError 调用不存在的方法引发的异常. EOFError 遇到文件末尾引发的异常. ImportError 导入模块出错引发的异常. IndexError 列表越界 ...

  8. 远程重启linux主机的几种方法

    方法一,在终端上利用ssh,不登录远程主机,直接发送重启命令 ssh root@192.168.8.128 'reboot' 方法二,在终端上利用ssh和here document ssh root@ ...

  9. Android之操作SQLite

    一.SQLite的介绍 1.SQLite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入  式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的 ...

  10. freetds相关

    什么是FreeTDS  简单的说FreeTDS是一个程序库,可以实现在Linux系统下访问微软的SQL数据库! FreeTDS 是一个开源(如果你喜欢可以称为自由)的程序库,是TDS(表列数据流 )协 ...