-
Notifications
You must be signed in to change notification settings - Fork 12.9k
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
Nacos 2.1.0 集群,Dubbo注册实例数超过41K后,经常出现个别节点上实例数不一致,疑似堆外内存泄露 #12792
Comments
可以升级版本后重试一下, 新版本之前对数据推送做过优化, 发现推送有问题的连接,不会一直发起推送,会先断开连接释放资源,重连后再继续推送。 |
可以仔细讲一讲这个的具体原因吗 我也碰到一模一样的问题了 @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,也可以释放这部分内存 |
大佬,我们也遇到类似的问题,我们用的是 2.1.2 版本的 nacos。 想请教下, 你说的优化 GrpcClient 是哪个类呢?我想看看改动原理,了解下根因。谢谢! |
GrpcConnection |
环境描述
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(io.grpc.netty.shaded.io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16777216 byte(s) of direct memory (used: 1006633239, max: 1020067840) #10352, io.grpc.netty.shaded.io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 2097152 byte(s) of direct memory (used: 501219607, max: 503316480) #10854 ) ,修改调整回收堆外内存频率-Dio.grpc.netty.shaded.io.netty.allocation.cacheTrimIntervalMillis=60000(由默认的2min改为1min),之后依旧会出现上述问题,且日志中还是会出现上述异常。
其他异常日志
有问题的节点的nacos.log中出现很多如下日志
The text was updated successfully, but these errors were encountered: