一、问题描述

最近公司的注册中心要切换为nacos,部分项目切换的两三天后,我上到nacos-server的服务器,使用cd命令,报错(当时没截图,凑活看下吧):
①No space left on device
②Free disk space below threshold. Available: 0 bytes
服务器的磁盘空间居然不足了?!

二、解决思路

1、先看下服务器磁盘情况

容器nacos cpu使用率波动很大_服务器


当时没截图,凑活看吧,Used是428G,全满了。

2、哪些东西占满了磁盘

这才过了两三天(有个周末),怎么磁盘突然满了?看下哪些东西这么大:du指令详解.

容器nacos cpu使用率波动很大_服务器_02


还是没截图,当时大概有200+G,快300G了。找到罪魁祸首,是nacos的access日志:

容器nacos cpu使用率波动很大_服务器_03


还是没截图,当时日志文件大概200+G!!!查看一下内容,发现主要是心跳检测的http请求,并且刷新频率非常快:

容器nacos cpu使用率波动很大_spring boot_04

3、cpu高的原因

根据日志判断,是因为注册到nacos的服务疯狂的发送心跳检测请求,导致nacos-server的CPU过高。
使用top -p pid 查看运行情况,CPU大概在130%左右。

4、具体问题排查

既然是心跳检测的问题,那肯定是nacos-discovery的单位没有配好?

容器nacos cpu使用率波动很大_spring boot_05


看起来没有问题,但是为什么会请求那么频繁?在issues中找到了相关问题:

https://github.com/alibaba/nacos/issues/4449 https://github.com/alibaba/spring-cloud-alibaba/issues/1877 简述问题:自定义的心跳间隔、心跳超时、实例删除的时间单位没有真正处理为ms格式,而是配置x值就是xms。

5、问题总结

(1)时间相关的默认值:

package:com.alibaba.nacos.api.common

class:Constants

容器nacos cpu使用率波动很大_spring boot_06


可以看到是处理为ms的,也就是说如果配置文件里的时间相关的属性不配置,走默认配置是没有问题的

(2)自定义时间属性的问题

package:com.alibaba.cloud.nacos.registry

class:NacosRegistration

method:init

容器nacos cpu使用率波动很大_java_07


可以看到,放入metadata的时间单位没有处理为ms!!!也就是说,自定义的时间属性,直接把数值当做ms处理,配置5,其实就是5ms,因为没有通过TimeUnit.SECONDS.toMillis转成真正的ms格式。

三、解决方案

1、将和时间有关的单位,都改成ms格式

容器nacos cpu使用率波动很大_java_08

2、nacos-discovery版本升级到2.2.4.RELEASE

最终解决效果:

容器nacos cpu使用率波动很大_容器nacos cpu使用率波动很大_09