Open ggw128 opened 3 years ago
通过测试, 是因为serviceProxyProvider.Invoke
这个问题根据作者的修改代码同步修改后问题依然存在
这个问题根据作者的修改代码同步修改后问题依然存在 这个帖子已经修复,你按照以下进行修复 ChannelHandler adds EventLoop I/O thread for asynchronous processing
419
感谢作者回复,我同步了EventLoop相关的代码,如果把所有的task.run都去掉的话,程序运行一段时间后会阻塞,所以保留了ChannelRead里面的task.run代码,其他的都改成了await,同时新增加了一个单独的workgroup把IO线程和业务线程分开了,但是同步后发现内存还是缓慢增长,分析dump文件后发现占用最多的还是Byte文件 然后继续用dumpheap -mt 7efdf2e6cce0 -min 100 得到所有的byte的地址,选取了几个用do命令看结果如下: 看内容大概可以确定是我的接口的返回值加上网关包装的信息 同时gcroot的结果基本如下都是被Byte强引用了,这部分信息不知道什么原因一直还是没有释放,不知道是不是多线程导致的,但是我完全去掉多线程有概率阻塞系统
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
ok 我今天尝试一下,感谢作者 —————————————————— 刚刚本地测试了一下,发现还是过一段时间就会阻塞,可能跟程序里面没有全部都用async和await有关系,但是现象就是开始是好的,过一段时间就阻塞了,系统没办法相应了,还有其他解决办法吗
解决了阻塞问题后,去掉所有的task.run后还是存在和上面一样的内存泄露,65560大小的字节,都是上面一样格式的内存泄露,作者这边没有这个问题吗
我这边没问题,客户之前的问题新版本都已解决
我检测了所有的和作者提交一样的task.run都去掉了,但是自己本地测试还是一样出现,测试显示不是每次调用都会出现一个65560大小的byte字节,比如我调用同多个接口,每个都调用80多次,只会出现一个65560大小的byte字节。是还有其他地方影响到了吗
感谢作者回复,问题已解决
邮件已经收到,正在处理,请等待.
server经过改造,进程占用内存一直增长,直到进程崩溃,是什么原因?要怎么排查?麻烦指点下。