用了Elasticsearch,一口气上5T

es集群机器 内存使用的一些思考

Elasticsearch | 作者 TracyMacGrade | 发布于2020年02月20日 | 阅读数:3153

工作中看到 es集群的内存一直停留在38%左右,一直就没有释放物理内存,一般GC后不是会释放jvm内存吗从而还给 操作系统?

内存占用.png


看完这个图,我找到了 es集群机器 jvm的垃圾收集器,老年代垃圾回收器是CMS,也就是 使用标记-清理法,每次GC 不会产生连续的空间存储;会更快的促使FUllGC。那每次GC完不就会归还 jvm占用的内存 给操作系统吗?
带着疑惑我查了网上的一些资料  看到了这个链接:https://juejin.im/post/5d35ae896fb9a07ed8428046
结论就是:
CMS垃圾回收器,在内存开辟后,会随着System.gc()执行次数逐渐增多和回收频率逐渐拉长,从继续开辟内存到慢慢归还物理内存给操作系统,直到出现一次全部归还,就会在每次调用System.gc()都归还所有剩余的物理内存给操作系统;G1恰恰相反,G1是在JVM每次回收垃圾后,主动归还物理内存给操作系统,不做任何保留,大大降低了内存占用。
也就是说CMS 收集器 不会立刻还内存给os,而G1收集器会在每次gc 后 都会归还内存给os,而且G1是年轻代和老年带都能收集,ygc的频率更高,所以效果更好,
那这样说,在很长时间段上,只要发生了FullGC,es集群机器的内存空闲率当时就会上升。
然后我看了下FullGC的监控:
fullGC.png


好吧,没有fullGc,如果fullGC了 确实es集群就不可用了,线上不会时常fullGC。

既然看到es机器的内存空闲率为 38%左右,那么jvm 的最大堆内存是多少呢? 怎么设置的 jvm的内存比呢?
为此我查了一下,  es集群机器都是 16c 32g的  jvm 的最大堆内存16G
而elastic search 是java程序,lucene的倒排索引是存在磁盘的。他们两需要的内存比是怎样的呢?

es内存占用比.png


上图 也是我在网上摘抄的。没办法,网友智慧太强大了,啥都有。。
es是使用的堆内内存,而lucene 使用的 堆外内存。
elastic 的 Node Query Cache ,Shard Request Cache,Shard Request Cache 都是给查询结果使用的,Indexing Buffer 是存储新的插入文档使用的;
而 lucence的os cache 纯粹是让 倒排索引能加载到内存中 供与 查询 ,
所以总结就是  es 与luncene 一般是 各占一半内存,但是如果你的es集群 插入业务比较多,建议将jvm 内存增大,如果es集群的查询业务比较多,建议jvm内存 减少一些,让操作系统剩余使用物理内存多一些。
已邀请:

byx313 - BLOG:https://www.jianshu.com/u/43fd06f9589c

赞同来自:

你的启动脚本一定配置了xms  = xmx,所以jvm大小一直恒定。

要回复问题请先登录注册