一、问题描述
最近公司的注册中心要切换为nacos,部分项目切换的两三天后,我上到nacos-server的服务器,使用cd命令,报错(当时没截图,凑活看下吧):
①No space left on device
②Free disk space below threshold. Available: 0 bytes
服务器的磁盘空间居然不足了?!
二、解决思路
1、先看下服务器磁盘情况
当时没截图,凑活看吧,Used是428G,全满了。
2、哪些东西占满了磁盘
这才过了两三天(有个周末),怎么磁盘突然满了?看下哪些东西这么大:du指令详解.
还是没截图,当时大概有200+G,快300G了。找到罪魁祸首,是nacos的access日志:
还是没截图,当时日志文件大概200+G!!!查看一下内容,发现主要是心跳检测的http请求,并且刷新频率非常快:
3、cpu高的原因
根据日志判断,是因为注册到nacos的服务疯狂的发送心跳检测请求,导致nacos-server的CPU过高。
使用top -p pid 查看运行情况,CPU大概在130%左右。
4、具体问题排查
既然是心跳检测的问题,那肯定是nacos-discovery的单位没有配好?
看起来没有问题,但是为什么会请求那么频繁?在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
可以看到是处理为ms的,也就是说如果配置文件里的时间相关的属性不配置,走默认配置是没有问题的!
(2)自定义时间属性的问题
package:com.alibaba.cloud.nacos.registry
class:NacosRegistration
method:init
可以看到,放入metadata的时间单位没有处理为ms!!!也就是说,自定义的时间属性,直接把数值当做ms处理,配置5,其实就是5ms,因为没有通过TimeUnit.SECONDS.toMillis转成真正的ms格式。
三、解决方案
1、将和时间有关的单位,都改成ms格式
2、nacos-discovery版本升级到2.2.4.RELEASE
最终解决效果: