本文来自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开源流媒体服务器终于成功将底层select网络模型修改优化成epoll网络模型,将EasyDarwin流媒体服务器在网络处理的效率上提升到了另一个档次(这里得感谢EasyDarwin开源团队成员Fantasy的无私贡献,是他牺牲宝贵的业余休息时间,连夜奋战开发和调试,才能取得EasyDarwin底层改造的成果)。

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

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

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

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

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2013-2016

EasyDarwin开源流媒体服务器将select改为epoll的方法的更多相关文章

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

    本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org) 一. EasyDarwin网络模型介绍 EventContext负责监听全部网络读写事件.Even ...

  2. EasyDarwin开源流媒体服务器Golang版本:服务端录像功能发布

    EasyDarwin开源流媒体服务器(www.easydarwin.org)现在使用Go版本实现了.最新的代码提交,已经支持了推流(或者拉流)的同时进行本地存储. 本地存储的原理,是在推流的同时启动f ...

  3. NodeJS版本EasyDarwin开源流媒体服务器开发心得

    title: Node版本EasyDarwin开发心得 date: 2018-03-27 22:46:15 tags: 年后着手Node版本EasyDarwin的开发工作,截止到今天2018年03月2 ...

  4. EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法

    EasyDarwin开源流媒体服务器(www.easydarwin.org),拉转推是一个很有意义的功能,它可将一个独立的RTSP数据源"拉"到服务器,再通过转发协议转发给多个客户 ...

  5. EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路

    背景 近期跟开源团队商量,想在EasyDarwin上继续做一些功能扩展,目前EasyDarwin开源流媒体服务器只能够实现高效的RTSP推流直播转发/分发功能,输入与输出都是RTSP/RTP流,不能够 ...

  6. EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案

    本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52400226 EasyDarwin团队的Ba ...

  7. 解决用EasyDarwin开源流媒体服务器做HLS直播时Flash Player卡住的问题

    最近在开发EasyDarwin开源流媒体服务器HLS直播的时候发现一个现象:在PC上用flash player播放HLS和在ios上面播放HLS时,效果明显不同,在ios上播放非常稳定,而在flash ...

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

    EasyHLS  Github:https://github.com/EasyDarwin/EasyHLS EasyHLS是什么? EasyHLS是EasyDarwin开源流媒体社区开发的一款HLS打 ...

  9. EasyDarwin开源流媒体服务器进行RTSP转发过程中将sdp由文件存储改成内存索引

    -本篇由团队成员Fantasy供稿! 原始版本 在Darwin Streaming Server版本中,推送端DoAnnounce的时候后服务器会根据easydarwin.xml中配置的movies_ ...

随机推荐

  1. [LeetCode] Rotate Image n-by-n矩阵顺时针旋转

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  2. 标准C程序设计七---45

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  3. linux信号------探步

    前言 Linux以进程为单位来执行程序.我们可以 将计算机看作一个大楼,内核(kernel)是大楼的管理员,进程是大楼的房客.每个进程拥有一个独立的房间(属于进程的内存空间),而每个房间都是不允 许该 ...

  4. ASP.NET路由应用及IIS配置(非MVC)

    一.前后台代码: Global.cs: using System.Web.Routing; ... void Application_Start(object sender, EventArgs e) ...

  5. linux下网络监控神器"iptraf-ng"

    优点:监控的网络信息很全面,安装和使用方便   #centos安装: #yum 源使用centos自带的base源即可. yum install -y iptraf-ng   #运行 iptraf-n ...

  6. 关于nginx所遇问题

    1. 如果出现 nginx: [error] invalid PID number “” in “/usr/local/var/run/nginx/nginx.pid” 错误重新加载配置文件 /usr ...

  7. AC日记——Destroying The Graph poj 2125

    Destroying The Graph Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8356   Accepted: 2 ...

  8. WCF的学习之旅

    一.WCF的简单介绍  Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是MS为SOA (S ...

  9. 华硕win7安装ubuntu14.04.02注意事项

    一.win7下划出给ubuntu系统的分区 1.win7自带分磁盘的工具,只需要压缩步骤即可,不需要继续分盘符格式化等操作 win7下为绿色 安装时为free space 二.制作启动盘并安装注意事项 ...

  10. 通配符、正则表达式、python去重

    1.linux通配符 *:代表所有字符(0到多个); ?:代表一个字符; ;:连续不同命令之间的分隔符; #:配置文件注释; |:管道; ~:当前用户的家目录; -:上一次所在的路径; $:变量前面需 ...