每個Elasticsearch節點內部都維護着多個線程池,如index、search、get、bulk等,用戶可以修改線程池的類型和大小,線程池默認大小跟CPU邏輯一致
一、查看當前線程組狀態
curl -XGET 'http://localhost:9200/_nodes/stats?pretty'
"thread_pool" : {
"bulk" : {
"threads" : 32,
"queue" : 0,
"active" : 0,
"rejected" : 0,
"largest" : 32,
"completed" : 659997
},
"index" : {
"threads" : 2,
"queue" : 0,
"active" : 0,
"rejected" : 0,
"largest" : 2,
"completed" : 2
}
上面截取了部分線程池的配置,其中,最需要關注的是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
threadpool.index.type: fixed threadpool.index.size: 100 threadpool.index.queue_size: 500
2、Rest API
curl -XPUT 'localhost:9200/_cluster/settings' -d '{
"transient": {
"threadpool.index.type": "fixed",
"threadpool.index.size": 100,
"threadpool.index.queue_size": 500
}
}'
五、bulk異常排查
使用es bulk api時報錯如下
EsRejectedExcutionException[rejected execution(queue capacity 50) on.......]
這個錯誤明顯是默認大小為50的隊列(queue)處理不過來了,解決方法是增大bulk隊列的長度
elasticsearch.yml
threadpool.bulk.queue_size: 1000
相關文檔
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
