天天看點

ES線程池設定

每個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,如需轉載請自行聯系原作者