我们在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)进行响应包的发送,这样就能够形成一个消息异步处理的流程,对整个流媒体服务器又将是一个量级的提升!

获取更多信息

邮件:support@easydarwin.org

WEB:www.EasyDarwin.org

Copyright © EasyDarwin.org 2012-2016

最新文章

  1. redis主从
  2. ajex请求的数据 什么时候需用Json.parse()
  3. 分享25个新鲜出炉的 Photoshop 高级教程
  4. Markdown 写作工具选择
  5. WordPress学习
  6. python一个简单的登录
  7. cmd获取系统时间
  8. centos下安装xampp,Zend Guard,memcached
  9. 关于FireMonkey TGrid赋值的一点小研究
  10. DB2执行脚本
  11. 10个实用的PHP正则表达式 (转)
  12. 监控Nginx负载均衡器脚本
  13. [原创] Fragment的添加、移除问题
  14. asp.net缓存(三)
  15. iTextSharp
  16. Android App监听软键盘按键的三种方式(转)
  17. Windows2000源代码 200+MB
  18. Vue.js指令实例
  19. selenium之 webdriver与三大浏览器版本映射表(更新至v2.29)
  20. MySQL 大表优化方案(长文)

热门文章

  1. Method and apparatus for verification of coherence for shared cache components in a system verification environment
  2. Linux用户空间与内核空间(理解高端内存)【转】
  3. 43深入理解C指针之---指针与树
  4. ajax操作提交整个表单内容
  5. hdu 1180(广搜好题)
  6. for 、foreach 、iterator 三种遍历方式的比较
  7. Android view 数据缓存
  8. inputclean插件的使用方法
  9. odoo高级物流应用:跨厂区生产
  10. BZOJ 3727 PA2014 Final Zadanie 树形DP