在Nacos中 CPU爆表了,一直在RUNNABLE。谁能给看下,这naocs是什么问题啊?

在Nacos中 CPU爆表了,一直在RUNNABLE。谁能给看下,这naocs是什么问题啊?8496e9552c4dc79bb223de8bea606d9f.png

展开
收起
花开富贵111 2024-01-22 20:24:13 124 分享 版权
阿里云 AI 助理回答

问题分析

根据您描述的“Nacos中CPU爆表,线程一直处于RUNNABLE状态”,这通常表明Nacos相关的线程在高负载下运行,可能是由于以下原因导致的:

  1. 线程池配置不当:Nacos客户端或服务端的线程池配置不合理,导致线程数过多或线程长时间占用CPU资源。
  2. 系统环境问题:程序读取到的CPU数量错误,导致线程池的核心大小和最大大小设置不当。
  3. 创建过多Nacos-Client实例:应用中创建了过多的Nacos-Client实例,未正确关闭旧实例,导致线程池泄漏。
  4. 网络或服务端问题:Nacos服务端可能存在性能瓶颈,或者客户端与服务端之间的网络连接存在问题,导致线程阻塞或重试频繁。

排查步骤

1. 检查线程池使用情况

通过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.updatercom.alibaba.nacos.naming.push.receiver 的线程数不应超过 NacosNamingService 实例数量。
    • com.alibaba.nacos.client.Worker 的线程数不应超过 NacosConfigService 实例数量 * 5。
    • nacos.client.config.listener.task 的线程数不应超过 NacosConfigService 实例数量 * CPU 核心数。

如果发现某些线程池的数量远超预期,则可能是因为连续创建了Nacos-Client实例,但未正确关闭旧实例。


2. 检查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}'
  • 正常范围:Nacos-Client实例数量应不超过3个。
  • 如果实例数超过10个,说明应用中存在重复创建Nacos-Client实例的问题,且未调用shutdown方法关闭旧实例。

3. 检查系统环境

确认程序读取到的CPU核心数是否正确。可以通过以下代码检查:

System.out.println(Runtime.getRuntime().availableProcessors());
  • 如果读取到的CPU核心数过大(例如容器化环境中),可以通过以下参数强制指定正确的值:
    -Dnacos.common.processors=${实际CPU核心数}
    

    或者设置环境变量:

    export NACOS_COMMON_PROCESSORS=${实际CPU核心数}
    

4. 检查网络和服务端状态

如果线程池和实例数量均正常,可能是Nacos服务端或网络存在问题。建议执行以下操作:

  1. 网络连通性检查

    • 使用pingtelnetcurl命令测试客户端与Nacos服务端之间的网络连通性。
    • 确保客户端能够正常访问Nacos服务端的地址和端口。
  2. 服务端监控

    • 在MSE控制台的监控中心页面,查看以下指标:
      • 每秒查询数每秒操作数是否超过TPS限制。
      • 连接数监控中的长链路数量是否超过限制。
      • JVM监控中是否存在频繁的Full GC。
      • 资源监控中的内存和CPU使用率是否接近或超过100%。

解决方案

1. 调整线程池配置

如果线程池数量超出预期,可以通过以下参数调整线程池大小:

-Dnacos.remote.client.grpc.pool.core.size=${核心线程数,默认为CPU核心数*2}
-Dnacos.remote.client.grpc.pool.max.size=${最大线程数,默认为CPU核心数*8}
  • 注意:上述参数需要Nacos-Client版本为2.1.1及以上版本。

2. 优化Nacos-Client实例管理

确保应用中正确复用Nacos-Client实例,避免重复创建。在替换旧实例时,务必调用shutdown方法关闭线程池。

3. 升级Nacos-Client版本

如果使用的是低版本Nacos-Client,建议升级至最新版本(如2.1.2及以上),以修复已知的线程池泄漏问题。

4. 增加服务端资源

如果服务端资源不足(如CPU或内存使用率接近100%),建议升级实例规格以提升服务能力。


总结

通过以上排查步骤,您可以定位并解决Nacos中CPU爆表的问题。如果问题仍未解决,请提供以下信息以便进一步分析: - jstack日志文件。 - jmap统计的Nacos-Client实例数量。 - 客户端与服务端的网络连通性测试结果。 - MSE控制台的监控数据截图。

希望以上内容能帮助您快速解决问题!

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址:

为微服务建设降本增效,为微服务落地保驾护航。

还有其他疑问?
咨询AI助理