大面积断线原因分析
昨天,在台服上运行的服务器爆发了大面积断线。从时间点上看,跟一个副本活动高度重合,因此,今天早上就紧急屏蔽了该活动模块。
拿到 log 进行分析,看到的异常大部分是从战斗副本返回主城时发生的。副本活动产生的异常倒是没有看到,而且这个副本在国内也经历过几个运营商实际运营的测试,出现问题的机会应该比较少。
从战斗副本返回主城的过程经过一次调整,原有的流程是副本退出时保存到 mysql,再在主城里从数据库恢复过来。现有的流程,是先把所需数据打包,然后通过 tcp 发送到主城,由主城进行解包并恢复到角色身上。
个人猜测,是因为序列化过程有性能问题,导致序列化过程缓慢。这个副本活动有个特点,就是同时返回主城的角色会比较多。因此,当多个角色同时返回时,主城进程就会因为序列化而卡住。客户端与主城间有保持心跳连接,当发生心跳包超时,客户端就自动断开连接。断开连接后,需要将角色数据保存至数据库,这无疑加重了主城进程的负担。于是,雪崩效应就形成了。
下午,主程发布了修复,是序列化过程里,用于标识序列化属性的列表不断增长导致的。于是,每次检查属性是否需要序列化的时候,都要遍历一个极长的列表,所以极为缓慢。问题解决
Tag:
python