搜索线程池的弹性搜索队列大小
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
【讨论】:
以上是关于搜索线程池的弹性搜索队列大小的主要内容,如果未能解决你的问题,请参考以下文章