加菲猫窝

现在专注于streaming server & CDN

   博客堂 :: 首页 :: 联系 :: RSS 2.0 ::
随笔 - 104, 评论 - 509, 引用 - 61

导航

关于

专业流媒体服务网
网络防盗链

PageRank
添加到百度搜藏 添加到百度搜藏


和博主MSN

标签

每月存档

最新留言

广告

[笔记] Darwin Streaming server 的 Task 类

这是我在另外一个blog的老文: http://blog.lmtw.com/b/peon/archives/2007/48655.html

 

Darwin Streaming Server 是一个开放源代码的streaming server,对于streaming server的编程和软件结构有着一定的参考价值,它是使用C++写的,其中的并发模式的核心就是Task类,下面写一下我的理解:

多任务的程序常常采用线程+同步阻塞IO的模式, 每个线程/进程服务于一个client,使用阻塞式的IO:

这种模式对于交互式的长连接应用也是常见的选择(比如Telnet)。好处是实现极其简单,容易嵌入复杂的交互逻辑。Apache、ftpd 等都是这种工作模式。但是这种策略很能难足高性能程序的需求。

在handle大量用户的情况下,为了避免创建过多的线程导致context switch开销,常常采用select I/O复用的方法(你可能说select过时了,不过Darwin QTSS就是用的这个, 说实话,这个框架的IO部分确比不上libevent/ACE):

上面是经典的select IO复用的过程, 以上的过程可以由3步来描述:

  1. 应用注册事件

  2. 事件触发通知应用

  3. 应用运行处理事件

注意在SELECT THREAD有3个任务:接受事件注册,等待事件触发,驱动SESSION处理事件,这些任务可以分解为不同的角色,我们可以在这种模式里定义4种角色:

1. EventHandler : EventHandler 向 EventGenerator注册事件,并对注册事件进行处理

2.EventGenerator :EventGenerator接受事件注册,当事件触发的时候,通知 EventHandler

3.EventHandler Driver : EventHandler Driver 驱动EventHandler 的运行,当它发现有 EventHandler 受到事件触发以后,调度运行 EventHandler 的事件处理函数。一个EventHandler Driver可以驱动多个EventHandler。多个EventHandler Driver可以组成 Pool 进行驱动EventHandler。

4. Event Driver : Event Driver 驱动 EventGenerator 的事件触发。EventGenerator本身不包含执行线程,需要Event Driver的驱动。多个EventGenerator 在 Event Driver 中等待事件,当事件发生时,Event Driver调度 EventGenerator的来触发事件。

下面就是Darwin对各个对象和上述角色的对应:

  1. Task 就是对EventHandler的对象化封装。每个Task对象有两个主要的方法:Signal和Run。当服务器希望发送一个事件给某个Task对象时,就会调用Signal()方法;而Run()方法是在Task对象获得处理该事件的时间片后运行的,服务器中的大部分工作都是在不同Task对象的Run()函数中进行的。每个Task对象的目标就是利用很小的且不会阻塞的时间片完成服务器指定某个工作。应用可以通过继承Task 并重写Run()方法实现自己的任务。

  2. EventContext 对应EventGenerator的角色,事件的触发者,当事件发生时,调用Task::signal().

  3. TaskThread 对应EventHandler Driver的角色。任务的驱动线程,对一个或者多个Task进行调度,通过调用 Task::run() 处理事件

  4. EventThread对应Event Driver的角色。EventContext的驱动线程,可以处理多个EventContext, 发生事件时调用EventContext::process_event(),后者将调用Task::Signal()

流程:

  1. Client或者 Task的子类向Event Context注册事件。

  2. Event Context将事件放入EventThread的Pool内。

  3. EventThread 调用select 等待多个事件中任一个触发。

  4. 事件触发以后,EventThread调用 Event Context::process_event()。

  5. 调用 Task::signal()。

  6. Task::signal()将task放入TaskThread的队列。

  7. TaskThread调度相应的Task, 执行其Run()方法。

posted on 2009-08-29 22:01:38 by peon  评论(2) 阅读(3531)

关于Youtube 的平均文件尺寸与GFS

Google的Sean Quinlan 最近提到老的的GFS设计已经不适合Google的一些新应用,包括youtube. 除了单metaserver以外,其他的方面暂时还想不到 GFS 在 youtube 上出了什么问题。比如 GFS 的大文件假设?

其实在我的感觉里,youtube文件应该尺寸不小?不过查一下google吧, 有一份07年末的数据:

http://www.websiteoptimization.com/speed/tweak/average-web-page/

In 1997, 90% of videos were under 45 seconds in length (Acharya & Smith 1998). In 2005, the median video was about 120 seconds long (Li et al. 2005). By 2007, the median video was 192.6 seconds in duration (Gill et al. 2007). The median bit rate of web videos grew from 200Kbps in 2005 to 328Kbps on YouTube in 2007. So by late 2007, the median video weighed in at over 63MB in file size. On YouTube, the average video size is 10MB, with over 65,000 new videos added every day.

在2007年末,Youtube 平均文件尺寸是10MB,这个也解释了 the assumption of GFS 在youtube上碰到了一些问题的原因,我想我大概是只在土豆上看电影,搞得以为文件都是大于60MB的。其实 youtube 上短片还是短片居多,但是我还是疑惑,按理来说,视频文件的尺寸增长应该是极为迅速的,今天文件小了点,以后就会足够大了。你看youtube不是将上传的限制提升到2GB了么?

另外,还有一个资料也不错,老了点,仅供参考吧

http://tech.163.com/09/0305/22/53M4VD3D000915BF.html

http://www.pbdigg.net/show/14773.html

comScore的报告还显示,今年10月网络视频的平均播放时间为3.0分钟。Hulu视频的平均播放时间为11.6分钟,高居各大网络视频公司榜首。
comScore的报告内容还包括:
·77%的美国网络受众观看网络视频。
·每个网络视频观看者每月观看274分钟的视频。
·超过80%的18岁至34岁的年轻人观看网络视频。18岁至34岁的年轻人每月收看4.8小时的网络视频。
·YouTube的单一访问用户达到9950万人,他们收看了53亿次视频,平均每个用户收看53.2个视频。
·MySpace的单一访问用户达到5120万人,平均每个用户收看8.0个视频。
·每段视频的平均播放时间为3.0分钟。
·Hulu视频的平均播放时间为11.6分钟,高居各大网络视频公司榜首。

 

牢骚一下,twitter/youtube 国内都访问不了,google.com经常打不开,查个资料还经常“载入页面时到服务器的连接被重置”,多半是被墙了,真的挺没劲。

posted on 2009-08-29 22:00:17 by peon  评论(0) 阅读(3048)