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

server进程占用的内存一直增长,直到进程崩溃,是什么原因? #413

Open
ggw128 opened this issue Jun 6, 2021 · 11 comments
Labels

Comments

@ggw128
Copy link

ggw128 commented Jun 6, 2021

server经过改造,进程占用内存一直增长,直到进程崩溃,是什么原因?要怎么排查?麻烦指点下。

@fanliang11
Copy link
Owner

通过测试, 是因为serviceProxyProvider.Invoke调用造成,会造成多个小的65560不释放, 通过接口代理调用没问题,这个问题会进行修复,请耐心等待
图片
图片

fanliang11 added a commit that referenced this issue Jun 6, 2021
Fix memory leak problem based on routepath call #413
@StayGoldTY
Copy link

这个问题根据作者的修改代码同步修改后问题依然存在

@fanliang11
Copy link
Owner

fanliang11 commented Apr 10, 2024

这个问题根据作者的修改代码同步修改后问题依然存在
这个帖子已经修复,你按照以下进行修复
ChannelHandler adds EventLoop I/O thread for asynchronous processing
#419

@StayGoldTY
Copy link

感谢作者回复,我同步了EventLoop相关的代码,如果把所有的task.run都去掉的话,程序运行一段时间后会阻塞,所以保留了ChannelRead里面的task.run代码,其他的都改成了await,同时新增加了一个单独的workgroup把IO线程和业务线程分开了,但是同步后发现内存还是缓慢增长,分析dump文件后发现占用最多的还是Byte文件
微信图片_20240411102910
然后继续用dumpheap -mt 7efdf2e6cce0 -min 100 得到所有的byte的地址,选取了几个用do命令看结果如下:
image
看内容大概可以确定是我的接口的返回值加上网关包装的信息
同时gcroot的结果基本如下都是被Byte强引用了,这部分信息不知道什么原因一直还是没有释放,不知道是不是多线程导致的,但是我完全去掉多线程有概率阻塞系统
image

@fanliang11
Copy link
Owner

fanliang11 commented Apr 11, 2024

task.run

不能用task.run, 业务线程改成以下就行:
var eventExecutor = new MultithreadEventLoopGroup();
pipeline.AddLast(eventExecutor, "HandlerAdapter", new TransportMessageChannelHandlerAdapter(_transportMessageDecoder));
pipeline.AddLast(eventExecutor, "ServerHandler", new ServerHandler(async (contenxt, message)
之前用SingleThreadEventLoop,不耗时可以用
业务耗时用MultithreadEventLoopGroup

@StayGoldTY
Copy link

StayGoldTY commented Apr 11, 2024

ok 我今天尝试一下,感谢作者
——————————————————
刚刚本地测试了一下,发现还是过一段时间就会阻塞,可能跟程序里面没有全部都用async和await有关系,但是现象就是开始是好的,过一段时间就阻塞了,系统没办法相应了,还有其他解决办法吗

@StayGoldTY
Copy link

解决了阻塞问题后,去掉所有的task.run后还是存在和上面一样的内存泄露,65560大小的字节,都是上面一样格式的内存泄露,作者这边没有这个问题吗

@fanliang11
Copy link
Owner

我这边没问题,客户之前的问题新版本都已解决

@StayGoldTY
Copy link

我检测了所有的和作者提交一样的task.run都去掉了,但是自己本地测试还是一样出现,测试显示不是每次调用都会出现一个65560大小的byte字节,比如我调用同多个接口,每个都调用80多次,只会出现一个65560大小的byte字节。是还有其他地方影响到了吗

@ggw128
Copy link
Author

ggw128 commented May 19, 2024

感谢作者回复,问题已解决

@xiaobei930
Copy link
Contributor

xiaobei930 commented May 19, 2024 via email

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

No branches or pull requests

4 participants