EasyDarwin开源流媒体server将select改为epoll的方法

本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org)

一. EasyDarwin网络模型介绍

EventContext负责监听全部网络读写事件。EventContext::RequestEvent每次插入一个监听事件到

监听列表(select 文件描写叙述符集合),EventThread::Entry()死循环监听加入到该FD_SET的全部文件描写叙述符的

事件。Entry()->select_waitevent()每次返回下一个要处理的事件节点,包含事件处理对象的哈希key,以及事件类型。

然后投递到线程池中的某一个线程的任务队列。注意这里是每个线程维护自己的任务队列。

相关代码,ProcessEvent->Signal()。当中实现了一个简单的均衡算法,决定投递到哪一个线程的任务队列。EventContext每处理完一个事件,会删掉监听的文件描写叙述符。然后执行完后会再次调用RequestEvent()插入到监听列表。并且激活监听(往管道写数据)。TaskThread::Entry()负责处理上面投递过来的任务,执行虚方法Run()。相关代码。theTimeout = theTask->Run()。全部网络模块均会继承并实现Task类的Run()方法。

二. select和epoll的区别

select内核实现,

sys_select()->do_select()
{
    for(;;)
    {
        循环遍历FD_SET看是否有事件发生,
    }
}

select最大仅仅支持1024个文件描写叙述符。原因#define __FD_SETSIZE 1024,定义超过1024会造成处理性能上的下降;

epoll内核实现,

网络事件中断中调用ep_poll_callback(),将网络事件加入到epoll队列。这样,epoll_wait()等待的时候,就不会像select循环,由于队列中的每个事件都是有效的。

由此看来epoll比select效率高,并且队列不受限制。可以随意大小。

可是假设select命中到有效的时间的概率也很高的时候,它俩效率是几乎相同的。

三. 把EasyDarwin的网络模型换成epoll

实现过程比較简单。依照前面select提供的接口,挨个实现一遍。然后把调用的地方加以操作系统类型的宏开关,兼容windows的编译。

实现之后,调试却花了很长时间,刚開始发现线程池在插入监听事件的时候会出现资源竞争,程序执行了一段时间后就出现异常了,不读取推送的数据了。经过review代码发现应该是没有加锁导致插入的时候资源竞争,有的没有成功插入,所以监听不到事件。后面加锁后经过调试,避免了一些死锁问题后,稳定执行了几天没有出现故障。

经过年前后将近2个月的开发和稳定调试、測试。EasyDarwin开源流媒体server最终成功将底层select网络模型改动优化成epoll网络模型。将EasyDarwin流媒体server在网络处理的效率上提升到了还有一个档次(这里得感谢EasyDarwin开源团队成员Fantasy的无私贡献,是他牺牲宝贵的业余歇息时间,连夜奋战开发和调试。才干取得EasyDarwin底层改造的成果)。

众所周知,select模型在处理大并发量的网络请求上具有一些瓶颈。默认在Linux上同一时候可以处理的网络连接数FD_SETSIZE为1024,尽管可以通过改动FD_SETSIZE的定义大小,但在FD_SETSIZE大于1024时。由于select模型先天的原因。对网络事件无法做到及时准确定位。其处理性能上并没有得到同步的提升,所以,带来的就是整个流媒体server在并发量上的瓶颈;而改动成epoll网络模型之后,其网络事件的处理性能得到提升,再加上EasyDarwin架构上的优势,採用线程池。任务队列及Reactor技术,使得网络事件可以很高效地被感知、处理(这里的任务队列还涉及到一个无锁队列的优化,这个在兴许的博客中会详细分析),这样,使得整个EasyDarwin流媒体server具有很高效的事件处理能力。并且经过长时间的測试。稳定性很好!

须要说明的是,EasyDarwin在Windows端还是沿用的select网络模型。从眼下的情况上来看。大并发量需求的项目多数部署在Linux系统上,Windows上EasyDarwin作为小规模或者研究型项目,全然可以满足需求。所以,将EasyDarwin+IOCP列入以后的开发计划中;

Epoll模型基本的代码在EasyDarwin Github上,文件夹位置在:https://github.com/EasyDarwin/EasyDarwin/tree/master/CommonUtilitiesLib。主要文件是:epollEvent.h和epollEvent.cpp

EasyDarwin开源流媒体server项目还在一直进行更加高性能的优化,项目地址:https://github.com/EasyDarwin

获取很多其它信息

邮件:[email protected]

WEB:www.EasyDarwin.org

Copyright ? EasyDarwin.org 2013-2016

时间: 2024-10-24 00:07:30

EasyDarwin开源流媒体server将select改为epoll的方法的相关文章

EasyDarwin开源流媒体服务器提供的TS切片/HLS直播打包库

EasyHLS EasyHLS是什么? EasyHLS是EasyDarwin开源流媒体社区开发的一款HLS打包库,接口非常简单,只需要传入打包的文件名.切片存放的目录.打包间隔以及切片数,EasyHLS库就能轻松将H264+AAC的流媒体切片,提供给WEB服务器进行HLS流媒体发布,我们提供了两套操作示例: EasyHLS_RTSP:以RTSPClient的形式,从RTSP URL将摄像机音视频获取到本地,进行HLS打包: EasyHLS_SDK:将SDK回调的数据进行HLS打包切片,示例中的S

EasyDarwin开源流媒体服务器支持basic基本认证和digest摘要自定义认证

本文转自EasyDarwin开源团队成员的博客:http://blog.csdn.net/ss00_2012/article/details/52330838 在前面<EasyDarwin拉流支持基本认证和摘要认证>一文中讲述了如何通过修改qtaccess.qtusers来让EasyDarwin对我们创建的用户支持基本认证和摘要认证,之后在与群主的沟通中感觉这种方式的体验性太差,用户的需求是多方面的,可能有的想在配置文件中配置.有的想从数据库中读取.有的想在程序中写死--,我们需要提供一种便于

EasyDarwin开源流媒体服务器提供的RTMP直播推送库

EasyRTMP EasyRTMP是什么? EasyRTMP是一个EasyDarwin配套使用,也可以单独使用的RTMP推送库,通过EasyRTMP我们就可以避免接触到稍显复杂的RTMP推送流程,只需要调用EasyRTMP的几个API接口,就能轻松.稳定地把流媒体音视频数据推送给Red5.Ngnix.crtmpserver等RTMP服务器: EasyRTMP_RTSP:将RTSP/RTP数据获取到本地,再通过EasyRTMP推送到RTMP服务器: EasyRTMP_SDK:将SDK回调的数据进行

开源流媒体服务器--EasyDarwin

欢迎加入我们的开源流媒体服务器项目:EasyDarwin, EasyDarwin是在Apple开源流媒体服务器Darwin Streaming Server(v6.0.3)基础上进行开发和维护的免费开源.高效.易扩展的面向企业级的流媒体平台框架,EasyDarwin开始于2013年,遵循 Apple开源License APSL,为了敏捷流媒体服务器开发和简化企业流媒体应用开发而诞生的. EasyDarwin一直以来保持Darwin原有体系结构和设计思想,在保持出色的性能和简洁的代码同时,也在不断

主流开源流媒体服务器有哪些?(转)

https://www.zhihu.com/question/31160392 流媒体解决方案 Live555 (C++) 流媒体平台框架 EasyDarwin (C++,国产精品) 实时流媒体播放服务器程序DarwinStreamingSrvr (C++) Flash流媒体服务器 Red5 (Java) 流媒体服务器 Open Streaming Server (Java) FMS流媒体服务器 (Adobe,收费的) Wowza流媒体服务器(Java) 开源流媒体平台FreeCast(Java

用VLC搭建流媒体server

VLC开元项目相当强大,我们既能够将其作为播放核心用于二次开发,又能够将其作为高性能的流媒体server.今篇博客主要讲用VLC搭建流媒体server. VLC搭建流媒体server步骤非常easy:选择输入数据.选择输出格式.选择编码器.选择流通量.输入数据来源非常多,能够是本地文件,能够是网络流,能够是音频.甚至图片.编码器选择主要是选择音频编码器.视频编码器用以确定声音输出质量和图像质量.输出格式较多,能够是本地文件,能够是网络流,也能够是组播:流通量眼下保留.实际没有多少用处. 以下我用

使用nginx+nginx-rtmp-module+ffmpeg搭建流媒体server笔记(十)

第十部分 -- 开发板測试 前几天已经分别将nginx和ffmpeg移植到了开发板上面.可是还是没有进行不论什么的測试并不知道移植后的效果怎样. 今天分别做了两个測试.证明移植的结果是可用的. 1.測试ffmpeg 对于nginx的測试在移植完毕后就已经进行过了.当然就是简单的可以显示nginx欢迎界面而已,可是对我来讲,nginx能用即可,并没有对他进行深一步的測试. 可是对于ffmpeg不測试下总感觉不放心.尽管移植时执行显示能够,可是还不知道它能不能工作,所以首先用它进行了视频格式转换的測

[转] 3个学习Socket编程的简单例子:TCP Server/Client, Select

以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计socket编程就已经基本入门了. 建议:1) 多多查查所用到的网络接口; 2) 最好有一本书,如UNIX环境高级编程,UNIX网络编程,可查询:3) 可以直接使用书上的例子更好. http://blog.csdn.net/zhenjing/article/details/4770490 TCP C

Linux下select, poll和epoll IO模型的详解(转)

http://blog.csdn.net/tianmohust/article/details/6677985 一).Epoll 介绍 Epoll 可是当前在 Linux 下开发大规模并发网络程序的热门人选, Epoll 在 Linux2.6 内核中正式引入,和 select 相似,其实都 I/O 多路复用技术而已 ,并没有什么神秘的.其实在 Linux 下设计并发网络程序,向来不缺少方法,比如典型的 Apache 模型( Process Per Connection ,简称 PPC ), TP