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

内存泄漏疑问:服务执行过skynet.exit()后,在debug_console中cmem指令还是能够看到这个服务占用内存 #1090

Closed
zjcmtsx opened this issue Oct 8, 2019 · 8 comments

Comments

@zjcmtsx
Copy link

zjcmtsx commented Oct 8, 2019

项目存在内存泄漏,有几个疑问想请教下各位大佬,谢谢各位!

项目上线后发现内存一直在稳定增长, 内存占用情况如下:
debug_console中mem查看所有服务内存占用123MB
debug_console中cmem查看所有服务占用2021MB
top指令查看进程占用内存2345MB

疑问:

  1. mem和cmem列出来的服务地址,cmem中明显多很多,而且有些服务是执行过skynet.exit()的,但是cmem中显示还是占用内存;
  2. top出来的内存和mem、cmem的关系是怎样的?
  3. cmem出来的内存是否包含mem中的内存,例如cmem查到A服务是100MB, mem查到A服务是50MB,那这个100MB是包含了50MB,还是说这个服务的内存是100MB+50MB呢
@zjcmtsx zjcmtsx changed the title 内存泄漏:服务执行过skynet.exit()后,在debug_console中cmem指令还是能够看到这个服务占用内存 内存泄漏疑问:服务执行过skynet.exit()后,在debug_console中cmem指令还是能够看到这个服务占用内存 Oct 8, 2019
@cloudwu
Copy link
Owner

cloudwu commented Oct 8, 2019

cmem 不包含 lua 分配的内存。cmem 无法被 exit 自动释放。通常为该服务的 c 模块自行申请的内存。

另外,发送出去的消息算作发送服务的 cmem , 需要接收方收到消息才清除。如果接收方未正确释放,会造成泄漏。

@zjcmtsx
Copy link
Author

zjcmtsx commented Oct 9, 2019

cmem 不包含 lua 分配的内存。cmem 无法被 exit 自动释放。通常为该服务的 c 模块自行申请的内存。

另外,发送出去的消息算作发送服务的 cmem , 需要接收方收到消息才清除。如果接收方未正确释放,会造成泄漏。

谢谢云风大哥

@zjcmtsx zjcmtsx closed this as completed Oct 11, 2019
@shyhc
Copy link

shyhc commented Oct 31, 2019

请教下这个问题 你解决了吗 我这边也出现相同的情况 cmem还残留内存占用 小的几K 大的能占到2M多
能提供下定位问题的方法吗

@cloudwu
Copy link
Owner

cloudwu commented Oct 31, 2019

除了上面列过的一些正常情况。

再补充一点,如果一个 so (通常是 require 的 c 库)被一个服务首先加载,那么这个 so 占的内存是算在这个服务上的。如果这个服务退出,但别的服务还在使用这个 so (多次引用)。那么看起来,就有内存未释放。

@jjchenlian
Copy link

除了上面列过的一些正常情况。

再补充一点,如果一个 so (通常是 require 的 c 库)被一个服务首先加载,那么这个 so 占的内存是算在这个服务上的。如果这个服务退出,但别的服务还在使用这个 so (多次引用)。那么看起来,就有内存未释放。
我这边线上只要引用了sharedata,服务退出,cmem就会一直显示内存未释放,这种情况是否属于正常情况?我把sharedata去掉,引用自己写的c模块,服务退出,就不会显示内存未释放,

@zhengjw007
Copy link

zhengjw007 commented Nov 19, 2019

我用服务来做游戏场景 开了2000个 然后exit() 有时候内存回去了 有时候内存没降下去 cmem看到内存是回去了 list lua的进程也不在了 难道lua_close() 有可能收回不了内存?

@cloudwu
Copy link
Owner

cloudwu commented Nov 19, 2019

内存交还给 heap/jemalloc ,不等于交还给 os 。
了解一下 crt 如何管理 heap 。

@zhengjw007
Copy link

多谢解答 继续测下去 的确内存还给了jemalloc 还能复用

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

5 participants