Elasticsearch线程池介绍
每個Elasticsearch節(jié)點內部都維護著多個線程池,如index、search、get、bulk等,用戶可以修改線程池的類型和大小,線程池默認大小跟CPU邏輯一致,本文基于最新的Elasticsearch2.3.x
一、查看當前線程組狀態(tài)
[html]?view plaincopy上面截取了部分線程池的配置,其中,最需要關注的是rejected。當某個線程池active==threads時,表示所有線程都在忙,那么后續(xù)新的請求就會進入queue中,即queue>0,一旦queue大小超出限制,如bulk的queue默認50,那么elasticsearch進程將拒絕請求(碰到bulk HTTP狀態(tài)碼429),相應的拒絕次數就會累加到rejected中。
解決方法是
1、記錄失敗的請求并重發(fā)
2、減少并發(fā)寫的進程個數,同時加大每次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。
三、線程池類型
1、cached
無限制的線程池,為每個請求創(chuàng)建一個線程。這種線程池是為了防止請求被阻塞或者拒絕,其中的每個線程都有一個超時時間(keep_alive),默認5分鐘,一旦超時就會回收/終止。elasticsearch的generic線程池就是用該類型。最近發(fā)現5.0.0-alpha2版本中去掉了該類型的線程池。
[html]?view plaincopy2、fixed
有著固定大小的線程池,大小由size屬性指定,默認是5*cores數,允許你指定一個隊列(使用queue_size屬性指定,默認是-1,即無限制)用來保存請求,直到有一個空閑的線程來執(zhí)行請求。如果Elasticsearch無法把請求放到隊列中(隊列滿了),該請求將被拒絕。
3、scaling
可變大小的pool,大小根據負載在1到size間,同樣keep_alive參數指定了閑置線程被回收的時間。
[html]?view plaincopy四、修改線程池配置
1、elasticsearch.yml
[html]?view plaincopy2、Rest API
[html]?view plaincopy五、bulk異常排查
使用es bulk api時報錯如下
[html]?view plaincopyelasticsearch.yml
[html]?view plaincopy六、總結
Elasticsearch的線程池其實就是對java自帶的進行封裝,雖然用戶可以更改相關配置,但官方強烈不建議去修改默認值,關于為什么,可以閱讀下面第三篇文章。
相關文檔
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
https://www.elastic.co/guide/en/elasticsearch/guide/current/_don_8217_t_touch_these_settings.html#_threadpools
總結
以上是生活随笔為你收集整理的Elasticsearch线程池介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 垃圾优先型垃圾回收器调优
- 下一篇: jvm默认垃圾收集器