1,概述
每個Elasticsearch節點內部都維護着多個線程池,如index、search、get、bulk等,用戶可以修改線程池的類型和大小,以及其他的比如reflesh, flush,warmer 等,
我們一般需要關注的只是:
index,search,get,bulk 就ok了,其他的可以用到的時候再具體進行查看。
2,查看線程組的狀態
curl -XGET http://master:9200/_nodes/stats?pretty
如下截取部分thread_pool 的部分結果:
bulk: {
threads: 2,
queue: 0,
active: 0,
rejected: 0,
largest: 2,
completed: 5
},
generic: {
threads: 5,
queue: 0,
active: 0,
rejected: 0,
largest: 5,
completed: 3027787
},
get: {
threads: 0,
queue: 0,
active: 0,
rejected: 0,
largest: 0,
completed: 0
},
index: {
threads: 0,
queue: 0,
active: 0,
rejected: 0,
largest: 0,
completed: 0
},
search: {
threads: 4,
queue: 0,
active: 0,
rejected: 0,
largest: 4,
completed: 54
},
其中,需要關注的是rejected。當某個線程池active==threads時,表示所有線程都在忙,那么后續新的請求就會進入queue中,即queue>0,一旦queue大小超出限制,比如bulk的queue默認100,那么elasticsearch進程將拒絕請求(碰到bulk HTTP狀態碼429),相應的拒絕次數就會累加到rejected中。
對於被拒絕的請求:我們一般用如下的方法規避。
(
1、記錄失敗的請求並重發
2、減少並發寫的進程個數,同時加大每次bulk請求的size
)
核心的線程如下:
generic:通用操作,如node discovery。它的類型默認為cached。
index:此線程池用於索引和刪除操作。它的類型默認為fixed,size默認為可用處理器的數量,隊列的size默認為200。
search:此線程池用於搜索和計數請求。它的類型默認為fixed,size默認為(可用處理器的數量* 3) / 2) + 1,隊列的size默認為1000。
suggest:此線程池用於建議器請求。它的類型默認為fixed,size默認為可用處理器的數量,隊列的size默認為1000。
get:此線程池用於實時的GET請求。它的類型默認為fixed,size默認為可用處理器的數量,隊列的size默認為1000。
bulk:此線程池用於批量操作。它的類型默認為fixed,size默認為可用處理器的數量,隊列的size默認為50。
percolate:此線程池用於預匹配器操作。它的類型默認為fixed,size默認為可用處理器的數量,隊列的size默認為1000。
3,線程池的主要類型如下:
1、cached
無限制的線程池,為每個請求創建一個線程。這種線程池是為了防止請求被阻塞或者拒絕,其中的每個線程都有一個超時時間(keep_alive),默認5分鍾,一旦超時就會回收/終止。elasticsearch的generic線程池就是用該類型。最近發現5.0.0-alpha2版本中去掉了該類型的線程池
2、fixed
有着固定大小的線程池,大小由size屬性指定,默認是5*cores數,允許你指定一個隊列(使用queue_size屬性指定,默認是-1,即無限制)用來保存請求,直到有一個空閑的線程來執行請求。如果Elasticsearch無法把請求放到隊列中(隊列滿了),該請求將被拒絕。
3、scaling
可變大小的pool,大小根據負載在1到size間,同樣keep_alive參數指定了閑置線程被回收的時間。
,4,線程池的配置:
1,可以,在elasticsearch.yml 進行配置
threadpool.index.type: fixed
threadpool.index.size: 100
threadpool.index.queue_size: 500
2,也可以利用api 進行設置
curl -XPUT 'localhost:9200/_cluster/settings' -d '{
"transient": {
"threadpool.index.type": "fixed",
"threadpool.index.size": 100,
"threadpool.index.queue_size": 500
}
}'