在Nacos中 CPU爆表了,一直在RUNNABLE。谁能给看下,这naocs是什么问题啊?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您描述的“Nacos中CPU爆表,线程一直处于RUNNABLE状态”,这通常表明Nacos相关的线程在高负载下运行,可能是由于以下原因导致的:
通过jstack
命令获取当前线程信息,并统计Nacos相关线程的数量。以下是需要关注的线程池及其预期数量:
# Nacos-Client注册中心接收UDP推送数据所使用的线程池
grep "com.alibaba.nacos.client.naming.updater" jstack.log | wc -l
# Nacos-Client注册中心补偿非持久化服务数据的线程
grep "com.alibaba.nacos.naming.push.receiver" jstack.log | wc -l
# Nacos-Client配置中心监听配置所使用的线程池
grep "com.alibaba.nacos.client.naming.grpc.redo" jstack.log | wc -l
# Nacos-Client配置中心用于回调监听者的线程池
grep "com.alibaba.nacos.client.Worker" jstack.log | grep -v "longPolling" | wc -l
# Nacos-Client配置中心监听长轮询所使用的线程池
grep "nacos.client.config.listener.task" jstack.log | wc -l
# Nacos-Client长轮询线程池
grep "com.alibaba.nacos.client.Worker.longPolling" jstack.log | wc -l
com.alibaba.nacos.client.naming.updater
和 com.alibaba.nacos.naming.push.receiver
的线程数不应超过 NacosNamingService
实例数量。com.alibaba.nacos.client.Worker
的线程数不应超过 NacosConfigService
实例数量 * 5。nacos.client.config.listener.task
的线程数不应超过 NacosConfigService
实例数量 * CPU 核心数。如果发现某些线程池的数量远超预期,则可能是因为连续创建了Nacos-Client实例,但未正确关闭旧实例。
使用jmap
命令记录应用中的内存实例对象,并统计Nacos-Client实例的数量:
jmap -histo ${pid} > histo.log
grep "NacosNamingService" histo.log | awk '{print $2,$4}'
grep "NacosConfigService" histo.log | awk '{print $2,$4}'
shutdown
方法关闭旧实例。确认程序读取到的CPU核心数是否正确。可以通过以下代码检查:
System.out.println(Runtime.getRuntime().availableProcessors());
-Dnacos.common.processors=${实际CPU核心数}
或者设置环境变量:
export NACOS_COMMON_PROCESSORS=${实际CPU核心数}
如果线程池和实例数量均正常,可能是Nacos服务端或网络存在问题。建议执行以下操作:
网络连通性检查:
ping
、telnet
和curl
命令测试客户端与Nacos服务端之间的网络连通性。服务端监控:
如果线程池数量超出预期,可以通过以下参数调整线程池大小:
-Dnacos.remote.client.grpc.pool.core.size=${核心线程数,默认为CPU核心数*2}
-Dnacos.remote.client.grpc.pool.max.size=${最大线程数,默认为CPU核心数*8}
确保应用中正确复用Nacos-Client实例,避免重复创建。在替换旧实例时,务必调用shutdown
方法关闭线程池。
如果使用的是低版本Nacos-Client,建议升级至最新版本(如2.1.2及以上),以修复已知的线程池泄漏问题。
如果服务端资源不足(如CPU或内存使用率接近100%),建议升级实例规格以提升服务能力。
通过以上排查步骤,您可以定位并解决Nacos中CPU爆表的问题。如果问题仍未解决,请提供以下信息以便进一步分析: - jstack
日志文件。 - jmap
统计的Nacos-Client实例数量。 - 客户端与服务端的网络连通性测试结果。 - MSE控制台的监控数据截图。
希望以上内容能帮助您快速解决问题!