Elasticsearch内存分配设置详解
Elasticsearch默認(rèn)安裝后設(shè)置的內(nèi)存是1GB,對(duì)于任何一個(gè)現(xiàn)實(shí)業(yè)務(wù)來(lái)說(shuō),這個(gè)設(shè)置都太小了。如果你正在使用這個(gè)默認(rèn)堆內(nèi)存配置,你的集群配置可能會(huì)很快發(fā)生問(wèn)題。
這里有兩種方式修改Elasticsearch的堆內(nèi)存(下面就說(shuō)內(nèi)存好了),最簡(jiǎn)單的一個(gè)方法就是指定ES_HEAP_SIZE環(huán)境變量。服務(wù)進(jìn)程在啟動(dòng)時(shí)候會(huì)讀取這個(gè)變量,并相應(yīng)的設(shè)置堆的大小。設(shè)置命令如下:
export ES_HEAP_SIZE=10g
此外,你也可以通過(guò)命令行參數(shù)的形式,在程序啟動(dòng)的時(shí)候把內(nèi)存大小傳遞給它:
./bin/elasticsearch -Xmx10g -Xms10g
備注:確保Xmx和Xms的大小是相同的,其目的是為了能夠在java垃圾回收機(jī)制清理完堆區(qū)后不需要重新分隔計(jì)算堆區(qū)的大小而浪費(fèi)資源,可以減輕伸縮堆大小帶來(lái)的壓力。
一般來(lái)說(shuō)設(shè)置ES_HEAP_SIZE環(huán)境變量,比直接寫(xiě)-Xmx10g -Xms10g更好一點(diǎn)。
把內(nèi)存的一半給Lucene
一個(gè)常見(jiàn)的問(wèn)題是配置一個(gè)大內(nèi)存,假設(shè)你有一個(gè)64G內(nèi)存的機(jī)器,按照正常思維思考,你可能會(huì)認(rèn)為把64G內(nèi)存都給Elasticsearch比較好,但現(xiàn)實(shí)是這樣嗎,越大越好?
當(dāng)然,內(nèi)存對(duì)于Elasticsearch來(lái)說(shuō)絕對(duì)是重要的,用于更多的內(nèi)存數(shù)據(jù)提供更快的操作,而且還有一個(gè)內(nèi)存消耗大戶(hù)-Lucene。
Lucene的設(shè)計(jì)目的是把底層OS里的數(shù)據(jù)緩存到內(nèi)存中。Lucene的段是分別存儲(chǔ)到單個(gè)文件中的,這些文件都是不會(huì)變化的,所以很利于緩存,同時(shí)操作系統(tǒng)也會(huì)把這些段文件緩存起來(lái),以便更快的訪(fǎng)問(wèn)。
Lucene的性能取決于和OS的交互,如果你把所有的內(nèi)存都分配給Elasticsearch,不留一點(diǎn)給Lucene,那你的全文檢索性能會(huì)很差的。
最后標(biāo)準(zhǔn)的建議是把50%的內(nèi)存給elasticsearch,剩下的50%也不會(huì)沒(méi)有用處的,Lucene會(huì)很快吞噬剩下的這部分內(nèi)存用于文件緩存。
不要超過(guò)32G
這里有另外一個(gè)原因不分配大內(nèi)存給Elasticsearch,事實(shí)上jvm在內(nèi)存小于32G的時(shí)候會(huì)采用一個(gè)內(nèi)存對(duì)象指針壓縮技術(shù)。
在java中,所有的對(duì)象都分配在堆上,然后有一個(gè)指針引用它。指向這些對(duì)象的指針大小通常是CPU的字長(zhǎng)的大小,不是32bit就是64bit,這取決于你的處理器,指針指向了你的值的精確位置。
對(duì)于32位系統(tǒng),你的內(nèi)存最大可使用4G。對(duì)于64系統(tǒng)可以使用更大的內(nèi)存。但是64位的指針意味著更大的浪費(fèi),因?yàn)槟愕闹羔槺旧泶罅恕@速M(fèi)內(nèi)存不算,更糟糕的是,更大的指針在主內(nèi)存和緩存器(例如LLC, L1等)之間移動(dòng)數(shù)據(jù)的時(shí)候,會(huì)占用更多的帶寬。
Java 使用一個(gè)叫內(nèi)存指針壓縮的技術(shù)來(lái)解決這個(gè)問(wèn)題。它的指針不再表示對(duì)象在內(nèi)存中的精確位置,而是表示偏移量。這意味著32位的指針可以引用40億個(gè)對(duì)象,而不是40億個(gè)字節(jié)。最終,也就是說(shuō)堆內(nèi)存長(zhǎng)到32G的物理內(nèi)存,也可以用32bit的指針表示。
一旦你越過(guò)那個(gè)神奇的30-32G的邊界,指針就會(huì)切回普通對(duì)象的指針,每個(gè)對(duì)象的指針都變長(zhǎng)了,就會(huì)使用更多的CPU內(nèi)存帶寬,也就是說(shuō)你實(shí)際上失去了更多的內(nèi)存。事實(shí)上當(dāng)內(nèi)存到達(dá)40-50GB的時(shí)候,有效內(nèi)存才相當(dāng)于使用內(nèi)存對(duì)象指針壓縮技術(shù)時(shí)候的32G內(nèi)存。
這段描述的意思就是說(shuō):即便你有足夠的內(nèi)存,也盡量不要超過(guò)32G,因?yàn)樗速M(fèi)了內(nèi)存,降低了CPU的性能,還要讓GC應(yīng)對(duì)大內(nèi)存。
1TB內(nèi)存的機(jī)器
32GB是ES一個(gè)內(nèi)存設(shè)置限制,那如果你的機(jī)器有很大的內(nèi)存怎么辦呢?現(xiàn)在的機(jī)器內(nèi)存普遍增長(zhǎng),你現(xiàn)在都可以看到有300-500GB內(nèi)存的機(jī)器。
首先,我們建議編碼使用這樣的大型機(jī)
其次,如果你已經(jīng)有了這樣的機(jī)器,你有兩個(gè)可選項(xiàng):
你主要做全文檢索嗎?考慮給Elasticsearch 32G內(nèi)存,剩下的交給Lucene用作操作系統(tǒng)的文件系統(tǒng)緩存,所有的segment都緩存起來(lái),會(huì)加快全文檢索。
你需要更多的排序和聚合?你希望更大的堆內(nèi)存。你可以考慮一臺(tái)機(jī)器上創(chuàng)建兩個(gè)或者更多ES節(jié)點(diǎn),而不要部署一個(gè)使用32+GB內(nèi)存的節(jié)點(diǎn)。仍然要 堅(jiān)持50%原則,假設(shè) 你有個(gè)機(jī)器有128G內(nèi)存,你可以創(chuàng)建兩個(gè)node,使用32G內(nèi)存。也就是說(shuō)64G內(nèi)存給ES的堆內(nèi)存,剩下的64G給Lucene。
如果你選擇第二種,你需要配置cluster.routing.allocation.same_shard.host:true。這會(huì)防止同一個(gè)shard的主副本存在同一個(gè)物理機(jī)上(因?yàn)槿绻嬖谝粋€(gè)機(jī)器上,副本的高可用性就沒(méi)有了)。
swapping是性能的墳?zāi)?/p>
這是顯而易見(jiàn)的,但是還是有必要說(shuō)的更清楚一點(diǎn),內(nèi)存交換到磁盤(pán)對(duì)服務(wù)器性能來(lái)說(shuō)是致命的。想想看一個(gè)內(nèi)存的操作必須是快速的。
如果內(nèi)存交換到磁盤(pán)上,一個(gè)100微秒的操作可能變成10毫秒,再想想那么多10微秒的操作時(shí)延累加起來(lái)。不難看出swapping對(duì)于性能是多么可怕。
最好的辦法就是在你的操作系統(tǒng)中完全禁用swapping。這樣可以暫時(shí)禁用:
swapoff -a
為了永久禁用它,你可能需要修改/etc/fstab文件,這要參考你的操作系統(tǒng)相關(guān)文檔。
如果完全禁用swap,對(duì)你來(lái)說(shuō)是不可行的。你可以降低swappiness 的值,這個(gè)值決定操作系統(tǒng)交換內(nèi)存的頻率。這可以預(yù)防正常情況下發(fā)生交換。但仍允許os在緊急情況下發(fā)生交換。
對(duì)于大部分Linux操作系統(tǒng),可以在sysctl 中這樣配置:
vm.swappiness = 1
備注:swappiness設(shè)置為1比設(shè)置為0要好,因?yàn)樵谝恍﹥?nèi)核版本,swappness=0會(huì)引發(fā)OOM(內(nèi)存溢出)
簡(jiǎn)單地說(shuō)這個(gè)參數(shù)定義了系統(tǒng)對(duì)swap的使用傾向,默認(rèn)值為60,值越大表示越傾向于使用swap??梢栽O(shè)為0,這樣做并不會(huì)禁止對(duì)swap的使用,只是最大限度地降低了使用swap的可能性。
通過(guò)sysctl-qvm.swappiness可以查看參數(shù)的當(dāng)前設(shè)置。
修改參數(shù)的方法是修改/etc/sysctl.conf文件,加入vm.swappiness=xxx,并重起系統(tǒng)。這個(gè)操作相當(dāng)于是修改虛擬系統(tǒng)中的/proc/sys/vm/swappiness文件,將值改為XXX數(shù)值。
如果不想重起,可以通過(guò)sysctl -p動(dòng)態(tài)加載/etc/sysctl.conf文件,但建議這樣做之前先清空swap。
最后,如果上面的方法都不能做到,你需要打開(kāi)配置文件中的mlockall開(kāi)關(guān),它的作用就是運(yùn)行JVM鎖住內(nèi)存,禁止OS交換出去。在elasticsearch.yml配置如下:
bootstrap.mlockall: true
總結(jié)
以上是生活随笔為你收集整理的Elasticsearch内存分配设置详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 把你的树莓派打造成一个NAS,并实现多硬
- 下一篇: 深入到系统组件是否白盒测试_2019年系