解决real缓冲的问题

原创 2005年02月28日 01:40:00

有效降低RealServer服务中的客户缓冲现象-转载

下面的方法大部分网友反映有效,可是我觉得...难于理解realserver会有这个搞笑的地方,我使用一个realserver也达到了好效果,有的网友使用了5个还是缓冲

http://souxin.gzrail.net/dvbbs/dispbbs.asp?boardid=2&star=1&replyid=42766&id=108&skin=0&page=1


[URL=http://www.7ctv.com/helix]点击这里观看:Helix安装、配置、ODBC认证及克隆[/URL]


    感谢大家的关注,为了查阅方便我总结了前60帖的讨论。

    常常看到一些抱怨,无论多好的服务器总存在媒体的缓冲。经过观察发现,每当连接人数达到一定值时,客户就有播放缓冲的现象发生,而此刻服务器的CPU使用率、内存占用率、带宽占用等都很低,没有理由怀疑服务器此刻的状态。这一问题始终困扰我,后来尝试平均分配554、7070端口来播放,情况也没有根本好转。

    一天突然想到可以并列服务试试,就是同一台机器多装几个RealServer看看,详细请参阅 http://service.real.com/help/library/guides/server8/htmfiles/started.htm#35132 。
按照说明进行了如下工作,把原来的rmserver.cfg拷贝到 bin目录下,更名为rm2.cfg,名字短点好输入,放置和 rmserver.exe相同的目录好操作。把rm2.cfg中的端口都加1,如554,7070改为555,7071等等。

一、如何安装多个服务
    [参考 lucian (hyne) 的 单机安装多个helix server全攻略]
    首先复制上述的配置文件,用文本编辑器修改各个端口设置,如果你想多个,那么另存为多个名称不同的配置文件。然后注册系统服务:cmd下转到 ../bin目录
  运行:rmserver -install:rm1 "你的实际路径/rm1.cfg" ,其中rm1是你命名的服务名称,可以按你的意愿取名。
    返回消息应该是Successfully installed the rm1 Service。如果想再安装rm2 service按照同样的方法完成。你可以在DOS启动这个新服务:rmserver.exe rm2.cfg。
    Real公司还提供了一种方法: 先执行 rmserver.exe -import:rmReg2 rm2.cfg 导入注册表,再执行 rmserver.exe -install:rm2 "rmReg2" 注册服务,用rmserver.exe registry:rm2 来启动服务。我个人认为这个比较麻烦,还不容易修改,不推荐。
    最后在服务管理里能发现新添加的rm1 ... 服务,修改其属性为自动启动,这样每次重新启动机器,服务都会自动运行的。

提示:
   rmserver -install:rm1 "????",如果这个路径不包含空格,就可以直接启动了。如果含有空格,你需要进入注册表,搜寻rm1.cfg这样的关键字,修改StartupParams项,检查其路径是否与你实际的一致,路径如果有空格,一定要把引号加上,如: "C:/program files/real/helixServer/rm1.cfg" 。建议大家都要检查这一项,因为有时比如RealServer8.x就写个错误的路径在那里,所以总有人说RealServer8.0不行,其实你把注册表修改对了就可以了。
   各个rmx.cfg中的端口不能相同,否则会发生端口冲突,造成无法启动服务,这也是许多人初次尝试失败的原因。我的经验是先对首个服务进行全面的配置,如加载点,IP限制等等,然后再复制这个配置文件,这样不仅能快速配置其它服务,而且也能保证配置的同步性。

二、有效性
    大多数人经过试用都表示有效,但也有如xxzHou就表示没有效果,他启动了4个服务,120以上时,客户端就出现缓冲,"而改用http方式时,此服务器可以提供600-700不缓冲播放500k左右的电影",对于引号中的声明我感到怀疑。首先我声明,这个方法是有效的,是我通过实践总结的。
    首先你要确认你的机器是否有余量,例如我的60人时缓冲,此时CPU使用率只有10%,内存也绰绰有余,这时启动多服务是有效果的。但服务不是越多越好,2-4个为好,这时CPU能到50-60%,这时的负荷已经很重了,能在40-50%是最好的。另外客户端的机器和软件状态不佳,也是造成缓冲的重要原因,还有你是否真正做到了服务平衡。
    我也发现不是所有的机器效果都明显,尤其是播放高带宽,如400-500k以上的,所能承受的人数急剧下降。带宽也是原因100M带宽的理论值是多少?不好说,还有收发器、交换机都能达到100M?我们没有有效的手段检验,专业性的仪器太贵,承受不起。但我知道原以为那些光纤收发器都是高科技产品,其实小厂都能生产,两三百元就能买到,而且质量良莠不齐,我们多次发现因为收发器性能下降造成实际带宽的下降。
    我个人认为所谓百兆可能只能发挥60-80M能力,这样你算算多少人?200多人的在线吧,如果你还同时通过这条线路提供网页、游戏等其他服务,可能打的折扣多了。上面说的"600-700不缓冲播放500k左右的电影",这时带宽多少呀?百兆是不可能的,只有是千兆网,这样的话是否全部通道都是千兆了?

    题外话,电信内部人员最终承认,发现1M的ADSL只能看225k的电影,2M看350k的,因为当别人报告缓冲时,他们用8M的看,结果一切正常,我猜测这可能是ADSL交换那儿不太好,不过谁敢对电信指点一二呀!所以具体说来这是个系统的综合问题,不能片面地钻一个地方。总之我是把服务器的性能发挥到极限了,剩下的只能看天命了。
    采用http是不错,我一度也曾采用这个办法,结果开始不错,当人数上来后就不行了。且人家能高速下载了,而且一旦稍有缓冲大家都开始下载,http不好限制线程,结果更拥挤更累机器,最终还不如流播放。另外中途中断了不能接续,拖放也不自如,还是不用为好。
    我个人认为是rm的服务软件的效率不行,至于版本估计美金买的也好不了哪去,要是D和正之间有这么大的差距,就不会打击D版了,这是多好的广告呀。目前为止我比较了周围的流媒体服务情况,在相同的硬件条件下,我这个是最好的。当然还有许多不满意的,所以才公开经验,希望有更好的建议和方案出现。
    
    通常流媒体服务器都是专用的,所以封闭全部不需要的端口,防止黑客攻击,我的就被攻击过。关闭不需要的服务,尽量释放系统资源,你可以尝试着关,只要不影响运行和服务的都关掉。我认为不要装防火墙、杀毒软件等这些软件,这些都涉及系统内核操作,消耗的资源不知道有多少。既然是服务器,你不会在上面玩游戏、看网页的,不存在感染病毒的途径。网友 quake777 称他的小服务器,不小心装了个瑞星防毒,HAHA~,25人联线就缓冲了。换了个诺顿企业版,最高40人联线时还跑得疯快,说明这些软件是有影响的。

三、关于Real官方的冗余和动态负载平衡
    关于Helix的冗余,不知大家仔细看过,它需要多台Helix服务器,这个好办,机器不缺。但你的内容加载点呢?我将近1T的资料,3台Helix服务,需要额外2T的内容空间,而且还要保证同步,我看是比较麻烦的。如果我真的有,我也会拿来增加内容,而不是做冗余。楼上还有一位说的DNS动态平衡也是针对多台Helix服务而言,通过DNS来分配不同的机器来提供服务。
    当然你可以使用专用的磁盘阵列,这也是Helix图例里表明的,多个Helix服务器共享这个阵列,通过DNS分配或其它方式均衡这些服务器,平衡服务。可是投资呢?不用说专用阵列了,单SCSI硬盘大家就知道有多贵了。要知道多数人的服务都是免费的,好多都是个人爱好者,像我一样,用普通微机做服务器,且没有发现IDE硬盘是瓶颈。那些专业的配置就不用考虑了吧。而且大家也看到讨论的,那些2个CPU的专业服务器 120人就缓冲了,赶不上我5000元2台服务器的(显示器不用的啦,远程控制的),呵呵,你们说呢?
    我的关键是一台机器,进行多个进程的同时服务,是尽力发挥一台机器的能力,和Real官方的说法是两个不同的概念。

四、端口平衡
    hyne 的算法挺好:
  Randomize
   rndcount=Int(Rnd*3)
   if rndcount=0 then
   response.write "pnm://*.*.*.*:7070"+url
   end if
   if rndcount=1 then
   response.write "pnm://*.*.*.*7071"+url
   end if
   if rndcount=2 then
   response.write "pnm://*.*.*.*:7072"+url
   end if

    我是采用asp.net编程,主要涉及以下内容,相关人员一看就会懂的。
    首先设置服务的数量和端口,在web.config中:
  
    
    
    
    程序自动寻找HelixPort、WebPort和FTPPort加上递增的序号,直到找不到为止,如寻找到HelixPort3或WebPort2,发现不存在就终止。后面的值是我自己设定的格式,是名称加端口。程序会自动把HelixPort1的端口作为一组统计,同时把所有Helix类型的也统计在一起,这样提供给网页能实时反映在线人数,及其分布。最后有一个这样的结构数组,[端口号,不会出现重复的][组别,指Helix1,FTP1这类][类别,指Helix、Web这样的大类]。
        Public Structure moviePortDefine
            Dim TCP_port As Integer '端口号
            Dim GroupID As Integer  '分类索引
            Dim GroupName As String '分类名称
            Dim Cnt As Integer      '在线人数
            Dim TypeID As Integer   '端口序号
        End Structure

    然后有个程序对各个端口进行扫描:
        Dim p As New Process()
            p.StartInfo.FileName = "netstat.exe"
            p.StartInfo.Arguments = "-n"
            p.StartInfo.UseShellExecute = False
            p.StartInfo.RedirectStandardOutput = True
            p.Start() '执行了 netstat.exe -n 命令

        Dim output As String = p.StandardOutput.ReadToEnd()
            p.WaitForExit()

            Dim ss() As String = output.Split(vbCrLf)
            Dim ssTcp() As String
            Dim i, j, k As Long
            For i = 1 To ss.GetUpperBound(0) '寻找ESTABLISHED,表示建立连接的端口
                If InStr(1, ss(i), "ESTABLISHED", CompareMethod.Text) > 0 Then
                    k = InStr(ss(i), ":")
                    If k > 0 Then j = InStr(k + 1, ss(i), " ", 1)
                    If j > k Then
                        k = Val(Mid(ss(i), k + 1, j - k))
                        For j = 0 To NowFindedPort.GetUpperBound(0)
                            If k = NowFindedPort(j).TCP_port Then
                                NowFindedPort(j).Cnt += 1
                                Exit For
                            End If
                        Next
                    End If
                End If
            Next

    最后统计人数,提供在线报告,给出最少人数的端口,生成超连接。会编软件的往往只需要知道思路,而不是源代码,个人的习惯不同,有看别人代码的能力还不如自己编,看不懂的直接引用,往往出了问题就抓瞎。所以我只讲了我的思路,具体请自己研究。我正在整理我的电影系统,准备编写好说明文件后,编译(不含原码)供下载,不写不知道,写说明比编程还要费劲,要面面俱到,麻烦呀,不知道啥时能完成。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ubuntu12.04 64bit编译android ics4.0代码出现的/usr/bin/ld.bfd.real: cannot find 问题解决

编译环境 vm+ubuntu12.04 64bit + android ics4.0代码 在编译源代码的时候出现该错误 /usr/bin/ld.bfd.real: cannot fi...

解决REAL VIDEO的视频平滑问题 (转)

存在问题:当前的播放器产品上,播放REAL VIDEO时,虽然文件是25fps的,并且在DEOCDER和RENDER都没有丢帧,但是视频看起来就是一顿一顿的,不流畅,但是并没有延迟。1、检查后,发现问...

解决图像刷新问题的VC++双缓冲方法

在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息 的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法 就...

MFC双缓冲解决闪烁问题

最近在写一个图像编辑软件,环境是MFC,但是MFC的视图刷新机制使得图像闪烁得非常厉害(图像缩放时尤其明显),在网上查了一些资料,最好的方法是用双缓冲的方式显示,这里总结一下。   双缓冲的原理可以...

PHP逐行输出数据并解决两种常见缓冲问题

PHP逐行输出数据并解决两种常见缓冲问题

怎么解决游戏中得闪烁问题--VC双缓冲绘图

用vc做的画图程序,当所画的图形大于屏幕时,当拖动滚动条时屏幕就会出现严重的闪烁情况,为了解决这一问题就得使用双缓冲来解决这一问题,程序产生严重的闪烁问题是因为画图过程中前后两次的画面反差很大造成的人...

【问题未解决】文件读写缓冲清理 fflush()

最近写了一个用Mini-XML写XML小程序,读取原来XML内容然后进行修改。 但是发现每次写XML时,没有将原来的文件内容全部清除,只是将新的内容覆盖上去。 纠结了N久才以为...

帧缓冲对象-实践过程问题及解决

自从面试腾讯实习生结束后,一直在学习OpenGL,以前断断续续学过,但是主要的参考材料是 < >(俗称红宝书)以及网络上零零碎碎的博客,去年在创业公司实习时,也学过,但是学习的效果一直都比较差,学到...

双缓冲方法解决屏幕刷新闪烁的问题

双缓冲方法解决屏幕刷新闪烁的问题 2009年02月24日 星期二 16:12 http://dev.21tx.com/2005/05/06/11850.html 下载本文...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)