前一阵子因为日志系统写es过于缓慢,把写接口改造成使用异步方式(TransportClient 里面的async,不用等待es写完就返回),调用方快了很多,qps也就上来了,但是没注意bulk的线程模型,我设置了16线程 1000 队列长度,结果发生reject了。
我想通过调大队列长度缓解上游写的压力,但是这个队列也是占内存的,一般设置多大比较好?这个队列里面每个元素的大小就等于我一个批量请求数据的大小吗?假设我批量一次写1m,也就是说极端情况如果队列堆积了100个元素,那就会占用1G的内存?(甚至应该多,因为肯定还有其他元数据信息)
不想改回到同步,如果改回同步的方式写,速度又太慢,日志堆积又会太多。
我想通过调大队列长度缓解上游写的压力,但是这个队列也是占内存的,一般设置多大比较好?这个队列里面每个元素的大小就等于我一个批量请求数据的大小吗?假设我批量一次写1m,也就是说极端情况如果队列堆积了100个元素,那就会占用1G的内存?(甚至应该多,因为肯定还有其他元数据信息)
不想改回到同步,如果改回同步的方式写,速度又太慢,日志堆积又会太多。
1 个回复
yayg2008
赞同来自: medcl 、code4j
优化方式参考 https://elasticsearch.cn/question/3896 我的回复。