<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Elasticsearch內(nèi)存分配設(shè)置詳解

          共 2931字,需瀏覽 6分鐘

           ·

          2021-05-09 14:24

          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)存消耗大戶-Lucene。
           
          Lucene的設(shè)計(jì)目的是把底層OS里的數(shù)據(jù)緩存到內(nèi)存中。Lucene的段是分別存儲(chǔ)到單個(gè)文件中的,這些文件都是不會(huì)變化的,所以很利于緩存,同時(shí)操作系統(tǒng)也會(huì)把這些段文件緩存起來(lái),以便更快的訪問(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。可以設(shè)為0,這樣做并不會(huì)禁止對(duì)swap的使用,只是最大限度地降低了使用swap的可能性。

          通過(guò)sysctl -q vm.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

           

          瀏覽 37
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品第一页在线观看 | 不卡高清无码在线 | 久久国产主播 | 自拍偷拍无码 | 大,香蕉婷婷 |