現(xiàn)象
服務(wù)器上部署了ES5集群似谁,通過(guò)zabbix監(jiān)控發(fā)現(xiàn)cpu load呈鋸齒狀,且ES所在磁盤(pán)iops read和cpu load有一樣的鋸齒突那,可證明ES周期性的發(fā)生大量讀磁盤(pán)操作雀久。通過(guò)分析,ES周期性大量讀磁盤(pán)是因?yàn)镼A每10分鐘發(fā)起搜索業(yè)務(wù)請(qǐng)求
此外寥裂,該機(jī)器上有marathon超賣(mài)內(nèi)存的情況存在嵌洼,當(dāng)關(guān)閉超賣(mài)的服務(wù)時(shí),iops read及cpu load監(jiān)控正常
分析
按理說(shuō)QA監(jiān)控發(fā)起的搜索請(qǐng)求不會(huì)變化封恰,ES應(yīng)該有索引文件緩存麻养。所以首先分析ES索引文件緩存的情況
通過(guò)/proc/$pid/smaps可查看進(jìn)程內(nèi)存分布及映射情況,如下圖所示诺舔,size表示通過(guò)mmap映射的文件的大小鳖昌,Rss表示該文件mmap實(shí)際內(nèi)存的大小,Pss表示當(dāng)某個(gè)文件被多個(gè)進(jìn)程同時(shí)使用時(shí)低飒,平均每個(gè)進(jìn)程占用的內(nèi)存大小
寫(xiě)個(gè)腳本许昨,分析一下文件緩存使用情況:
index_uid | size | rss |
---|---|---|
g_Jy1qc5Qzqj_fNO8RYQiw | 1743712 | 308 |
bgfm5YHeQKCuqzOr2JG3rA | 57044 | 308 |
5s96iIBfS6KivdgDrb8u-Q | 46587620 | 838308 |
BY78qZnmRGys_HMk-KJ_TA | 58060 | 44 |
WSQySha8QgiAT8VI02t_Pw | 203236 | 272 |
索引5s96iIBfS6KivdgDrb8u-Q映射文件大小為44.3g,實(shí)際占用物理內(nèi)存838M褥赊,對(duì)比其他服務(wù)器同索引文件緩存使用情況發(fā)現(xiàn)糕档,大于該機(jī)器占用的物理內(nèi)存(2.1g 對(duì)比 838M)
通過(guò)監(jiān)控ES進(jìn)程的smaps文件發(fā)現(xiàn)當(dāng)cpu飆升即搜索請(qǐng)求時(shí),文件緩存占用高達(dá)2-3G拌喉,請(qǐng)求完成一段時(shí)間后文件緩存將至700-800M速那,此時(shí)可判定是因?yàn)槲募彺姹幌到y(tǒng)踢掉導(dǎo)致頻繁發(fā)生磁盤(pán)io
通過(guò)分析源碼可知ES使用MMapDirectory打開(kāi)索引文件,其內(nèi)部FileProvider調(diào)用C庫(kù)的mmap函數(shù)打開(kāi)文件司光,所以是由系統(tǒng)托管文件緩存
為何操作系統(tǒng)會(huì)踢掉ES文件緩存琅坡?猜測(cè)是因?yàn)閙arathon超賣(mài)導(dǎo)致內(nèi)存使用過(guò)多,操作系統(tǒng)需要回收文件緩存残家,而QA監(jiān)控又是10分鐘請(qǐng)求一次榆俺,導(dǎo)致ES無(wú)法持有文件緩存
解決方案
通過(guò)調(diào)整操作系統(tǒng)內(nèi)核參數(shù)vm.vfs_cache_pressure(100 => 80)來(lái)讓操作系統(tǒng)盡量少回收文件緩存,調(diào)整后相關(guān)監(jiān)控如下
ES節(jié)點(diǎn)內(nèi)存維持較之前提升至少500M
tips
通過(guò)監(jiān)控分析smaps文件能獲取各索引文件物理內(nèi)存占用情況,發(fā)生堆外內(nèi)存異常時(shí)可排查是哪些索引文件導(dǎo)致的茴晋,即可大致推斷是什么業(yè)務(wù)什么類(lèi)型的查詢(xún)
heap內(nèi)存可以使用jhat陪捷、jmap分析使用情況
匿名頁(yè)緩存可在jvm啟動(dòng)參數(shù)加上-XX:NativeMemoryTracking=[off|summary|detail]后,通過(guò)jcmd $pid VM.native_memory detail分析