golang 高负载问题(一)乱序

原创
2022/06/10 10:23
阅读数 369

5.1 日,线上服务出现异常,表现为 cpu 负载升高,请求处理缓慢,玩家无法顺畅游戏。登陆游戏后服务器容易触发强刷。

通过对日志的检查,初步认定用户任务队列有问题,任务没有被按照请求的顺序进行处理。乱序的问题会间接导致服务器对玩家进行强刷,进而加重服务器压力。

浏览代码后发现,所有用户的待处理任务都被放在了一个全局的链表中(图中 blist),而非每个用户一个链表。每次轮询只检查链表头部的任务是否可以执行。

当用户当前的任务处理完成后,锁被解开,如果此时全局链表的头部任务是这个用户的,接下来的任务可以按照顺序执行。但是在大多数情况下,头部的任务并不是这个用户,此时轮询会执行这个用户的新任务,从而导致了乱序。

解决的方案是,给每个用户分配一个任务链表,彼此独立,在链表里的任务清空前,新的请求会继续添加到链表的尾部,以此保证有序。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部