Contents

Elasticsearch ram.percent误导报警

Contents

最近用Golang重构了所有的Prometheus Exporter监控项,发现elasticsearch的一个内存占用误导问题,监控项的原理是从集群中取得所有机器的使用情况,主要是堆内存不要超过GC的75阈值,命令参考如下:

GET /_cat/nodes?v&h=http,version,jdk,disk.total,disk.used,disk.avail,disk.used_percent,heap.current,heap.percent,heap.max,ram.current,ram.percent,ram.max,master

然后发现一个有问题的现象,ES显示系统的内存占用率和实际相差很大。

搜索了下有人已经上个月反馈了,详见

源码位置

大家都知道在Centos7或者其它Systemd系统之后,Linux默认的内存占用计算是(total- available)/total,而ES的计算方式是(total-free)/total,比如我虚拟机的输入如下:

1
2
3
4
forsre@kvm ~> free -m
              total        used        free      shared  buff/cache   available
Mem:           3840        1355         214          24        2270        2206
Swap:             0           0           0

按照ES的计算方式,我的机器内存使用率接近100%了,但是实际上也就50%左右,最后放弃了这个监控项,只监控集群的堆内存占用了,OS层的内存,负载,CPU啥的还是交给Node Exporter吧,专业的事情交给专业的组件来做,解耦了也清楚些。