本文来自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

获取很多其它信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2013-2016

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

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

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

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

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

  3. EasyDarwin开源流媒体项目

    本文转自EasyDarwin CSDN官方博客:http://blog.csdn.net/easydarwin EasyDarwin是由国内开源流媒体团队维护和迭代的一整套开源流媒体视频平台框架,从2 ...

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

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

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

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

  6. EasyDarwin开源流媒体云平台设计与实现(分布式+负载均衡)

    前言 早在2013年我就设计了一套架构非常简单的分布式流媒体服务器平台<基于Darwin实现的分布式流媒体直播服务器系统>,当时的考虑如今看来有诸多的细节点没有考虑到:1.CMS是单点部署 ...

  7. EasyDarwin开源流媒体云平台之EasyRMS录播服务器功能设计

    需求背景 EasyDarwin开发团队维护EasyDarwin开源流媒体服务器也已经很多年了,之前也陆陆续续尝试过很多种服务端录像的方案,有:在EasyDarwin中直接解析收到的RTP包,重新组包录 ...

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

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

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

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

随机推荐

  1. 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作(转)

    马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...

  2. 洛谷 [P2480] 古代猪文

    卢卡斯定理 注意特判底数和模数相等的情况 http://www.cnblogs.com/poorpool/p/8532809.html #include <iostream> #inclu ...

  3. [LeetCode] Sort Colors 只有3个类型的排序

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  4. How to debug Android Native Application with eclipse

    This blog is inspired by this tutorial http://mhandroid.wordpress.com/2011/01/23/using-eclipse-for-a ...

  5. 标准C程序设计七---103

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

  6. linux time

    uint32_t midtime; static struct timeval startstart,midmid; while (ros::ok()) { gettimeofday(&sta ...

  7. 3.eclipse中 maven打包web工程几种方式

    1.右键项目-export 选择war file导出即可 2.第二种:右键项目-RUN AS -maven build..goals填入:clean package 第三种方式:右键项目.选择Debu ...

  8. Android 自定义ListView Item侧滑删除

    本程序是基于网上开源项目修改而来,具体来源忘了,懒得搜了,如果有不合适的地方,请原作者联系我,我会及时回复和处理的! 该例子程序中主要包含两个ListView,一个是实现侧滑删除,一个是侧滑出菜单,代 ...

  9. 【windows】windows下的hosts文件位置

  10. IDG | 四则运算表达式计算

    分析 首先将中缀表达式转换为后缀表达式(逆波兰式),然后使用栈进行计算. 没有考虑括号.小数. 代码 import java.util.LinkedList; import java.util.Lis ...