如何提高ElasticSearch中的过滤器性能?

时间:2015-03-04 20:24:07

标签: performance elasticsearch elasticsearch-percolate

摘要

我们需要提高过滤器性能(吞吐量)。

最有可能的方法是扩展到多个服务器。

问题

如何正确扩展?

1)基础索引中增加的分片数量是否允许并行运行更多的渗透请求?

2)如果仅进行渗透,ElasticSearch服务器需要多少内存?

最好有2台服务器配备4GB RAM还是一台服务器配备16GB RAM?

3)SSD有意义地帮助过滤器的性能,还是增加RAM和/或节点数量更好?

我们目前的情况

我们的工作索引中有200,000个查询(求职提醒)。 我们能够运行4个并行队列来调用过滤器。 每个查询都能在大约35秒内完成50个作业的批量处理,因此我们可以渗透:

  

4个队列*每批50个作业/ 35秒* 60秒分钟= 343   每分钟工作次数

我们需要更多。

我们的职位索引有4个分片,我们正在使用.percolator坐在该职位索引之上。

硬件:2个处理器服务器,总共32个核心。 32GB RAM。 我们为ElasticSearch分配了8GB内存。

当过滤器工作时,我上面提到的4个渗透队列消耗了大约50%的CPU。

当我们尝试将并行渗透队列的数量从4增加到6时,CPU利用率跃升至75%以上。 更糟糕的是,过滤器因NoShardAvailableActionException开始失败:

  

[2015-03-04 09:46:22,221] [DEBUG] [action.percolate] [Cletus   Kasady] [工作] [3]碎片多渗透失败   org.elasticsearch.action.NoShardAvailableActionException:[jobs] [3]   空

该错误似乎表明我们应该增加分片数量并最终添加专用的ElasticSearch服务器(+后来增加节点数)。

相关: How to Optimize elasticsearch percolator index Memory Performance

1 个答案:

答案 0 :(得分:2)

<强>答案

如何正确扩展?

问: 1)基础索引中增加的分片数量是否允许并行运行更多的渗透请求?

A:否。分片仅在创建群集时非常有用。单个实例上的其他分片实际上可能会恶化性能。通常,分片数应该等于节点数以获得最佳性能。

问: 2)如果仅进行渗透,ElasticSearch服务器需要多少内存?

最好有2台服务器配备4GB RAM还是一台服务器配备16GB RAM?

A:过滤器指数完全驻留在内存中,所以答案很多。它完全取决于索引的大小。根据我的经验,20万次搜索需要50MB的索引。在内存中,此索引将占用大约500MB的堆内存。因此,如果您正在运行,那么4 GB RAM就足够了。在你的情况下,我会建议更多的节点。但是,随着索引大小的增加,您需要添加RAM。

问: 3)SSD有意义地帮助过滤器的性能,还是增加RAM和/或节点数量更好?

A:我对此表示怀疑。正如我之前所说,过滤器驻留在内存中,因此磁盘性能不会成为瓶颈。

编辑:不要对这些内存估算采取行动。查看主ES站点上的site plugins。我发现Big Desk对于观看用于扩展和规划目的的性能计数器特别有用。这可以为您提供有关估算具体要求的更多有价值的信息。

编辑以回应@DennisGorelik发表的评论:

我完全从观察中得到这些数字,但在反思时它们才有意义。

  1. 磁盘上200K查询到50MB:此比率表示序列化到磁盘时平均查询占用250个字节。
  2. 堆上50MB索引到500MB:我们正在处理内存中的Java对象,而不是磁盘上的序列化对象。考虑反序列化XML(或任何数据格式)你通常会获得10倍大的内存中对象。