点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!
前期通过智慧运维管理平台纳管了一批主机资源,资源使用情况监控视图一直很正常,但是最近出现到某个时间点之后数据开始缺失的情况,进一步导致当资源出现异常无法及时告警的问题。咨询产品同事告知可能是ES出现了问题(当前项目是单节点部署),重启ES之后监控数据恢复正常,但是过段时间之后又出现此问题:单纯靠重启无法从根本上解决问题,只能通过查看相关模块的日志去定位问题,ES重启之后问题解决那就先从ES着手分析问题,通过查看ES系统日志,发现某个报错信息隔断时间就会出现,出现时间点和上面的监控数据缺失时间点一致。报错信息提示空间不足,由于ES建索引写入数据,数据最先是存在内存buffer里的,然后再刷入到lucene的底层文件segment中;写入segment完毕后再执行refresh操作,refresh操作后,数据将commit到磁盘中。内存buffer-->segment-->refresh-->磁盘。ES内存使用达到设定的极限值,触发了es熔断请求(内存被占用完了,其他索引无法分配更多的内存)。ES的内存设置是在config目录下面的jvm.options文件中,当前设置如下所示(当前jvm大小是默认设置,报错原因也是提示超过4G限制,无法创建新的索引):
现在已经基本确定是由于jvm 空间设置太小导致的,由于本机内存最大存储空间为64G,所以把jvm空间调整为32G(官方建议占服务器内存的一半,并且建议Xms与Xmx大小一致),重启ES:观察了几天监控视图一直保持正常,没有再出现之前在某个时间段没有数据的情况(如下图),看来问题已经得到了解决。总 结:
经过近1个月的观察,监控数据没有再出现缺失的情况,虽然当前已经解决了问题,但是单节点ES部署的问题,也存在很大的风险,后续将考虑集群部署;另外开源软件在应用到生产环境中时,需要根据项目实际情况确定是否需要调整默认设置。