搜索线程池的弹性搜索队列大小

Posted

技术标签:

【中文标题】搜索线程池的弹性搜索队列大小【英文标题】:elasticsearch queue size for search threadpool 【发布时间】:2015-03-05 18:18:06 【问题描述】:

我有一个用于整个应用程序的传输客户端实例。我能够处理 8 个并行搜索到 elasticsearch。

但是当我尝试执行 10 个或更多并行搜索请求时,我收到 esRejected 执行异常。

我是否必须增加搜索线程池的队列大小。我可以从 elasticsearch.yml 中的客户端或服务器设置执行此操作吗

谢谢。

【问题讨论】:

您需要提供详细信息,例如搜索命令、真实错误日志或屏幕截图、elasticsearch.yml 内容等。 仅限普通搜索查询。搜索线程池的默认队列大小为 1000。 "bool" : "must" : "match" : "CityName" : "query" : "Chennai", "type" : "boolean" 不建议增加队列大小或线程池默认配置,因为您的集群可能会变得不稳定。添加更多节点以增加计算能力,或者,如果不可能,这将是集群的并发搜索限制,您需要接受它。 【参考方案1】:

我希望您所说的错误是以下错误:

org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor

几天前我遇到了完全相同的问题。我的用例是对 elasticsearch 的 16 个并发请求,其中每个请求都是批量插入。在我开始之前,我想解释导致此错误的原因。当您向 elasticsearch 服务器发出批量请求时,它们是通过线程池处理(默认值=8)。如果没有理想的线程,剩余的消息将附加到队列中。如果对 elasticsearch 的并发请求过多,则此队列将被填满。 以下是我尝试过的不同解决方案:

    在 helpers.bulk 调用中,您可以传递默认为 500 的 chunk_size。块大小是 elasticsearch 内部的,它将您的数据分成批次,然后进一步传递请求。因此,块大小越大,队列中附加的消息数量就越少,反之亦然。此解决方案的唯一缺点是随着块大小的增长,您将接近达到 max_chunk_bytes 值(默认为 100Mb),这意味着您发送的块大小不应大于此限制。对我来说,每条记录的大小为 2.1kb,因此我很乐意提供 40k 的块大小。 增加队列大小:您可以在 ThreadPool.bulk.queue_size 下增加队列大小,默认值为 50。增加队列大小意味着您将更多的内存负载放在 elasticsearch 服务器上,这实际上取决于您的机器大小。我使用的机器大小有 61Gb 的内存。我通过 105 个并行请求和 1000 块大小对最大负载的服务器进行了压力测试。 限制并发:如果您能够以客户端大小处理请求,那么您就不会将大量消息请求放入队列中,基本问题就解决了。

调用es api即可进行上述操作:

 helpers.bulk(es_client, query, request_timeout=200, chunk_size=self.chunk_size)

像 request_timeout 和 chunk_size 这样的参数被传递到 helpers.bulk 的 kwargs 上,而这些 kwargs 又调用了 streaming_bulk。

查看线程池配置here

helpers方法详细说明here

【讨论】:

以上是关于搜索线程池的弹性搜索队列大小的主要内容,如果未能解决你的问题,请参考以下文章

场景应用:线程池的队列大小你通常怎么设置?

线程池的拒绝策略示例

线程池的创建

漫画Java线程池的工作机制

说说你对线程池的了解 —— 初识线程池

Java并发:线程池的使用