本文集主要是總結(jié)自己在項(xiàng)目中使用ES 的經(jīng)驗(yàn)教訓(xùn),包括各種實(shí)戰(zhàn)和調(diào)優(yōu)呜师。
查看當(dāng)前線程狀態(tài)
curl -XGET 'http://localhost:9200/_nodes/stats?pretty'
上面截取了部分線程池的配置框杜,其中,最需要關(guān)注的是rejected踱蠢。當(dāng)某個(gè)線程池active==threads時(shí)火欧,表示所有線程都在忙,那么后續(xù)新的請求就會(huì)進(jìn)入queue中,即queue>0苇侵,一旦queue大小超出限制离陶,如bulk的queue默認(rèn)50,那么elasticsearch進(jìn)程將拒絕請求(碰到bulk HTTP狀態(tài)碼429)衅檀,相應(yīng)的拒絕次數(shù)就會(huì)累加到rejected中招刨。
解決方法
1、記錄失敗的請求并重發(fā)
2哀军、減少并發(fā)寫的進(jìn)程個(gè)數(shù)沉眶,同時(shí)加大每次bulk請求的size
ES核心線程池:
5.x以后 thread_pool有變化,取消了cached線程池類型杉适。ES針對index谎倔、bulk、get猿推、search片习、refresh等操作使用不同的線程池。根據(jù)自己的業(yè)務(wù)場景蹬叭,可以對線程池進(jìn)行調(diào)優(yōu)藕咏。
generic:通用操作,如node discovery秽五。它的類型默認(rèn)為scaling孽查。5.x以后取消了cached類型
index:此線程池用于索引和刪除操作。它的類型默認(rèn)為fixed坦喘,size默認(rèn)為可用處理器的數(shù)量俄烁,隊(duì)列的size默認(rèn)為200绰精,最大線程池大小是可用處理器+1
search:此線程池用于搜索和計(jì)數(shù)請求汁针。它的類型默認(rèn)為fixed碗旅,size默認(rèn)為(可用處理器的數(shù)量* 3) / 2) + 1,隊(duì)列的size默認(rèn)為1000棠笑。
get:此線程池用于實(shí)時(shí)的GET請求梦碗。它的類型默認(rèn)為fixed,size默認(rèn)為可用處理器的數(shù)量腐晾,隊(duì)列的size默認(rèn)為1000叉弦。
bulk:此線程池用于批量操作。它的類型默認(rèn)為fixed藻糖,size默認(rèn)為可用處理器的數(shù)量淹冰,隊(duì)列的size默認(rèn)為200。
percolate:此線程池用于預(yù)匹配器操作巨柒。它的類型默認(rèn)為fixed樱拴,size默認(rèn)為可用處理器的數(shù)量柠衍,隊(duì)列的size默認(rèn)為1000。
snaphot:For snapshot/restore operations. Thread pool type is scaling with a keep-alive of 5m and a max ofmin(5, (# of available processors)/2).
warmer:For segment warm-up operations. Thread pool type is scaling with a keep-alive of 5m and a max ofmin(5, (# of available processors)/2).
refresh:For refresh operations. Thread pool type is scaling with a keep-alive of 5m and a max of min(10, (# of available processors)/2).
listener:Mainly for java client executing of action when listener threaded is set to true. Thread pool type isscaling with a default max of min(10, (# of available processors)/2).
線程池類型:
1晶乔、cached 5.x以后取消了cached類型
無限制的線程池珍坊,為每個(gè)請求創(chuàng)建一個(gè)線程。這種線程池是為了防止請求被阻塞或者拒絕正罢,其中的每個(gè)線程都有一個(gè)超時(shí)時(shí)間(keep_alive)阵漏,默認(rèn)5分鐘,一旦超時(shí)就會(huì)回收/終止翻具。elasticsearch的generic線程池就是用該類型履怯。發(fā)現(xiàn)在5.0.0-alpha2版本中去掉了該類型的線程池。
2裆泳、fixed
有著固定大小的線程池叹洲,大小由size屬性指定,默認(rèn)是5*cores數(shù)工禾,允許你指定一個(gè)隊(duì)列(使用queue_size屬性指定运提,默認(rèn)是-1,即無限制)用來保存請求闻葵,直到有一個(gè)空閑的線程來執(zhí)行請求民泵。如果Elasticsearch無法把請求放到隊(duì)列中(隊(duì)列滿了),該請求將被拒絕笙隙。
threadpool:
index:
size: 30
queue_size: 1000
3洪灯、scaling:
可變大小的pool坎缭,大小根據(jù)負(fù)載在1到size間竟痰,同樣keep_alive參數(shù)指定了閑置線程被回收的時(shí)間。
threadpool:
warmer:
size: 8
keep_alive: 2m
修改線程池配置:
1.通過elasticsearch.yml文件進(jìn)行修改
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時(shí)報(bào)錯(cuò)如下
EsRejectedExcutionException[rejected execution(queue capacity 50) on.......]
這個(gè)錯(cuò)誤明顯是默認(rèn)大小為50的隊(duì)列(queue)處理不過來了掏呼,解決方法是增大bulk隊(duì)列的長度但是會(huì)導(dǎo)致cpu消耗高或者降低并發(fā)量也可以采用重試的機(jī)制坏快,捕獲EsRejectedExcutionException異常,然后重新執(zhí)行上一次的操作憎夷。
配置方法:
elasticsearch.yml 中添加 threadpool.bulk.queue_size: 1000
類似的配置寫法如下:
elasticserch.yml:
thread_pool.index.type: fixed
thread_pool.index.size: 100
thread_pool.index.queue_size: 500
通過restAPI設(shè)置:
curl -XPUT 'localhost:9200/_cluster/settings' -d '{
"transient": {
"threadpool.index.type": "fixed",
"threadpool.index.size": 100,
"threadpool.index.queue_size": 500
}
}'
Elasticsearch的線程池其實(shí)就是對Java自帶的進(jìn)行封裝莽鸿,雖然用戶可以更改相關(guān)配置,但官方強(qiáng)烈不建議去修改默認(rèn)值,在項(xiàng)目的實(shí)際使用中拾给,我們也是對es的bulk線程配置做了調(diào)整祥得。主要是通過type、queue_size蒋得、reject_policy來優(yōu)化性能
參考鏈接:http://rockelixir.iteye.com/blog/1890867
官網(wǎng)關(guān)于thread_pool的鏈接:https://www.elastic.co/guide/en/elasticsearch/reference/5.4/modules-threadpool.html#processors