EasyDarwin流媒体服务器高性能优化方向
我们在EasyDarwin开源流媒体服务器上做了很多的优化,包括前面说到的《EasyDarwin开源流媒体服务器将select改为epoll的方法》、《EasyDarwin开源流媒体服务器高性能设计之无锁队列》,加入我们将EasyDarwin的处理流程分为2层,那么select/epoll、TaskThread任务队列就是第一层,这属于架构的较低层,以上的两个改造,大大提升了底层的效率,据测试,至少可以保证300w/s的处理速度,所以在某种程度上来说,底层已经不再是服务器性能处理的瓶颈了;
再到第2层,也就是RTSPSession层,由于EasyDarwin的消息处理在内部是由BlockingThreads来进行的,也就是说在EventThread将网络事件Task投递到TaskThread之后,TaskThread经过WaitForTask将Task(RTSPSession)从任务队列里面取出来,进行Task::Run()处理,这一步是阻塞的,在Run没有完全处理完成任务之前,整个TaskThread都被阻塞,只有处理完成当前的Task事务才能再去当前TaskThread的TaskQueue任务队列中获取Task处理,如果数据来源比较多,比较快,而Task::Run()执行比较慢,被阻塞,就会导致TaskQueue大量堆积,Task得不到及时处理,这样就算我们在线程池中开辟很多的线程,也不够用,目前我们只能通过保证RTSPSession::Run()快速处理来确保系统执行效率;
于是,我们初步设计出这样一种解决的方法:我们在第2层之上再加一层,第3层,RTSPSession::Run()主要进行的工作是将网络事件进行处理,例如进行数据包的读取,网络断开等工作,不进行数据包的处理,我们将数据包的处理,再通过任务队列的方式,投递到第3层进行处理,第2层在读取到数据、投递完成后,立即返回,保证底层线程执行效率,第3层如果资源充足,可以创造更多的TaskThread来执行具体的消息处理,处理完成再调用Task(RTSPSession)进行响应包的发送,这样就能够形成一个消息异步处理的流程,对整个流媒体服务器又将是一个量级的提升!
获取更多信息
Copyright © EasyDarwin.org 2012-2016
最新文章
- redis主从
- ajex请求的数据 什么时候需用Json.parse()
- 分享25个新鲜出炉的 Photoshop 高级教程
- Markdown 写作工具选择
- WordPress学习
- python一个简单的登录
- cmd获取系统时间
- centos下安装xampp,Zend Guard,memcached
- 关于FireMonkey TGrid赋值的一点小研究
- DB2执行脚本
- 10个实用的PHP正则表达式 (转)
- 监控Nginx负载均衡器脚本
- [原创] Fragment的添加、移除问题
- asp.net缓存(三)
- iTextSharp
- Android App监听软键盘按键的三种方式(转)
- Windows2000源代码 200+MB
- Vue.js指令实例
- selenium之 webdriver与三大浏览器版本映射表(更新至v2.29)
- MySQL 大表优化方案(长文)
热门文章
- Method and apparatus for verification of coherence for shared cache components in a system verification environment
- Linux用户空间与内核空间(理解高端内存)【转】
- 43深入理解C指针之---指针与树
- ajax操作提交整个表单内容
- hdu 1180(广搜好题)
- for 、foreach 、iterator 三种遍历方式的比较
- Android view 数据缓存
- inputclean插件的使用方法
- odoo高级物流应用:跨厂区生产
- BZOJ 3727 PA2014 Final Zadanie 树形DP