cloudwu/skynet

skynet 开发mmo 遇到性能问题,没有很好的办法排查,希望大家能提供点思路。

kaka5548 opened this issue · 0 comments

不清楚现在issue是否还能提问题
1.最近用skynet开发了一款mmo,基本的结构是每个玩家是个msgagent服务,每个场景是2个服务,1个是场景用于处理逻辑的,另一个是使用云大的caoi模块做成的单独的服务。
2.机器配置是16核心32G内存
3.目前遇到的问题是某些场景在在线人数800+偶发卡顿,一天会发生几次。卡顿的时候aoi模块看着还能正常,人物移动还能刷出来npc。但是点npc对话很难打开。发生问题后,不处理会在几十分钟到个把小时后恢复正常。
4.出问题的时候其他场景,能正常游戏,没有任何影响,很难传送到出问题的场景,传送到出问题的场景也因为卡顿很难离开
5.出现问题的时候机器的cpu并不是很高,应该是只有出问题的那个场景服务的核心跑满了。
6.出现问题的概率应该跟玩家数量相关,但并不是某个场景人数多久一定能触发。如果所有玩家一直待在这个场景反而在线人数很高也不会卡顿,但是如果玩家频繁切场景很容易触发。这是怀疑的一个点。
7.出问题后在msgagent处理message的时候加了skynet.trace(),出现问题时,场景服务处理客户端的请求耗时并不高。
8.出现问题的时间段日志里存在maybe in an endless loop

[2023-10-16 22:19:49] [:00000000] A message from [ :00000000 ] to [ :0000025d ] maybe in an endless loop (version = 248180879)
[2023-10-16 22:20:24] [:00000000] A message from [ :00000000 ] to [ :0000025d ] maybe in an endless loop (version = 247276295)
[2023-10-16 22:22:04] [:00000000] A message from [ :00000000 ] to [ :0000025d ] maybe in an endless loop (version = 252116133)
[2023-10-16 22:22:44] [:00000000] A message from [ :00000000 ] to [ :0000025d ] maybe in an endless loop (version = 252543379)
[2023-10-16 22:25:59] [:00000000] A message from [ :00000000 ] to [ :0000025d ] maybe in an endless loop (version = 260550635)

9.有个问题是出现endless的持续时间并不长,可能在几分钟,但是需要恢复的时间在20分钟往上。
10.目另外一个怀疑是是场景里的统一的定时器,在定时器里处理某个逻辑时消耗太复杂。定时器代码

function scenecore:message_update(delta_time)
    self.eventenginer:dispatch()  --派发延迟时间
    for _, obj in pairs(self.objs) do
        obj:update_time()
        local logic_time = obj:get_logic_time()
        local r, err = xpcall(obj.update, debug.traceback, obj, logic_time) --更新场景内每个obj状态
        if not r then
            skynet.logw("error =", err)
        end
    end
    AOI:message_update() --驱动aoi
    self:running_activitys_tick(delta_time)
end

希望各位能给点思路帮忙排查问题