關(guān)于elasticsearch的EsRejectedExecutionException

起因


呃,中午準備吃飯的時候,突然發(fā)現(xiàn)產(chǎn)品的搜索功能掛了,沒辦法,只能放下手里的碗,抱起前面的磚準備開始排查問題。

排查過程


  1. 連接線上服務器,查詢ERROR日志,果然一堆ES相關(guān)報錯,初步懷疑是公司內(nèi)部DBIndex服務(內(nèi)部基于dubbo封裝的提供者,用于app端查詢的服務)掛了。

  2. 連接DBIndex服務所在機器,查詢服務進程狀態(tài),發(fā)現(xiàn)沒什么問題,繼續(xù)查看日志,發(fā)現(xiàn)一堆類似的錯誤。如圖:


    Exception_1.png

    看來可以確定是elasticsearch自身服務的問題了,但是具體是什么問題呢,一頓度娘,谷哥的操作之后,發(fā)現(xiàn)并沒有一個比較貼切的回答。

  3. 暫時沒什么頭緒,就繼續(xù)查看錯誤日志,一直翻到報錯的起始點,發(fā)現(xiàn)了一些不一樣的異常信息。如圖:


    Exception_2.png

這個錯就比明顯了,大概可以發(fā)現(xiàn)跟ES自身的線程池有關(guān)系。

  1. 查閱相關(guān)資料后了解到,使用Elasticsearch的時候,在并發(fā)查詢量大的情況下,訪問流量超過了集群中單個Elasticsearch實例的處理能力,Elasticsearch服務端會觸發(fā)保護性的機制,拒絕執(zhí)行新的訪問,并且拋出EsRejectedExecutionException異常。
    這個保護機制與異常觸發(fā)是由Elasticsearch API實現(xiàn)中的thread pool與配套的queue決定的。
    在示例中,Elasticsearch為index操作分配的線程池,pool size=7,thread = 7, queue capacity=1000,當7個線程處理不過來,并且隊列中緩沖的tasks超過1000個,那么新的task就會被簡單的丟棄掉,并且拋出EsRejectedExecutionException異常。

總結(jié)


最后靠著重啟大法解決了這次的問題。。。我們可以打開 es/configs/elasticsearch.yml 配置一些線程池的參數(shù),但估計治標不治本,最好的方法還是加機器跑集群吧,單實例始終是單實例。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容