Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

一个core dump #362

Closed
yibiaochen opened this issue Oct 24, 2015 · 9 comments
Closed

一个core dump #362

yibiaochen opened this issue Oct 24, 2015 · 9 comments

Comments

@yibiaochen
Copy link
Contributor

我们项目经常有一些endless的报警出现,基本是瞬间报出二三十条,然后就没了。我在raw_dispatch_message里加入了一些代码来检测哪些消息执行时间过长,在消息特别多的情况下,这里发生了core dump

code

@yibiaochen
Copy link
Contributor Author

core

@cloudwu
Copy link
Owner

cloudwu commented Oct 25, 2015

  1. 看起来和你标出的代码没有直接关系, 因为调用栈在 resume 那就没有返回. 也就是第一处的 coroutine.resume(co, true, msg, sz) 的 co 执行的时候就出错了。
  2. 你应该编译链接一个带调试信息的 lua 库,给 lua 加上 -g 并去掉 -O2 ,最后能加上 -DLUA_USE_APICHECK ,这样挂在 lua 虚拟机里,才可能从 gdb 中获取足够信息。除非你对 lua 实现非常熟悉,并有反汇编分析的能力。
  3. 不要用 os.clock() ,skynet 自带了 profile 函数:https://github.com/cloudwu/skynet/wiki/Profile 。你也不需要修改 skynet.lua 而应该在你自己的应用代码里记录时间。
  4. 不要在核心部分调用 skynet.getenv ,它有一个全局锁。
  5. github markdown 语法可以非常漂亮的引用文字和着色代码,下次请不要贴图片了。既不美观,浪费资源,又不方便检索和复制引用。

@yibiaochen
Copy link
Contributor Author

这里的问题比较奇怪,我本地服务器是必然重现的
我改用skynet自带的profile来统计了,确实发现了一些太过耗时的东西
之前对getenv使用有误,也去掉了。。。

@cloudwu
Copy link
Owner

cloudwu commented Oct 27, 2015

能必然重现最好可以确定直接原因.

@yibiaochen
Copy link
Contributor Author

嗯,这个后续我会继续跟进,这两天外服在忙着查另一个头疼问题
我们的skynet进程,cpu24核,开20个工作线程,这几天经常会出现对cpu的使用率降到很低,然后一会又恢复,表现起来就是玩家经常卡个3~5s。
同一台机器,之前最高跑到6500人没问题,最近才3000多反而有了问题
云风有啥建议查证这个问题不?

@yibiaochen
Copy link
Contributor Author

350.6 Tue Oct 27 14:14:47 CST 2015
798.7 Tue Oct 27 14:14:47 CST 2015
271.5 Tue Oct 27 14:14:48 CST 2015
291.3 Tue Oct 27 14:14:49 CST 2015
265.1 Tue Oct 27 14:14:49 CST 2015
130.0 Tue Oct 27 14:14:50 CST 2015
216.6 Tue Oct 27 14:14:51 CST 2015
216.9 Tue Oct 27 14:14:51 CST 2015
171.1 Tue Oct 27 14:14:52 CST 2015
155.3 Tue Oct 27 14:14:53 CST 2015
160.6 Tue Oct 27 14:14:53 CST 2015
236.5 Tue Oct 27 14:14:54 CST 2015
223.5 Tue Oct 27 14:14:55 CST 2015
179.8 Tue Oct 27 14:14:56 CST 2015
204.8 Tue Oct 27 14:14:56 CST 2015
198.8 Tue Oct 27 14:14:57 CST 2015
93.0 Tue Oct 27 14:14:58 CST 2015
136.8 Tue Oct 27 14:14:58 CST 2015
130.0 Tue Oct 27 14:14:59 CST 2015
155.3 Tue Oct 27 14:15:00 CST 2015
111.9 Tue Oct 27 14:15:00 CST 2015
67.2 Tue Oct 27 14:15:01 CST 2015
6.1 Tue Oct 27 14:15:02 CST 2015
6.2 Tue Oct 27 14:15:03 CST 2015
1931 Tue Oct 27 14:15:05 CST 2015
1082 Tue Oct 27 14:15:06 CST 2015
173.1 Tue Oct 27 14:15:06 CST 2015
117.3 Tue Oct 27 14:15:07 CST 2015
99.8 Tue Oct 27 14:15:08 CST 2015
180.8 6.2 Tue Oct 27 14:15:09 CST 2015
1879 99.9 Tue Oct 27 14:15:09 CST 2015
446.9 95.8 Tue Oct 27 14:15:10 CST 2015
159.5 100.0 Tue Oct 27 14:15:11 CST 2015
216.1 Tue Oct 27 14:15:11 CST 2015

这是脚本记录的一段skenet进程cpu使用情况,14:15突然降了下了,一直到6%,恢复后玩家大量上线cpu飚满,然后慢慢恢复到正常

@cloudwu
Copy link
Owner

cloudwu commented Oct 27, 2015

https://github.com/cloudwu/skynet/blob/master/skynet-src/skynet_start.c#L123-L151

工作线程调度只在这一个函数, 你可以修改调试一下,看为什么 worker 会休眠。

如果没有特别的 bug, 那么就是真的 worker 无事可做了。原因可能是:

网络处理其实是单线程的,这个时候除网络线程(阻塞)外,真的只有很少的服务有消息需要处理。

网络线程目前阻塞的已知原因是 dns 查询: https://github.com/cloudwu/skynet/wiki/Socket#%E5%9F%9F%E5%90%8D%E6%9F%A5%E8%AF%A2

@yibiaochen
Copy link
Contributor Author

今天检查了我们的http处理,确实是直接将域名塞进去后向外请求,在跟运营商验证登录的接口频繁使用。
鉴于没法对线上代码做过多处理,我将域名绑定到了host文件,临时解决一下缓解,维护再改用其他方案彻底解决。
观察了一个晚上,暂时没有问题,感谢云风

@DeanHH
Copy link
Contributor

DeanHH commented Aug 23, 2018

期两天遇到一样的问题,我印象中有个问题记录,然后翻回来看了,不过我是要做ip端口检测,快速查看看看对应地址端口有没有开放,所以独立写了一个socket的处理接口,崩溃的堆栈几乎也是差不多,区别在于没发现有卡的问题,目前也没头绪不过先还原了代码用skynet原生的socket来跑,后面在考虑用别的脚本来做这块检测吧。
附上堆栈,协助理解问题。
(gdb) bt
#0 0x00000000004147e0 in luaD_precall ()
#1 0x000000000042017e in luaV_execute ()
#2 0x0000000000414560 in unroll ()
#3 0x0000000000413f4c in luaD_rawrunprotected ()
#4 0x0000000000414b97 in lua_resume ()
#5 0x0000000000428387 in auxresume ()
#6 0x00000000004286a1 in luaB_coresume ()
#7 0x00000000004147e0 in luaD_precall ()
#8 0x000000000042017e in luaV_execute ()
#9 0x0000000000414a9f in luaD_call ()
#10 0x0000000000414af1 in luaD_callnoyield ()
#11 0x0000000000413f4c in luaD_rawrunprotected ()
#12 0x0000000000414dfd in luaD_pcall ()
#13 0x0000000000412211 in lua_pcallk ()
#14 0x00000000004275a0 in luaB_pcall ()
#15 0x00000000004147e0 in luaD_precall ()
#16 0x000000000042017e in luaV_execute ()
#17 0x0000000000414a9f in luaD_call ()
#18 0x0000000000414af1 in luaD_callnoyield ()
#19 0x0000000000413f4c in luaD_rawrunprotected ()
#20 0x0000000000414dfd in luaD_pcall ()
#21 0x0000000000412211 in lua_pcallk ()
#22 0x00007f6f0019a0b8 in _cb () from ../../../Core/109ServerCore_d/luaclib/linux/skynet.so
#23 0x0000000000409ba7 in dispatch_message ()
#24 0x000000000040a754 in skynet_context_message_dispatch ()
#25 0x000000000040af25 in thread_worker ()
#26 0x0000003afdc07aa1 in start_thread () from /lib64/libpthread.so.0
#27 0x0000003afd8e8bcd in clone () from /lib64/libc.so.6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants