EasyDarwin现有架构介绍

EasyDarwin的现有架构对网络事件的处理是这样的,每一个Socket连接在EasyDarwin内部的对应存在形式就是一个Session,不论是RTSP服务对应的RTSPSession,还是HTTP服务对应的HTTPSession,都是一个继承自Task类的具体应用层对象;

EasyDarwin有一个专门的网络事件处理的线程:EventThread(网络事件线程),EventThread一方面采用select(Windows)或者epoll(Linux)的网络IO模型,将检测到的socket网络事件以Task(就是上层实际进行业务处理的Session)任务的形式投递到线程池中线程的任务队列TaskQueue中,另一方面EventThread维护Socket描述与Session::Task对象建立的key/value哈希表HashTable;

当socket第一次连接的时候,会先进行Session的建立,再Register到Hash表中,后面再次与socket相关的网络事件,都会直接在Hash表中获取到socket对应的Session进行网络事件的具体处理;

线程池中的线程不断循环读取本线程维护的任务队列TaskQueue中的Task,取出Task后,进行Task::Run()执行,而具体的执行过程就是在继承自Task的Session中Run()执行,那么在Session::Run()中执行的就是具体的Socket报文读取与处理,处理完成后响应,而对一个socket一次网络报文从读取、解析、处理、到回复响应的整个流程都是线程阻塞的,也就是在这个过程中,整个线程只能处理流媒体服务器跟一个终端的交互;

瓶颈分析

网络事件线程EventThread的主要工作就是通知,通知BlockingTaskThread有网络消息来了,需要读取和处理,然后BlockingTaskThread就开始处理具体的网络事件了,从整个读取、解析、到处理、响应,必须完整执行完成之后,当前这个BlockingTaskThread才可能会执行下一个Socket的网络事件,以通用的服务器来算,8核的服务器,我们的线程池建立16个线程,8个BlockingTaskThread(网络消息处理线程),8个ShortTaskThread(内部任务处理线程),一旦网络并发数剧增,那么在同一时刻,最多也就只能读取8个客户端发来的请求,如果服务器设计的锁比较少、处理的阻塞点控制的比较好,并发处理上还能够过得去,就像当前EasyDarwin的架构一样,处理小规模的并发上比较具有优势,但想再提升一个级别,例如万兆网卡上,在CPU还有富余的情况下首先跑满带宽这个需求,还需要进一步的优化;

优化方案设计

近期也一直在跟EasyDarwin开源团队成员Fantasy在探讨这个问题,得出的行业比较通用的做法,我们将改造EventThread,在EventThread中就将客户端请求的一个一个完整的RTSP/HTTP请求,读取出来,再以MsgTask的形式,携带完整的数据包+对应的Session指针引用,投递到TaskThread中,而这个时候TaskThread也不区分BlockingTaskThread和ShortTaskThread了,统一都为TaskThread,TaskThread内部循环读取TaskThread::TaskQueue中的Task进行处理,获取到MsgTask后,解析Msg,处理,再调用MsgTask中的Session进行Response的发送,这样就能非常均匀地将网络报文先读取到系统,再通过内部的线程池进行报文处理的消化,和响应的发送,充分地利用的线程池和消息队列,大大增加了网络的吞吐量;

获取更多信息

Github:https://github.com/easydarwin

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2012-2016

EasyDarwin开源流媒体服务器性能瓶颈分析及优化方案设计的更多相关文章

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

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

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

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

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

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

  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)现在使用Go版本实现了.最新的代码提交,已经支持了推流(或者拉流)的同时进行本地存储. 本地存储的原理,是在推流的同时启动f ...

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

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

  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开源流媒体服务器内存管理优化

    -本文由EasyDarwin开源团队成员Fantasy贡献 前言 最近在linux上跑EasyDarwin发现一个很奇怪的问题,当有RTSPSession连接上来的时候,发现进程的虚拟内存映射一下就多 ...

随机推荐

  1. SHUoj 字符串进制转换

    字符串进制转换 发布时间: 2017年7月9日 18:17   最后更新: 2017年7月9日 21:17   时间限制: 1000ms   内存限制: 128M 描述 Claire Redfield ...

  2. 前端开发 CSS中你所不知道的伪类与伪元素的区别--摘抄

    做过前端开发的人都熟悉伪类与伪元素,而真正能够彻底了解这二者的区别的人并不多.伪类与伪元素确实很容易混淆. 伪元素主要是用来创建一些不存在原有dom结构树种的元素,例如:用::before和::aft ...

  3. elementary os 0.4.1下编译GCC-7.1源码并安装成功

    参考文章:http://www.2cto.com/os/201402/281131.html 前几天为了图个新鲜,安装了elementary os 0.4.1,的确是一股清流,可惜的是gcc版本觉得有 ...

  4. 【開發時,應注意事項】 vendor tools 無法 work 時,怎麼辦?

    遇到 vendor tools 無法 work 時, 最好的方法直接請 vendor 來, 為什麼呢? 因為 tool 可能 有版本的問題, 譬如: vendor tool A tool 在 buil ...

  5. hdu 1186(搜索+HASH)

    方程的解数 Time Limit: 15000MS   Memory Limit: 128000K Total Submissions: 7045   Accepted: 2417 Case Time ...

  6. WCF的学习之旅

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

  7. Codeforces Gym101502 I.Move Between Numbers-最短路(Dijkstra优先队列版和数组版)

    I. Move Between Numbers   time limit per test 2.0 s memory limit per test 256 MB input standard inpu ...

  8. 推荐一款基于 AI 开发的 IDE 插件,帮助提升编码效率

    最近在浏览技术社区的时候,发现了一款神奇 IDE 插件,官网称可以利用 AI 帮助程序员写代码,一下子吸引了我的好奇心.赶紧下载下来使用一番,感觉确实蛮神奇,可以火速提升编程效率. 这款插件叫做 ai ...

  9. cf744

    Codeforces Round #385 (Div. 1) <br > A.Hongcow Builds A Nation 贪心. 显然就是凑成一个最大的块即可 那么首先并查集处理已经确 ...

  10. 51Nod 约数之和

                              1220 约数之和                                  题目来源: Project Euler 基准时间限制:3 秒 ...