2012-10-08 15:31:35 来源:CIO时代网
视频服务器涉及的技术很多,如流调度、磁盘I/O、磁盘存储、VCR功能实现等。本文重点从磁盘和文件调度与节目流调度策略两个方面讨论提高数字电视视频服务器的整体性能的技术。
2.1视频服务器的磁盘和文件调度
数字电视视频服务器与普通操作系统的磁盘调度不同,需采用带有在规定时间限制内完成的实时调度算法。适合流媒体的调度算法有EDF、RM、DSr等。LMD(Least Missed Deadline)算法是对服务超时限数作为优化对象的实时调度算法。本文采用一种称为贪婪LMD的调度算法GLMD。GLMD算法的核心为:(1)精确地计算服务每一个请求的时间,提高优化结果的可信度;(2)寻找服务超时限数最小的服务队列为最佳队列;(3)在满足服务时限的请求时,利用SCAN算法服务处在其移动路线上的请求。
设原服务队列为?鄢q,新加入的服务请求为?鄢r,best_Deadline为原最佳服务队列超时限数,new_Deadline为插入新请求后服务队列超时限数,best_time为原最佳服务队列总服务时间,new_time为插入新请求后服务队列总服务时间,具体的GLMD算法如下所示:
void sbull_request(request_queue * q,request * r)
{
best_Deadline=+∞;
new_time=+∞;
while(1)
{for(i=0;i add_queue( * r,i);/ * 把请求插入队列i的位置 * /
int new_Deadline=compute_Deadline( * q);/ * 计算当前
/ * 超限数Deadline * /
if(new_Deadline {best_queue= * q;/ * 当小于原服务超时限数,该服务 * /
best_Deadline=new_Deadline;}/ * 队列为最佳服务队列 * /
if(new_Deadline==best_Deadline)
{new_time=compute_time( * q);/ * 计算当前总服务时间 * /
if(new_ time {best_queue= * q;/ * 当小于原服务时间,该服务队列 * /
best_Deadline=new_Deadline;}/ * 为最佳服务队列 * /
} } } }
函数compute_Deadline( * q)主要计算当前队列是否有请求超时限以及有多少个请求超时限。函数 compute_time( * q)主要计算磁头寻道延时、磁盘旋转延时、数据传输延时、总线传输延时和命令处理延时五部分。总线传输延时和命令处理延时大小相对稳定;数据传输延时由磁盘读取带宽和数据大小决定;磁头寻道模型有加速、匀速、减速和定位四个阶段,其中加速和减速的加速度恒定。当磁头寻道的距离d为1~4个磁道时,仅有定位阶段;当磁头寻道的距离d(磁道数)为4400时,磁头寻道有加速、匀速、减速和定位四个阶段。磁头寻道延时计算公式如下:

[page] 磁盘旋转延时为旋转等待时间,可取其数据期望值,即磁盘旋转一周所需时间的一半。
在Windows平台实现时,有二种途径:(1)写一个lower filter挂在disk.sys下,GLMD算法在lower filter中实现。(2)直接改写DISK.SYS,其中DISK.SYS的源代码可以由Microsoft的DDK(Windows Driver Development Kit)得到。在Unix平台实现时,磁盘设备属于区块设备, GLMD算法主要改写区块设备request等相关函数,磁盘设备的驱动程序在drivers/ide/下,区块设备的驱动程序的request方法定义在linux/blkdev.h中。
为了检验GLMD算法的效果,找到单个服务器吞吐量上限(调度条件),本文做了大量实验,实验数据如表1所示。

播出节目为同一个节目,平均带宽为4.2MB,每一路节目为该节目的一个备份,所得结果为12h和24h检测到的超时限次数。服务器硬件配置为:PⅢ Xeon 800/512MB内存/SCSI硬盘/100MB自适应网卡。
2.2 节目流调度策略
MPEG码流不是码率恒定的。本文实现的视频服务器采用内存缓冲平滑策略:每次磁盘访问连续读取相对大数据量的数据,数据首先缓存于内存中,平滑MPEG码流的突发码流,并减少磁盘访问次数。在实际处理时,针对不同的视频流码率和当前总输出缓冲区的情况,对每一个视频流确定一个读取文件的输入缓冲区。总输出码率与所有数据文件的总码率有关。
2.2.1 视频流文件读取
实验表明,通过读取大的请求(64KB),一次读取磁盘上的若干数据块,绕过文件系统作缓存可以使处理器开销减小一个数量级,从以前的每字节两个机器指令减少到每字节0.2个机器指令。对于所有大于8KB的请求,无缓冲的顺序读取达到了磁盘传输率的极限,并且磁盘控制器的预取机制起到了流水线的并行作用,使驱动器读操作可以达到内部传输率的极限。经过实验,本文选择了每隔0.3s进行连续文件访问,每次I/O操作读取数据为64KB的读取方式。
2.2.2 输入缓冲区
输入缓冲区操作根据2个阈值进行,即大于A%为满,小于B%为空。A、B这两个阈值的选择很重要。每次进行输入缓冲区操作前,检测输入缓冲区的状态。当缓冲区快满时,暂停并等待下一次进行输入缓冲区操作;同样,每次完成输入缓冲区操作后,检测输入缓冲区的状态。当缓冲区快空时,重复输入缓冲区操作,防止缓冲区出现下溢,处理更多的传输流分组。具体操作如下。
(1)输入缓冲区操作
while(!EndOfFile){
每隔0.3s处理如下操作
if(缓冲区的状态< A %){
do{进行缓冲区操作} until (缓冲区的状态>B%)
}
}
免责声明:本网站(http://www.ciotimes.com/)内容主要来自原创、合作媒体供稿和第三方投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。
