maybe in an endless loop又出现了 #1737
ericzhanchina
started this conversation in
General
Replies: 1 comment 13 replies
-
你的消息是从 1e 到 1b 卡住的,如果 1e 指的是 因为你的 log 显示 这倒不是说时间花在 call 对象的处理时间上,因为前面还发生了 5 条 maybe in an endless loop 信息,所以很可能是 call 的回应消息已经放到了 1b 的消息队列,但是 1b 服务由于别的原因一直没有处理这条消息。监控线程是每 5 秒检测一次的,900 秒应该检测了 100 次以上。这个消息数量明显偏少。所以卡住的不仅是工作线程,连监测线程恐怕也卡住了。 除了应该查 1b 服务内是否有别的因素占据 cpu 外。还可以查看是否 skynet 的工作线程数目超过了机器能提供的物理线程数量。 |
Beta Was this translation helpful? Give feedback.
13 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
之前就开贴讨论过这种情况,原来的帖子,那时候以为是日志的问题,所以把原来自己的lua日志服务替换成skynet.error的日志输出了,昨天又发生了这种maybe in an endless loop 的情况。
情况描述是一旦出现这个情况,服务器会卡死大概10几分钟,随后恢复。我看后台的日志输出如下:
从日志看SyncRolePos这个协议卡死了,我的玩家数据存储在内存,变更的部分我会先写入到redis里面,然后定期写回MySQL里面。21:45的这个请求,到了redis服务,也是可以正常执行的,但是看redis打印的执行时间是900多秒。
dbredis是一个主服务,四个从服务处理redis的读写
从代码看21:45输出了redis parameter is,然后就卡死了,知道22点才出来log.info的内容,也就是执行时间,这900秒貌似只执行了一个util.millisecond()方法,这个是一个C函数获得系统的毫秒时间。不应该是这个函数出问题吧。
困扰我很久了,有点儿头疼,请求帮助。
0000000e 是gate,
0000001b,是redis的主服务
0000001e,是redis的从服务,负责读写的。
Beta Was this translation helpful? Give feedback.
All reactions