|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
常常看到一些抱怨,无论多好的服务器总存在媒体的缓冲。经过观察发现,每当连接人数达到一定值时,客户就有播放缓冲的现象发生,而此刻服务器的CPU使用率、内存占用率、带宽占用等都很低,没有理由怀疑服务器此刻的状态。这一问题始终困扰我,后来尝试平均分配554、7070端口来播放,情况也没有根本好转。
一天突然想到可以并列服务试试,就是同一台机器多装几个RealServer看看,详细请参阅 http://service.real.com/help/library/guide...arted.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 filesrealhelixServerrm1.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
最后统计人数,提供在线报告,给出最少人数的端口,生成超连接。会编软件的往往只需要知道思路,而不是源代码,个人的习惯不同,有看别人代码的能力还不如自己编,看不懂的直接引用,往往出了问题就抓瞎。所以我只讲了我的思路,具体请自己研究。我正在整理我的电影系统,准备编写好说明文件后,编译(不含原码)供下载,不写不知道,写说明比编程还要费劲,要面面俱到,麻烦呀,不知道啥时能完成。 |
|