|
MUD的主要负担包括两个方面:
CPU和IO。由于mudos是一个单线程程序,所以这两者会互相影响。CPU的占用率必须和IO的繁忙程度成比例,整个系统才能处于较优的状态。
北侠从1996年开始,经历了不同的阶段,服务器负载问题的矛盾也一直在转移。
96年到2000年,系统的主要瓶颈是内存。内存不足导致大量的磁盘/内存交换,低速的IO让CPU空转,而整个mud在仅仅40人在线,且绝大部分人连dazuo都是手动的情况下都不敢再加一个玩家。
随着硬件的升级,内存不再是问题。巫师在编写代码时,也不再对内存分毫必较。同时CPU性能的狂升,让计算资源也极大丰富。在socket通讯方面,100,200,300甚至到1000之前,linux都可以无太大压力的处理。所以北侠渡过了一段幸福的时期,直到2008,2009年,系统开始不稳定。
这一次的原因是堆栈溢出。而堆栈溢出的本质原因是系统中的对象太多。其实这个时候cpu和内存依然没有压力,但是原生的mudos堆栈太小,而北侠从2000年开始任务模式的丰富和地图的扩展让堆栈急剧上升。一旦堆栈溢出,系统立刻崩溃。在修改mudos的堆栈配置后,问题消失。北侠重新进入快速稳定阶段。
再后来,mudos又出现了新的瓶颈,这次是cpu的负载问题了。mudos在执行lpc时,通过各种cache极大的提升了效率。但是随着系统代码的继续扩展,cache的命中率急剧下降,最终大部分的cache都hit miss。于是mudos只能每一次都重新定位,cpu负载上升。通过扩大mudos的cache规模,这个问题解决。
这一次的负载问题的罪魁祸首再次是对象数量的继续上升。根据昨晚的统计结果,北侠的对象数量已经突破4w。这4w个对象,即便没有任何活动,没心跳,没动作,对于cpu也是一个巨大的压力。因为在每一个mudos的大循环周期中,都要对这4w个对象进行必要的检查和操作。对目前北侠的服务器来说,4w个对象已经达到极限。
所以,这一轮的优化目标就是减少系统中的对象数量,目标是2w。根据统计,在4w个对象中,房间占大约5000个,各种npc大约占1w个。其他是npc身上的衣服,武器,盔甲。房间生成的各种物品。玩家的粮食,药品,装备,金钱。主要的优化办法是两个:
第一,最直接的减少物品数量。不再掉落伏魔刀,加速尸体腐烂,hyd盗宝人死亡不留尸体,干粮,金疮药等加大重量都属于这一类。统计结果显示出强烈的长尾效应,而非8-2原理。所以相关的修改将是复杂,涉及广泛的。
第二,则是使用写时拷贝技术。对于大量没有特别属性的对象,只保留一个对象和一个计数。平时大家共享一个对象,只有当有人需要修改对象的时候,才会复制出一个对象出来。这个方法相对复杂,需要更长的时间。相比之下,第一个方法会有更快的效果。近期会有一系列针对性的调整。
北大侠客行MUD,中国最好的MUD |
|