背景介绍:北大侠客行命令缓冲机制是为了让玩家最大限度公平利用和平衡系统资源,对玩家每秒钟能执行的命令数上限进行智能动态调整的机制
什么是命令缓冲机制?
大家都有人多的时候系统lag的体验。为什么会lag?因为cpu性能限制,系统一秒钟内能处理的命令也有限。人多的时候,很可能某一秒来了1000条命令,系统拼了命(cpu跑到100%)也就处理了800条,那么剩下200条怎么办?先放在一个临时区域,下一秒cpu优先处理这200条,然后再处理下一秒新来的命令。这就是命令缓冲机制。
那么这不是已经有命令缓冲了么?为什么还要启动?从上面的描述可以看出:1000条指令是排了一个大队,所有人的命令都在一起排着。那么这里面肯定有的人命令多,可能占了上百条,有的人少,只有不到十条。显然让不到十条的和上百条的一起排队不公平,让CPU花大量时间只为一个人服务效率也不高。那么就要修改命令缓冲,每个人自己的指令单独排一个队,给每个人的命令队列设置一个每秒处理的命令数上限,比如30。那么一秒钟内,命令不到10条的玩家肯定能得到结果,命令100条的玩家只能得到前30条的结果,后面70条还需要再等2-3秒才能有结果。如果这个玩家还不收敛,继续暴命令,那么只会越积累越多,自己卡自己,不会卡系统,也卡不了其他人。
总结:命令缓冲机制兼顾了效率与公平。
为什么需要命令缓冲机制?
在北侠副本的说明中已经提到:Mud的运行机制是单核的,无法发挥多核并行优势,因此CPU计算负载很高。除此之外,还有一个重要原因:Mud的所有计算都是在服务器端的,Mud客户端只负责数据收发和文字显示,并不为内容生成、战斗计算以及界面排版等耗费一点点玩家主机的CPU(有复杂机器人的除外,但这些机器人本质上是为玩家更快更有效发送命令而设计的,实际上更增加了服务器的CPU负载)。这一点与现在动辄十几、几十G客户端,还需要几千块显卡的端游完全不同,Mud服务器并没有客户端来分担其功能。
Mud所有计算都在服务器上跑的现状,导致玩家追求的极致速度与服务器负载之间的矛盾不可调和,同时也给了部分玩家一个错觉:我的机器能跑多快,服务器就应该反应多快,反应不过来是服务器或者代码性能的问题,后果不应该由我负担。这就造成了玩家之间的囚徒困境或者内卷:你不狂刷命令自有别人狂刷。
北侠近十年来都在不断升级服务器硬件、优化代码性能,并推出了副本等机制,试图解决这一矛盾。然而路越修越宽,车却越来越堵。优化出来的CPU性能很快就会被新的狂刷命令所占满。由此巫师意识到,单靠巫师单方面的性能优化解决不了问题,必须引起玩家的重视,让玩家自觉提高机器人水平,降低频繁无效的输入,甚至在高峰期自觉降低命令频度,才会让所有玩家保持一个流畅的舒适环境。这就是命令缓冲机制出台的原因。
命令缓冲机制是限制玩家的吗?
要说明的一点是:在过去几十年里,北侠一直有一个设定:一个人一秒内的命令数如果超过30,则多出来的会被吞掉。而在新的命令缓冲机制中,这个设定被去掉了,在cpu比较空闲时,单人单秒命令数上限可以达到40、50甚至60,玩家将体验到更高的流畅性。
总结:命令缓冲机制是尽量利用系统性能为玩家提高体验,只有在性能非常不足的情况下,才会将命令数上限调到比以前小,以提高整体系统性能,避免整体卡顿。并且只对暴刷命令的玩法有负面影响,负面影响也仅仅是命令延迟执行,而不是吞命令。对正常输入速度的玩家只会感觉系统更流畅。
负面影响:命令缓冲机制使得玩家不用担心短时间输入命令过多造成命令被吞,或者被雷劈造成命令无响应等处理(这些处理是其他mud中对输入命令过多问题的传统应对措施,在那些mud中通常设置每秒可输入命令数小于30,甚至15),所以玩家的机器人开始向狂刷命令方向发展。在存在系统吞命令导致破坏机器人的可能时,机器人设计上还会顾及于此,主动降低命令频率,而在命令缓冲机制之后,很多机器人为了提高效率,都是卡着每秒30,40甚至60的上限来输入,以至于系统性能很快被榨干,cpu负载长期处于95%以上。按照上面的比喻,相当于每人排一个队之后,因为没有队伍长短的限制,导致每个人都把队伍排到最长,cpu每秒内对每个人的队伍都要处理到上限,最终结果依然是处理不过来。再加上某些玩家很快忘记了吞命令,被雷劈等的感受,反而觉得命令缓冲耽误了自己输入命令,于是一个提升玩家体验的措施反而更加提升了负载,降低了玩家体验。最终,推出了top cmd机制,结合命令缓冲机制,对使用cpu时间最多的top 3-5个玩家(通常是烂机器人导致狂刷无效命令)加大了限制力度,把cpu时间省下来给大多数人用,系统性能再次好转。top cmd机制的具体说明请在本页搜索“top cmd”。
命令缓冲机制如何生效?
正常来说,玩家一般感受不到任何修改,只有在CPU非常繁忙,系统产生卡顿的时候,暴刷命令的玩家可能会看到:[命令进入缓冲]的字样,提示当前输入命令过快过多,需要等1秒钟左右才会执行此提示后面的命令。
需要说明的是:这里的1秒钟,是指玩家的一个心跳,可能不是完整的一秒,也可能多于一秒。玩家心跳平均每秒产生一次,具体间隔并不均匀。所以可能产生进入缓冲之后不到1秒或者等待多于1秒才开始执行剩余命令的情况,这都是正常的。总体来说平均等待时间为1秒没有问题。
动态调整是如何调整?
1、整体调整策略:整体调整策略是根据CPU的负载情况对所有玩家的指令处理速度进行统一调整的策略,所有玩家受到的影响都相同。
动态调整机制的原理是根据CPU繁忙的状况,动态调整单个玩家每秒可执行的最大指令数,超过此值则进入缓冲。目前设定为:CPU占用低于50%,每秒命令上限到60,低于65%到50,低于75%到40,低于85%到30,85%以上到22。也就是说,只有当CPU繁忙到85%以上之后,每秒可执行的命令数才会低于以前的设定,而当CPU低于75%的时候,每秒可执行命令数将超过以前设定,玩家体验更流畅。
为了更好应对少部分玩家狂刷指令占用大量资源的情况,同时设置了每人每分钟内指令阈值,具体值为:每秒可执行的最大指令阈值×60×一个比例r(通常为50%)。也就是说,每秒钟最多可执行30个指令,并不意味着每分钟可执行30×60=1800条。例如,当r为50%时,玩家每分钟指令阈值为30×60×50%=900,如果一分钟内执行超过900条,此玩家在这一分钟剩余的时间内,每秒可执行的指令数将大大小于系统当前的每秒可执行的最大指令,可能一秒钟运行15条指令就会进入缓冲。下一分钟恢复正常。
动态调整机制根据前10分钟的cpu占用统计数据,10分钟调整一次。
以上设定可能随着系统运行有所调整,不再通知,但总体目标不会变,永远是尽可能利用系统资源为玩家提供更好的体验。
另外,目前动态调整机制仅在主站生效,副本仍然保持固定指令上限,目前为60个/秒。
2、个体调整策略:个体调整策略是在CPU负载较高时(整体策略中每秒命令数限制到30及以下时),对过去十余分钟内消耗CPU最高的top3-5玩家进行更严格的命令数限制的策略。
当前系统处于高负载状态(每秒命令数上限小于等于30),系统会在每次调整命令数时统计过去约10分钟内玩家的命令消耗cpu时间总量,排名前5(命令数22时)或前3(命令数30时)的玩家,如果秒耗时在3500以上,则显示为红色,其同IP所有玩家会被限制到当前命令数上限的1/2至1/5,同时将提醒相应玩家及时查看top cmd和top cmddetail,根据统计结果调整自己的命令模式和频率,以免继续被限制。以第一名为例,其提示信息为:当前为系统高负载阶段,你所在ip的某id过去10分钟内发出的命令所消耗的CPU资源名列全服第1,在后面10分钟内你的每秒可执行命令上限将降低至6个。请查看top cmd和top cmddetail来查看消耗排名和你自己的具体命令消耗,并根据相关信息调整自己的命令模式。
需要注意的是:秒耗时3500以下,即使高峰时段进入top cmd榜单头部也不会受限(如上图第二名),即:如果能保持秒耗时3500以下,就不用担心受限。但是需要说明的是:3500这个阈值仍然很高,相当于每秒钟都有3.5毫秒的CPU耗费在此ID身上,极端情况下CPU只能支持不到300个此类ID。所以这个阈值仍有可能调整,调整时将公告且修改此处。
如果本次被限制之后下轮仍然上榜且受限,说明其命令模式极其耗时,在上轮受限的情况下仍然可以上榜,并且完全忽略了上轮受限的系统提示。则其每秒命令数上限会被调整到1,也就是每秒最多执行一条命令,时长为60分钟。如果过去7天此id曾经受限60分钟,则时长还要延长60分钟*受限次数。
同一个IP同一轮有n个id同时上榜并受限时,限制程度取最大的,限制时间为10*(2^n -1) 。
当命令数上限大于30时,top cmd和top cmddetail只起到提醒作用,无实际影响。
玩家该如何应对?
玩家需要做的就是在看到[命令进入缓冲]的提示之后,减缓命令输入速度,提高命令效率,避免持续暴刷命令导致缓冲区越积累越多最终爆掉(被清空),同时也避免下一轮仍然受限,那样就会限制到每秒1个命令,且时长60分钟+60*过去7天受限60分钟的次数。
注意同一IP的所有ID中,有一个受限,则此IP所有ID均受限。同IP上一轮ID1受限,本轮ID2受限,也视为连续受限。
为什么明明当前每秒命令上限是30,我才输入10来个就进入缓冲了?
这种情况多半是由于玩家频繁发送诸如hpbrief,response等指令,但同时屏蔽了指令回显,只让相关程序去处理,所以在屏幕上看不到。实际每秒指令数应该加上这些被屏蔽的命令。
另外一种可能是由于本分钟内输入指令过多,已经超过了每分钟指令阈值,本分钟内剩余时间的每秒指令上限会相应下降。下一分钟恢复正常。
第三种可能是进入了top cmd中红色受限列表,或者因为之前被限制了60*n分钟,一直延续到现在,即使top cmd中没有,也仍然是受限状态。具体说明见个体调整策略。
如何查看是否受限及剩余时间??