V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
panjiaming
V2EX  ›  Java

Netty 客户端程序运行一段时间假死

  •  
  •   panjiaming · 2023-03-04 10:47:37 +08:00 · 2100 次点击
    这是一个创建于 655 天前的主题,其中的信息可能已经有所发展或是发生改变。

    客户端程序运行一段时间就假死

    • 查看 GC 情况发现新生代和老年代的内存都满了
    • 又去查看了实例数,发现最多的实例数是 netty 相关的包

    想到对方服务端最近总是登录不上,会不会是断线重连的代码有问题。新手程序员第一次遇到这种问题,没有任何报错日志,请各位大佬赐教。

    这里是 GC 情况、实例数和假死前最后的日志: https://imgur.com/a/9AKTlBz

    第 1 条附言  ·  2023-03-04 11:42:24 +08:00
    这是断线重连的逻辑代码: https://imgur.com/a/czDiLNZ
    14 条回复    2023-03-05 12:20:47 +08:00
    ql562482472
        1
    ql562482472  
       2023-03-04 11:03:54 +08:00
    看看代码才知道 日志没看出来啥东西
    voidmnwzp
        2
    voidmnwzp  
       2023-03-04 11:19:49 +08:00 via iPhone
    这个问题我之前遇到过 排查过是堆外内存溢出导致的
    要设置下堆外内存的限制 -XX:MaxDirectMemorySize
    ezksdo
        3
    ezksdo  
       2023-03-04 11:24:50 +08:00
    看上去是连接没有正确关闭,把队列塞满了,或者像你说的重连的逻辑有问题。
    ogen 100% 而 metaspace 美满,内存泄漏应该不是主要原因。
    panjiaming
        4
    panjiaming  
    OP
       2023-03-04 11:27:49 +08:00
    @voidmnwzp 好的我去试一下这个参数。之前设置了-Xms1024m -Xmx2048m 反而假死的更快了,本来半个月才假死,设置完几个小时就假死了,后来就给去掉了=-=
    codingbody
        5
    codingbody  
       2023-03-04 11:36:19 +08:00 via iPhone
    假死是什么意思?
    panjiaming
        6
    panjiaming  
    OP
       2023-03-04 11:43:06 +08:00
    @codingbody 进程还在但是程序不运行了
    panjiaming
        7
    panjiaming  
    OP
       2023-03-04 11:43:48 +08:00
    @ql562482472
    @ezksdo
    这里是断线重连的代码: https://imgur.com/a/czDiLNZ
    mango88
        8
    mango88  
       2023-03-04 14:38:03 +08:00
    没看到关闭 EventLoopGroup 的代码
    ql562482472
        9
    ql562482472  
       2023-03-04 14:43:24 +08:00
    你这些代码我也没看出来问题,不过我说一下我的思路啊:
    1 )进程还在但程序不运行,我理解是无法接收到新的消息,那么这里是不是有可能是:Socket 这边接受数据的缓冲区满了之后,没有被读走?这里是接受器有异常,循环 block 了?
    2 )内存满了,但没有 OOM ,堆内存没有被释放,但是并没有继续申请新内存,因为如果申请了就应该 OOM 才对?
    3 )还有可能就是堆外内存不足,Netty 没有堆外内存,就不会继续读请求,是不是有一个特别大的请求,一直没有传完?而且之前在 pipeline 上处理的信息没结束,之前的堆外内存也没有释放,没结束可能是哪里执行特别耗时 /卡死什么的?

    你这些请求有没有规律?会不会有一些特定的功能号的连续调用引起的?
    Ericcccccccc
        10
    Ericcccccccc  
       2023-03-04 14:45:51 +08:00
    先把内存加大.
    panjiaming
        11
    panjiaming  
    OP
       2023-03-04 15:31:07 +08:00
    @mango88 刚才把 connect 方法发给 ChatGPT 看,它也说没有关闭 EventLoopGroup 会导致内存溢出,我去改下代码再部署试试
    urnoob
        12
    urnoob  
       2023-03-04 16:14:18 +08:00 via Android
    看代码片段,就是奇怪的逻辑。
    channel inactive 为啥要 new client 去 connect 完全不需要这句代码。
    connect 代码每次都要从头建一遍 bootstrap 那些,拿现在的重新 connect 一下不就好了么,连 listener 都不用 new
    另外常量赋值有线程安全问题。为啥要 sleep thread
    毫无理由的写法

    写的人没理解 netty
    ezksdo
        13
    ezksdo  
       2023-03-04 17:46:12 +08:00
    @panjiaming 你应该复用 EventLoop ,而不是一直重新创建 eventloop
    1461665214
        14
    1461665214  
       2023-03-05 12:20:47 +08:00
    看了下代码 感觉是你写的有问题 new Client 每次都创建新的线程组 每个线程组默认 CPU 核心数*2 你在应该是线程过多把 CPU 和内存资源都占了导致的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5217 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:15 · PVG 17:15 · LAX 01:15 · JFK 04:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.