美好乡村建设网站,网站建设会议记录,产品网站有哪些,童装东莞网站建设技术支持EasyDarwin现有架构介绍 EasyDarwin的现有架构对网络事件的处理是这样的#xff0c;每一个Socket连接在EasyDarwin内部的对应存在形式就是一个Session#xff0c;不论是RTSP服务对应的RTSPSession#xff0c;还是HTTP服务对应的HTTPSession#xff0c;都是一个继承自Task类… EasyDarwin现有架构介绍 EasyDarwin的现有架构对网络事件的处理是这样的每一个Socket连接在EasyDarwin内部的对应存在形式就是一个Session不论是RTSP服务对应的RTSPSession还是HTTP服务对应的HTTPSession都是一个继承自Task类的具体应用层对象 EasyDarwin有一个专门的网络事件处理的线程EventThread网络事件线程EventThread一方面采用selectWindows或者epollLinux的网络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了统一都为TaskThreadTaskThread内部循环读取TaskThread::TaskQueue中的Task进行处理获取到MsgTask后解析Msg处理再调用MsgTask中的Session进行Response的发送这样就能非常均匀地将网络报文先读取到系统再通过内部的线程池进行报文处理的消化和响应的发送充分地利用的线程池和消息队列大大增加了网络的吞吐量 获取更多信息 Githubhttps://github.com/easydarwin 邮件supporteasydarwin.org WEBwww.EasyDarwin.org Copyright © EasyDarwin.org 2012-2016 转载于:https://www.cnblogs.com/babosa/p/5904631.html