Chinaunix首页 | 论坛 | 博客
  • 博客访问: 262978
  • 博文数量: 19
  • 博客积分: 1608
  • 博客等级: 上尉
  • 技术积分: 335
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-10 10:05
文章分类

全部博文(19)

文章存档

2012年(3)

2011年(6)

2010年(7)

2009年(3)

分类: 服务器与存储

2012-08-29 10:06:14

1. Event
       在TrafficServer的网络事件基础上有一层Event用来描述在底层事件之上的逻辑处理。所有的逻辑处理都是基于event来进行调度和实现。需要处理的Event会被加入到EThread中的列表,从而在EThread的loop中被执行。
2. Call Interface
       Event的调度接口有三种结构:EventProcessor\Event\EThread。这三个接口最后分别schedule。分别为EventProcessor\EThread需要动态申请Event结构。
3. Architecture
4. Main Loop
      事件调度的入口统一为EThread::execute()。其中闲等待分为两种情况:epoll_wait和pthread_cond_timedwait。如果当前线程的Event事件系统中有网络事件(NetHandler),则通过往Event系统中插入1个周期性(NET_PERIOD)的Event(NetHandler::startNetEvent)。从而实现线程的闲等。如果在当前时刻触发的Event中没有网络事件,则通过pthread_cond_timedwait闲等(等待时间通过after队列中事情情况计算得到)。
5. Event signal
       由于事件调度系统会因为没有可以调用的事件进入pthread_cond_timedwait闲等的状态。因此,如果有其他线程往当前线程分配新的Event时,需要及时的触发处理。因此,如果有其它线程往当前线程分配Event,则在写的过程中同时发送一个signal,从而触发pthread_cond_timedwait闲等,以达到快速处理新进来的Event的功能。
6. 问题及改进
 目前ts自己的调度算法为多队列扫描算法,其需要扫描整个队列。因此,在Event数很多时,会存在一定程度上的性能问题。目前对于这样场景的算法主要有time-wheel,RBTree等等。后续可以使用time-wheel算法优化。
阅读(4736) | 评论(1) | 转发(0) |
0

上一篇:TrafficServer一致性hash实现

下一篇:没有了

给主人留下些什么吧!~~

oxwangfeng2016-01-29 16:28:10

很不错啊。。收益了。。