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
获取很多其它信息
Copyright © EasyDarwin.org 2013-2016

EasyDarwin开源流媒体server将select改为epoll的方法的更多相关文章
- EasyDarwin开源流媒体服务器将select改为epoll的方法
本文来自EasyDarwin团队Fantasy(fantasy(at)easydarwin.org) 一. EasyDarwin网络模型介绍 EventContext负责监听所有网络读写事件,Even ...
- EasyDarwin开源流媒体服务器Golang版本:服务端录像功能发布
EasyDarwin开源流媒体服务器(www.easydarwin.org)现在使用Go版本实现了.最新的代码提交,已经支持了推流(或者拉流)的同时进行本地存储. 本地存储的原理,是在推流的同时启动f ...
- EasyDarwin开源流媒体项目
本文转自EasyDarwin CSDN官方博客:http://blog.csdn.net/easydarwin EasyDarwin是由国内开源流媒体团队维护和迭代的一整套开源流媒体视频平台框架,从2 ...
- NodeJS版本EasyDarwin开源流媒体服务器开发心得
title: Node版本EasyDarwin开发心得 date: 2018-03-27 22:46:15 tags: 年后着手Node版本EasyDarwin的开发工作,截止到今天2018年03月2 ...
- EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法
EasyDarwin开源流媒体服务器(www.easydarwin.org),拉转推是一个很有意义的功能,它可将一个独立的RTSP数据源"拉"到服务器,再通过转发协议转发给多个客户 ...
- EasyDarwin开源流媒体云平台设计与实现(分布式+负载均衡)
前言 早在2013年我就设计了一套架构非常简单的分布式流媒体服务器平台<基于Darwin实现的分布式流媒体直播服务器系统>,当时的考虑如今看来有诸多的细节点没有考虑到:1.CMS是单点部署 ...
- EasyDarwin开源流媒体云平台之EasyRMS录播服务器功能设计
需求背景 EasyDarwin开发团队维护EasyDarwin开源流媒体服务器也已经很多年了,之前也陆陆续续尝试过很多种服务端录像的方案,有:在EasyDarwin中直接解析收到的RTP包,重新组包录 ...
- EasyDarwin开源流媒体服务器实现RTSP直播同步输出MP4、RTMP、HLS的方案思路
背景 近期跟开源团队商量,想在EasyDarwin上继续做一些功能扩展,目前EasyDarwin开源流媒体服务器只能够实现高效的RTSP推流直播转发/分发功能,输入与输出都是RTSP/RTP流,不能够 ...
- EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案
本文转自EasyDarwin开源团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/52400226 EasyDarwin团队的Ba ...
随机推荐
- Docker部署注册中心、Docker创建私有镜像库、自签名证书、Deploy a registry server
这是我在内部部署Docker Registry时记录下来的笔记,操作环境是Centos 7.Docker 18.06.1-ce 1.运行registry 我当前所使用的主机的IP是192.168.1. ...
- UVa1073 Glenbow Museum
可以把R看成顺时针转90°,O看成逆时针转270° 设R有x个,则180*(n-2)=90*x+270*(n-x) 解得R有(n+4)/2个 O有(n-4)/2个 所以n<4或者n是奇数时无解. ...
- 【CF1027C】Minimum Value Rectangle(贪心,数学)
题意:给定n根木棍,不允许拼接或折断,选择四根组成矩形,求所有合法矩形中周长平方与面积比最小的一个,输出拼成这个矩形的四根木棍 n<=1e6 思路:猜结论:答案必定从相邻的4根中产生 证明见ht ...
- unix网络编程第一章demo
之前一直以为time_wait状态就是主动关闭的那一方产生.然后这个端口一直不可以用.实际我发现服务端监听一个端口.客户端发来连接后.传输数据后.服务端关闭客户端套接字后.用netstat -nat ...
- Group by 两表联查取另一表与之关联数据的总数
使用group by 需要查询的字段 必须要放在group by 后面 SELECT U.UserLotterySn,count(W.Userlotterysn) as WinCount,U.Acti ...
- Wireshark如何选择多行
Wireshark如何选择多行 在Wireshark中,用户经常需要选择几行,然后进行批量操作,如导出或者分析.但Wireshark没有提供通过鼠标直接选择多行的功能.这个时候,用户需要采用标记分 ...
- POJ 2253 Frogger Floyd
原题链接:http://poj.org/problem?id=2253 Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissi ...
- 从jar中读取资源文件的问题
在项目中遇到了一个问题,在IDE中读取配置文件的程序,打成架包以后,放到服务器上跑,报找不到资源文件的错误. 其中,资源文件的路径如下: 获取配置文件路径和读取的方法如下: private stati ...
- 【webpack2】-- 入门与解析
每次学新东西总感觉自己是不是变笨了,看了几个博客,试着试着就跑不下去,无奈只有去看官方文档. webpack是基于node的.先安装最新的node. 1.初始化 安装node后,新建一个目录,比如ht ...
- mysql 安装配置及经常使用操作
作为关系型数据库的一种,mysql因其占用内存小和开源等特性而兴起.以下简介下关于mysql配置和简单的操作. mysql配置 1.安装文件的下载 免安装版下载地址 :http://dev.mysql ...