三人行必有我师

ES thread_pool queue > queue size

Elasticsearch | 作者 dadaball | 发布于2020年01月10日 | 阅读数:3043

請問大家
我在測試 thread_pool 的時候發現  queue > queue_size  這個現象是正常的嗎?
印象中官方有提到 queue 超過 queue_size 會開始 reject ,如果以這個為前提, queue 應該是 <= queue_size
 
超過queue size 的話是什麼原因,會造成什麼影響嗎?
ES 版本6.2.4、7.5.1都有這樣的狀況發生
1578291927774.jpg

不知道有沒有大佬知道這問題,感謝!
已邀请:

Charele - Cisco4321

赞同来自: dadaball

sorry,以前没有注意过_cat/thread_pool这个东西,执行了一下你的那个命令,仔细看了看,才明白。 
queue 就是当前队列中的元素个数
queue_size,就是队列中的元数个数的最大限制
 
你上面说的,按理来说,是应该“queue 應該是 <= queue_size“
拿write池来说,这个队列的类型不是java的,而是es自定义的queue类型:SizeBlockingQueue
 
public class SizeBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E> {

    private final BlockingQueue<E> queue;//包含了一个直正的java队列
    private final int capacity;//最大限制,缺省应该是200个,即"queue_size"
    private final AtomicInteger size = new AtomicInteger();
 
    @Override
    public int size() {
        return size.get();
    }
 
"queue"的显示结果就是那个size()方法里取到的,它返回的不是实际内部队列queue的size(),
而是用另个一个计数器size来计算的。
在真正插入或取出的时候,这个计数器也会增加或减少。
我想原因是可能是它没有考虑到某些环境下,出现的计数错误吧。
(我这里没有真实的es环境,看不到你那种状况)不过这只是个计数,就是有出入,也无关大碍。
 
只是个人看法,希望别人有别的看法:-)
 
 

xiaoyanghapi - Elasticsearch 爱好者

赞同来自:

queue_size的话有很多种,查询、批量插入、单条插入的queue等,如果超过对应的阈值确实会发生拒绝,写入拒绝后相当于这条数据将会丢掉,客户端可以做对应的插入重试,出现reject主要原因是1.ESsegment生成太慢+磁盘写入太慢(未采用异步写入translog) 2. 刷新索引太频繁 3.未采用批量插入

Charele - Cisco4321

赞同来自:

bulk池就是write池,
就拿write来说吧,
 
看代码:
builders.put(Names.WRITE, new FixedExecutorBuilder(settings, Names.WRITE, availableProcessors, 200));
 
它是固定类型的池(ES里面分3种,这是另外的话题)
其中的availableProcessors就是你的cpu核心数(如果你不另外设置的话)
比如我的电脑是12线程的,它会建立12个线程为你的write服务,
如果你的write请求太多,超过了12个,它就会把多余请求放到队列里面等,等有线程空闲了再为它们服务,
如果你的write请求太多太多了,超过了200个,队列都放不下了,它就会reject报错。
 
 
 

要回复问题请先登录注册