以前作了一些簡單的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。