以前作了一些简单的ElasticSearch
的基准测试,可是如今看来仍是有两个方面的缺点。一个是不够全面,只是简单测试了下3种线程场景,另一个是可能机器环境,感受一直没有压上去。以后打算从新搞一下基准测试。今天想来看看一个基本上没有索引数据的ElasticSearch
的内存占用和其余相关指标(Segment,Lucene...)的状态。这样作到在最少的环境下内心有个数,感受仍是很是重要的。不少人都忘记了,其实计算机是一种科学。这种应该是控制变量法吧?jvm
经过本文,可让你得知如下ElasticSearch
的状态。学习
目的是想要搭建一个纯粹的ElasticSearch
的环境。可是,无奈,又想要观测ElasticSearch
的各项指标。又想要一个干净的ElasticSearch
实在有些强人所难。毕竟在使用Kibana
采集ElasticSearch
的时候,须要在ElasticSearch
上面创建索引。测试
可是,还好这些索引对ElasticSearch
的影响应该是很是小。咱们把他们列在下面。加密
能够看到使用Kibana
对ElasticSearch
进行监控的时候,存在4个索引。每一个索引存在一个主分片,没有副本。总小大不超过1M。线程
另外用来监控的索引,也会有少许的查询。大概Search Total
在2-5
左右。Index Total
在1
左右。 3d
把这些都列出来,作到心中有数。code
而后,咱们让ElasticSearch
运行一段时间,重点关注初始的JVM
的占用。以下图所示。 cdn
能够看到在没有任何索引状况下,ElasticSearch
启动所须要的内存大小大概在400-500
之间。存在100MB左右的浮动。对象
经过观察GC Count
和GC Duration
能够发现存在100MB
左右的波动,看来是存在了Young GC
致使的。blog
咱们能够经过jstat
命令再深刻了解下当前ElasticSearch
的JVM
状况。
经过jstat
,咱们能够发现当前Eden
区占用了273
MB,每隔1秒钟会增长10
MB多点。因此,咱们能够估算大概20次左右就会触发一次Young GC
,回收掉Eden
区的内存。
可是,观察下图,会发如今5分钟内折线向下的只有大概6次左右。不是说每一个20次左右会发生一次Young GC
,折线向下的应该会更加密集才对啊。其实这里是由于图像采集的频率是不同的。因此,致使这里的折线和预估的有差距。估计Kibana
应该是10s
采集一次JVM
内存信息。由于我数了一下1min
内,存在大概6,7个点。不过,目前来看修改上面的refresh
时间好像不能改变Kibana
的采集频率。
因此,咱们要学习估计的能力来整体评估JVM
和GC
的状态。
其实CPU没啥说的。在没有写入和查询的时候,基本不会消耗CPU资源。以下图所示。
CPU使用率基本上都在%0-%1
。
Segment Count
目前在20左右。考虑到存在用于监控ElasticSearch
的4个索引,每一个索引含有的1个分片。因此,总共有4个分片。
咱们知道ElasticSearch
的分片其实都是Lucene
的索引。而每一个Lucene
的索引都由Segment
组成。Segment
因为不可改变的特性,致使会在索引新数据时,建立新的Segment
。当Segment
太多时,多个Segment
又会merge
成为一个大的Segment
。
因此,我我的以为在不考虑有索引的状况下,应该会有4个Segment
。可是,这里是会存在索引监控数据的状况的。
可是,竟然致使了20左右的Segment
仍是我始料未及的。难道,每一个分片都要建立5个左右的Segment
?
若是和分片数量有关,那么能够在下次增长索引的分片数来看看是不是正相关的。
在对照中,咱们才能感觉到在实验中各个元素的做用。咱们尝试改变下JVM
大小。
打开jvm.options
,修改Java
的启动参数为-Xms2g -Xmx2g
,也就是扩大了一倍的内存。以下图所示。
对于Segment
数量,加大JVM
内存基本上没有多大的影响。咱们仍是重点观察下JVM
内存相关的内容。
能够看到整个内存占用的线总体向上移动了。其实,熟悉JVM
的同窗能够猜想到这是由于分配给Eden
区的大小上升了。临时对象须要到达一个更高的点才可以被回收掉。
另外GC Count
的值也变小了。毕竟回收后剩余的空间变大了。对象须要更长的时间才可以填满Eden
区。
经过jstat
查看gc
详细状况。注意Eden
区的大小和后面使用4gJVM
时作一个对比。
再次翻倍JVM
大小,查看尽可能明显的信息。当前JVM
为4G大小。
能够看到当前JVM
为4g和2g时,相差也不是很大。很奇怪的是,为何JVM
的Eden
区没有明显地增大呢?
经过jstat
能够发现JVM4G
时和JVM2G
时所分配的Eden
区的大小并无发生变化。由于没有显式修改JVM
的Eden
区域的大小。因此,多是JVM
的某一个策略把。
好,最后一个问题是不管是JVM2G
仍是JVM4G
,在Young GC
以后,都存在大概350MB
左右的内存没有被回收,这些对象是在哪里呢?
实际上是存储在老年代、元数据区里面的对象。
最后还给本身留下一个疑问?看下图。
好像是JVM
的内存大小和Doc Values
有必定的关系?随着内存的加大Doc Values
好像是趋向去稳定?
之后这里天天都会写一篇文章,题材不限,内容不限,字数不限。尽可能把本身天天的思考都放入其中。
若是这篇文章给你带来了一些帮助,能够动动手指点个赞,顺便关注一波就更好了。
若是上面都没有,那么写下读完以后最想说的话?有效的反馈和你的鼓励是对我最大的帮助。
另外打算把博客给从新捡起来了。欢迎你们来访问吃西瓜。
我是shane。今天是2019年9月9日。百天写做计划的第四十六天,47/100。