Open goto456 opened 4 weeks ago
可以升级版本后重试一下, 新版本之前对数据推送做过优化, 发现推送有问题的连接,不会一直发起推送,会先断开连接释放资源,重连后再继续推送。
可以仔细讲一讲这个的具体原因吗 我也碰到一模一样的问题了 @KomachiSion
@KomachiSion "可以升级版本后重试一下, 新版本之前对数据推送做过优化, 发现推送有问题的连接,不会一直发起推送,会先断开连接释放资源,重连后再继续推送。" 同样碰到 有具体解决的issue 或者相关 commit 可以发一下么?
内容比较复杂, 主要就是grpc 对 堆外内存的利用方式分为全局缓存和线程缓存, 如果某个客户端一直不回包(tcp包),nio的可使用窗口会一直为0, 导致grpc发送的数据一直缓存在堆外内存中,等待tcp可用,一直会到tcp可用,把请求正常发出去,或tcp连接断开,才会释放对应堆外内存;
当出现一个连接出现故障,比如假死,网络故障,导致grpc前面的请求发出去但一直无法收到tcp的ack时,后续的请求会全部缓存在tcp和堆外内存队列中, 导致这个链接对应的线程缓存占满, 然后开始申请全局缓存。
对应的现象就是堆外内存一直涨,直到所有的堆外内存都被用完且无法释放, 新的请求出现DirectOOM。
在2.3还是2.2的最后几个版本,Nacos在GrpcClient里做了一点优化, 如果这个链接一直处于tcp窗口为0的情况,主动断开链接,重新链接后再进行数据推送。
具体哪个PR已经不记得了, 只知道最新版本应该解决过这个问题。可以试一下。
上面这个问题很有可能是因为dubbo订阅了非常多provider, 然后consumer的客户端出现GC之类的问题,导致nacos推送的数据无法处理,不回执tcp ack, 导致上面描述的问题出现, 进而影响到其他的链接和数据同步。
可以试着分析一下naming-push.log. 看下是不是某几个ip consumer,一直处于推送失败(推送超时)的状态。 单独重启这一些consumer,也可以释放这部分内存
GrpcClient
大佬,我们也遇到类似的问题,我们用的是 2.1.2 版本的 nacos。 想请教下, 你说的优化 GrpcClient 是哪个类呢?我想看看改动原理,了解下根因。谢谢!
GrpcConnection ConnectionBusyException
环境描述
Nacos 版本 2.1.0 11节点集群,各个节点配置是:16核32G 注册实例数:41K(Dubbo注册实例) 相关内存分配:-Xms12g -Xmx12g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=320m -XX:MaxDirectMemorySize=12g
问题描述
集群出现个别节点实例数不一致(比其他节点少20K~30K),重启问题节点后恢复正常,但是运行几天之后又会出现实例数不一致问题。如下图所示:
查看问题节点上的protocol-distro.log日志,出现如下异常:
从机器内存监控上看,机器的可用内存一直在下降:
尝试解决的过程:
按照nacos官方文档的建议配置(https://nacos.io/blog/faq/nacos-user-question-history12682/) ,将JVM堆内存(-Xmx)配置为22G,MaxDirectMemorySize配置为7G之后,还是会出现上述问题,且日志中还是会出现上述异常。
搜到类似的issue(#10352, #10854 ) ,修改调整回收堆外内存频率-Dio.grpc.netty.shaded.io.netty.allocation.cacheTrimIntervalMillis=60000(由默认的2min改为1min),之后依旧会出现上述问题,且日志中还是会出现上述异常。
其他异常日志
有问题的节点的nacos.log中出现很多如下日志