skynet线上问题查证练习记录(更新中)

发布时间:2026/10/30 14:04:12

skynet线上问题查证练习记录(更新中) cpu暴涨类在匹配服务中新增一个死循环。-- 玩家请求开始匹配functionCMD.start_match(uid,elo_val,name,agent_addr)-- FAULT INJECTION (INJECTED): CPU 死循环 local_fault_counter0whiletruedo_fault_counter_fault_counter1end-- END FAULT INJECTION -- 防重复检查ifuid_bucket_map[uid]thenreturn{okfalse,errmsgalready in matching queue}end-- 找到对应的段位桶localbucket_nameelo.get_bucket(elo_val)localbucket_players_aget_bucket_players(bucket_name)table.insert(bucket_players_a,{uiduid,eloelo_val,namename,agent_addragent_addr,enter_timeskynet.now()/100,})uid_bucket_map[uid]bucket_name rpc.send(chat_mgr,update_player_state,uid,matching)skynet.error(string.format([match_mgr] player enter queue: uid%d name%s elo%d bucket%s total%d,uid,name,elo_val,bucket_name,get_total_queue_size()))return{oktrue}end步骤一、先查看正常情况下的skynet的正常状态服务列表消息队列和cpu内存占用情况查看cpu使用率# 2. 看 Battle 节点的 CPUtop-p$(pgrep-fchatroom.*battle|head-1)-bn1|head-5解析第一行系统概览top - 21:24:02 up 1:13, 0 users, load average: 4.99, 4.75, 4.65字段含义你的值21:24:02当前时间晚上 9:24up 1:13开机到现在 1 小时 13 分—0 users登录用户数0你可能是 ssh 进来的不算load average面试高频考点⚠️ 4.99 / 4.75 / 4.65load average 三个数字指过去 1 分钟、5 分钟、15 分钟的平均负载。含义是等待 CPU 等待 IO 的进程数。你的值 4.99 意味着平均有 5 个进程排队等资源。如果机器是 4 核那已经饱和了。 面试技巧load CPU 核心数 → CPU 瓶颈load 高但 CPU us 低 → IO 瓶颈。第二行进程统计任务: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie字段含义total总计进程/线程running正在 CPU 上跑sleeping在等事件网络 IO、定时器等stopped被信号暂停zombie僵尸进程不为 0 就要查第三行CPU 分解 ⭐ 最重要%Cpu(s): 0.0 us, 1.6 sy, 0.0 ni, 98.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st这是瓶颈区分的核心依据缩写全称含义告警阈值ususer用户态 CPU你的业务代码 80% → 代码死循环/计算密集sysystem内核态 CPU系统调用 30% → 频繁 IO/锁竞争ninice低优先级进程的 CPU通常忽略ididle空闲接近 100% 没事waiowait等磁盘 IO 的 CPU 时间 10% → 磁盘瓶颈hihardware irq硬件中断通常 1%sisoftware irq软中断网络包处理 5% → 网络包太多ststeal虚拟机被宿主机偷走的 CPU云主机关注 5% 不正常你的当前状态us0.0, id98.4→ CPU 几乎空闲还没触发故障。故障触发后你会看到us99.0, id0.0→ 用户态代码吃满 CPU典型死循环。记忆口诀us 高 代码有 bug死循环、复杂计算 sy 高 系统调用太多频繁 IO、锁 wa 高 磁盘慢数据库、日志写盘 si 高 网络包太多DDoS、广播风暴第四、五行内存MiB Mem : 3876.0 total, 112.2 free, 2192.3 used, 1571.5 buff/cache MiB Swap: 2048.0 total, 2045.5 free, 2.5 used. 1408.1 avail Mem字段含义你的值total总内存3.8 GBfree完全空闲112 MB看着少但正常used已用2.2 GBbuff/cacheLinux 用空闲内存做文件缓存可随时释放1.5 GBavail Mem实际可用 free 可释放的 cache1.4 GB ✅Swap used用了多少交换分区2.5 MB几乎没用好事free低别紧张看available。Linux 会尽可能把空闲内存用作文件缓存这是正常的。只有available持续下降才说明内存不够。 排查时你只需要看这三个排查 CPU 问题 → 看 %Cpu 那行us 高 代码问题sy 高 系统调用 排查 IO 问题 → 看 %Cpu 那行wa 高 等磁盘 排查内存问题 → 看 Mem 那行available 持续下降 内存泄漏 排查负载 → 看 load average超过 CPU 核数 系统过载二、查看哪个进程cpu占用使用top看出是skynet的一个进程接着查看skynet是谁cat /proc/{PID}/cmdline | tr \0 PID填写top查询到的异常进程id确定是battle进程有问题# 对 battle 进程采样 10 秒看 CPU 时间花在哪里sudoperftop-p8999看收集结果cpu全在跑lua解释器由于我的linux无法使用pstack为了不折腾环境就是用gdb# gdb 是 pstack 的底层直接用它看 Lua 调用栈sudogdb-p$(pgrep-fbattle|head-1)-batch-exthread apply all bt2/dev/null|grep-A5lua输出中找包含luaD_precall或luaV_execute的栈帧附近会有关键线索。但实际还是看不出来于是就必须开启debug_console来查证问题dbgcmd10TASK但遇到问题使用dbgcmd指令会在cpu暴涨时卡住无法使用我试了下再正常情况是能正常输出.dbgcmd 10 TASK没输出意味着match_mgr 已经彻底卡死拒绝处理任何消息——包括调试命令。 核心学习点Skynet 的死循环服务 彻底失联。dbgcmd、inject、TASK都走skynet.call服务必须在消息循环中才能响应。死循环 消息循环被卡住 所有 debug 命令超时。我后续的解决方案就是引入metrics模块监控rpc组件哪个操作耗时非常高就直接定位。暂时没有找到其他查证手段。内存泄漏环境搭建运维监控机器内存业务支持内存监控组件目前我是开发了一个子服务需要监控的服务就在启动时创建memory_monitor然后定时调用该服务中的gc接口用于监控memory_monitor 核心逻辑架构每个节点一个实例battle / logic独立轮询本节点服务 │ ├─ timer.every(10s) → 回调 │ │ │ ├─ ① 遍历 watch_listskynet.call 每个服务的 diag_mem │ ├─ ② 汇总 total检查两档告警 │ ├─ ③ 上报 Prometheusgauge_set │ └─ ④ 输出日志基线 / 常规 / 告警 / 恢复 │ └─ 被监控服务只需暴露 CMD.diag_mem() 接口两档告警告警触发器防抖单服务超阈值kb ALERT.per_servicealert_state[svc]标记只告一次降回阈值以下发[RECOVER]10 分钟增长recent - oldest ALERT.delta_10min无防抖每次超都告滑动窗口 60 个采样点滑动窗口实现history { {tick, total}, {tick, total}, ... } ↓ 每次 tick: push 新采样点 → 移除 tick now-6000 的旧点 ↓ delta_10min history[#history].total - history[1].total关键设计点skynet.call会永久阻塞被监控服务如果不响应无CMD.diag_mem或 dispatch 报错定时器链断裂之后所有轮询停止。用pcall 失败日志兜底。service 名称必须用小写skynet.queryservice查的是.service本地注册表来自skynet.uniqueservice不是harbor.globalname的集群注册表——大小写不匹配会永久阻塞。collectgarbage(count)返回浮点数所有string.format用%.0f不能用%d。detail字段是诊断内存泄漏的关键被监控服务在diag_mem中返回各数据结构的条目数日志输出match_mgr68KB (match_history3, queue_players0)哪个字段独涨就定位到泄漏源。步骤第一层运维告警机器级Prometheus / Grafana 监控节点 RES/RSS → 单节点内存持续上涨不回落 → 触发运维告警通知研发介入这一层只告诉你哪个节点出了问题不涉及具体服务。第二层memory_monitor 定位服务服务级查看 memory_monitor 日志 → 常规行格式 battle total92KB ⬆ delta12KB d10m12KB | match_mgr92KB (match_history2, queue_players0, uid_mappings0)判定方法观察点结论total持续单调上涨确实有泄漏delta每轮都为正泄漏速率稳定[ALERT] per_service触发单服务越过阈值[ALERT] 10min delta触发长期趋势确认泄漏某服务显示OFFLINE服务挂了或被监控的服务没注册第三层detail 字段定位数据结构结构级match_mgr92KB (match_history2, queue_players0, uid_mappings0) ───────────┬────────── ──────┬────── ───────┬─────── ↑ 独涨 ↑ 归零 ↑ 归零 → 泄漏源就是 match_history判定规则在所有detail字段中正常字段随业务波动归零泄漏字段只增不减。把业务跑一轮再看第二轮的 detailtext第一轮 match 后: match_history1, queue_players0 第二轮 match 后: match_history2, queue_players0 ← 只有 match_history 在涨第四层代码 diff 定位提交代码级git log -- chatroom/service/match_mgr.lua → 找到近期改动的 commit → git diff HEAD~3..HEAD -- chatroom/service/match_mgr.lua → 重点关注新增的全局表、table.insert 没有对应 remove、闭包引用等常见泄漏模式速查模式特征detail 表现全局表只增不减table.insert无对应的table.remove某个 field 单调递增事件监听未解绑skynet.call或timer.every不 cancel内存缓慢增长detail 无明显特征闭包持有大对象匿名函数捕获了 table 引用不释放detail 看不出需用collectgarbage(count)手动对比协程泄漏skynet.fork创建的协程永不退出服务总内存涨但 detail 各字段正常总结四步闭环
延伸阅读

更多相关文章

2026/10/30 13:59:11

Windows 64位 ImageJ 安装包选型:Java 与插件配置全攻略

简介:面向Windows 64位系统的Fiji/ImageJ集成安装包,适合生物医学成像、物理学、工程学及材料分析等科研场景,解决图像查看、测量、滤波与批量处理需求。压缩包约320MB,内含Fiji.app自包含目录,解压后双击启动脚本即可…

2026/10/30 13:59:11

达梦数据复制软件DMDRS控制台命令:DMDRS跟踪命令

关键词:DMDRS跟踪命令、添加源DMDRS跟踪、添加目标DMDRS跟踪、查看DMDRS跟踪、数据同步跟踪摘要:本文介绍DMDRS控制台的跟踪命令,含添加源DMDRS跟踪、添加目标DMDRS跟踪及查看DMDRS跟踪三个命令的功能、语法、参数说明与使用示例,…

2026/10/30 14:59:29

基于MCP服务端让AI自动分析IoT功耗计数据

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 14:59:29

SCUT-HEAD数据集实战:VOC转YOLOv8格式与头部检测训练避坑指南

简介:SCUT-HEAD头部检测数据集是面向目标检测与人数统计场景的公开资源,适合需要训练头部检测或人群计数模型的研究者、学生和算法工程师。该数据集将A、B两部分合并并按Pascal VOC标准统一组织,涵盖4405张图像上的111251个头部标注&#xff…

2026/10/30 14:59:29

离线地图工具包红豆地球V1.182实战:解压、瓦片加载与坐标转换

简介:红豆地球V1.182正式版是一款面向地理信息查看、查询与分析场景的专业地图工具,适合旅行规划、商业分析、环境监测等需求的个人用户与从业者使用。资源包共208个文件,以139个dll动态库、41个csv数据表、10个bin二进制文件为主&#xff0c…

2026/10/30 14:59:29

SpringBoot自动评分系统核心设计:判分规则、异步判分与RabbitMQ实战

简介:为计算机相关专业学生提供一套基于SpringBoot与Vue的自动评分系统源码,适合毕业设计、课程设计或期末大作业实践。系统针对教师人工批改工作量大、效率低的问题,通过预设评分规则自动批改选择题、填空题、编程题等题型,答案与…

2026/10/30 14:54:27

硬件测试工程师全解析:从入门到进阶的核心技能与实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 14:54:27

纯CSS3文字Loading加载动效实现与性能优化指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/30 0:00:46

NCP1342高频准谐振反激控制器:从设计约束到验收的完整方案

简介:NCP1342 高频准谐振反激控制器应用介绍译文文档,面向电源设计工程师、硬件研发人员及开关电源学习者,帮助读者跨越英文原版资料的语言门槛,系统理解这款高集成度 QR Flyback 控制器的设计要点。文档围绕芯片核心特性展开&…

2026/10/30 0:00:46

NCP1342准谐振反激电源设计:从选型到验收的全流程解析

简介:这份文档面向电源设计工程师与开关电源学习者,系统梳理NCP1342高频准谐振反激控制器的应用要点,帮助读者快速理解这款高集成度离线电源变换器控制芯片的工作机制与设计方法。内容涵盖芯片核心特性、引脚功能定义、电气特性参数表、最大额…

2026/10/30 0:00:46

Web系统自动登出机制设计与实现全解析

1. 系统自动登出机制的设计初衷在各类Web应用和后台管理系统中,自动登出功能早已成为标配。这个看似简单的功能背后,实际上涉及用户安全、资源管理和体验优化的多重考量。作为从业十多年的老开发,我见过太多因为登出逻辑设计不当导致的安全事…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑