每個Elasticsearch節點内部都維護着多個線程池,如index、search、get、bulk等,使用者可以修改線程池的類型和大小,線程池預設大小跟CPU邏輯一緻
一、檢視目前線程組狀态
curl -XGET 'http://localhost:9200/_nodes/stats?pretty'
上面截取了部分線程池的配置,其中,最需要關注的是rejected。當某個線程池active==threads時,表示所有線程都在忙,那麼後續新的請求就會進入queue中,即queue>0,一旦queue大小超出限制,如bulk的queue預設50,那麼elasticsearch程序将拒絕請求(碰到bulk HTTP狀态碼429),相應的拒絕次數就會累加到rejected中。
解決方法是
1、記錄失敗的請求并重發
2、減少并發寫的程序個數,同時加大每次bulk請求的size
二、核心線程池
index:此線程池用于索引和删除操作。它的類型預設為fixed,size預設為可用處理器的數量,隊列的size預設為300。
search:此線程池用于搜尋和計數請求。它的類型預設為fixed,size預設為可用處理器的數量乘以3,隊列的size預設為1000。
suggest:此線程池用于建議器請求。它的類型預設為fixed,size預設為可用處理器的數量,隊列的size預設為1000。
get:此線程池用于實時的GET請求。它的類型預設為fixed,size預設為可用處理器的數量,隊列的size預設為1000。
bulk:此線程池用于批量操作。它的類型預設為fixed,size預設為可用處理器的數量,隊列的size預設為50。
percolate:此線程池用于預比對器操作。它的類型預設為fixed,size預設為可用處理器的數量,隊列的size預設為1000。
三、線程池類型
1、cache
無限制的線程池,為每個請求建立一個線程
2、fixed
有着固定大小的線程池,大小由size屬性指定,允許你指定一個隊列(使用queue_size屬性指定)用來儲存請求,直到有一個空閑的線程來執行請求。如果Elasticsearch無法把請求放到隊列中(隊列滿了),該請求将被拒絕
四、修改線程池配置
1、elasticsearch.yml
2、Rest API
五、bulk異常排查
使用es bulk api時報錯如下
這個錯誤明顯是預設大小為50的隊列(queue)處理不過來了,解決方法是增大bulk隊列的長度
elasticsearch.yml
相關文檔
https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-stats.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-threadpool.html
本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/bonelee/p/7840629.html,如需轉載請自行聯系原作者