MSE接入阿里的Nacos,就有时CPU偏高的,这是为什么?

MSE接入阿里的Nacos,就有时CPU偏高的,这是为什么?d2e36198ca25abe4b5112e4510ef05a1.png

展开
收起
三分钟热度的鱼 2023-06-28 10:41:55 104 分享 版权
阿里云 AI 助理回答

MSE接入阿里的Nacos时,有时会出现CPU偏高的现象,这可能是由多种原因导致的。以下是可能的原因及对应的解决方案:


1. 客户端线程池配置不当

如果应用中创建了过多的Nacos-Client实例(如NacosNamingServiceNacosConfigService),或者未正确关闭旧的Nacos-Client实例,可能会导致线程池数量膨胀,从而增加CPU负载。

解决方案:

  • 检查Nacos-Client实例数量
    使用以下命令统计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方法关闭线程池,避免线程泄漏。

  • 调整线程池大小
    如果线程池核心大小和最大大小设置不当,可以通过以下参数调整:

    -Dnacos.remote.client.grpc.pool.core.size=${核心线程数}
    -Dnacos.remote.client.grpc.pool.max.size=${最大线程数}
    

2. 系统环境问题

在容器化环境中,程序可能读取到错误的CPU数量,导致线程池的核心大小和最大大小被错误设置,进而引发CPU使用率过高。

解决方案:

  • 确认CPU数量
    使用以下代码检查应用读取到的CPU数量:
    Runtime.getRuntime().availableProcessors()
    

    如果读取到的CPU数量过大,可通过以下参数强制指定正确的CPU数量(需Nacos-Client版本为2.1.1及以上):

    -Dnacos.common.processors=${正确的CPU数量}
    

    或通过环境变量设置:

    export NACOS_COMMON_PROCESSORS=${正确的CPU数量}
    

3. 频繁Full GC

如果客户端或服务端频繁发生Full GC,会导致CPU使用率升高,并可能引发连接超时等问题。

解决方案:

  • 监控Full GC频率
    在MSE控制台的JVM监控页面,查看是否频繁出现Full GC。如果频繁发生,需优化内存分配或升级实例规格。

  • 分析GC日志
    启用GC日志并分析是否存在内存泄漏或对象分配异常:

    -XX:+PrintGCDetails -Xloggc:${gc_log_path}
    

4. 网络问题导致重试机制触发

如果客户端与MSE Nacos之间的网络不稳定,可能导致请求重试频繁,增加CPU负载。

解决方案:

  • 排查网络问题
    使用以下命令检查网络连通性:

    ping ${mse.nacos.host}
    telnet ${mse.nacos.host} 8848
    curl ${mse.nacos.host}:8848/nacos/v1/ns/service/list
    

    如果网络存在问题,需解决网络故障或调整VPN设置。

  • 优化超时时间
    根据客户端版本设置合理的超时时间。例如,对于Java Client 2.1.2及以上版本,可设置以下参数:

    -Dnacos.remote.client.grpc.timeout=${请求超时,单位毫秒,默认3000}
    -Dnacos.remote.client.grpc.server.check.timeout=${服务端健康检测,单位毫秒,默认3000}
    -Dnacos.remote.client.grpc.health.timeout=${连接健康检测,单位毫秒,默认3000}
    

5. 服务端负载过高

如果MSE Nacos服务端的CPU使用率过高,可能会影响客户端的性能,导致客户端CPU负载升高。

解决方案:

  • 监控服务端资源使用情况
    在MSE控制台的资源监控页面,查看服务端的CPU使用率、内存使用率和入口/出口流量。如果接近或超过100%,需升级实例规格。

  • 优化数据推送逻辑
    MSE Nacos专业版已优化数据推送逻辑,减少单个连接推送失败对其他连接的影响。建议升级至最新版本的专业版。


6. 客户端频繁调用Login接口

部分Nacos 2.x客户端可能存在频繁调用Login接口的问题,导致集群CPU飙升。

解决方案:

  • 升级客户端版本
    确保使用的是修复了该问题的Nacos-Client版本(如2.2.3.3及以上)。

7. 业务请求量突增

如果短时间内业务请求量突增,可能导致客户端和服务端的CPU负载同时升高。

解决方案:

  • 监控请求量
    在MSE控制台的概览页面,查看每秒查询数(QPS)和每秒操作数(TPS)。如果超出实例的处理能力,需扩容或升配。

  • 限流与降级
    配置限流规则,避免突发流量对系统造成冲击。


总结

MSE接入Nacos时CPU偏高的问题,通常由客户端线程池配置不当、系统环境问题、频繁Full GC、网络问题、服务端负载过高或业务请求量突增等原因引起。通过上述步骤逐一排查并优化,可以有效降低CPU使用率,提升系统稳定性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

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

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