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) |