如何提高ElasticSearch中Percolator的性能?

3

摘要

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

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

问题

如何正确地进行扩展?

1)增加底层索引中的分片数量是否允许并行运行更多的滤泡请求?

2)如果ElasticSearch仅执行过滤操作,需要多少内存?

两个具有4GB RAM的服务器好还是一个具有16GB RAM的服务器好?

3)SSD是否有助于滤泡器的性能,还是增加RAM和/或节点数更好?

我们目前的情况

我们的工作索引中有200,000个查询(工作搜索警报)。

我们可以运行4个并行队列来调用滤泡器。 每个查询能够在约35秒内对50个作业进行过滤,因此我们可以过滤:

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

我们需要更多。

我们的工作索引有4个分片,并且我们正在使用.percolator位于该作业索引之上。

硬件:具有32个内核的2处理器服务器。 32GB RAM。 我们将8GB RAM分配给ElasticSearch。

当滤泡器正在工作时,我提到的4个滤泡队列会占用大约50%的CPU。

当我们尝试将并行滤泡队列数量从4增加到6时,CPU利用率跳至75%以上。 更糟糕的是,滤泡器开始出现NoShardAvailableActionException错误:

[2015-03-04 09:46:22,221][DEBUG][action.percolate] [Cletus   Kasady] [jobs] [3]分片多过滤失败   org.elasticsearch.action.NoShardAvailableActionException:[jobs] [3]   空

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

相关: 如何优化elasticsearch percolator索引内存性能

1个回答

4

答案

如何正确地进行扩展?

Q:1)在基础索引中增加分片的数量是否可以允许并行运行更多的 percolate 请求?

A:不可以。只有创建集群时,分片才真正有用。单个实例上的额外分片可能会恶化性能。总体而言,分片数应等于节点数以获得最佳性能。

Q:2)如果 Elasticsearch 仅执行 percolation,则需要多少内存?

拥有 2 台具有 4GB RAM 的服务器还是 1 台具有 16GB RAM 的服务器更好?

A:Percolator 索引完全驻留在内存中,因此答案是很多。它完全取决于您的索引大小。根据我的经验,200,000 次搜索需要一个 50MB 的索引。在内存中,该索引将占用约 500MB 的堆内存。因此,如果这是您所运行的全部内容,则 4 GB RAM 应该足够。我建议您增加节点数。但是,随着索引大小的增长,您将需要增加 RAM。

Q:3)SSD 是否会有意义地提高 percolator 的性能,还是增加 RAM 和/或节点数更好?

A:我怀疑。正如我之前所说,percolators 驻留在内存中,因此磁盘性能并不是很重要。

编辑:请勿参考我的内存估计。请查看 ES 主站点上的网站插件。我发现Big Desk特别有助于观察性能计数器以进行扩展和规划。这将为您提供有关估算您的特定要求的更有价值的信息。

针对 @DennisGorelik 的评论进行编辑:

我纯粹从观察中得出这些数字,但回想起来,它们是有意义的。

  1. 200K 查询到 50MB 磁盘:这个比率意味着平均查询在序列化到磁盘时占用了 250 字节。
  2. 50MB 索引到 500MB 堆:与在磁盘上序列化的对象不同,我们正在处理内存中的 Java 对象。想象一下反序列化 XML(或任何数据格式),您通常会得到 10 倍大的内存中对象。

您的建议与我们最近几个月关于 ElasticSearch 集群实验的观察相符。 我们实际上能够在 2GB RAM 节点上运行 200K percolator 查询。 200K percolator 查询如何转化为 50MB 索引,以及 50MB 索引如何转化为 500MB 堆内存? - Dennis Gorelik
感谢更新。考虑到以下事项,内存增加了10倍令人惊讶: "https://dev59.com/H2w05IYBdhLWcg3wmC6_ 内存中的大小通常在可序列化大小的一半至两倍之间。" - Dennis Gorelik
1
注意,其中一些内容在5.0中可能已更改。滤泡器查询现在存储在磁盘上,这可能对其使用的内存量产生影响。https://www.elastic.co/blog/elasticsearch-percolator-continues-to-evolve - MattM
1
谢谢,@MattM。从堆到磁盘的转移是有道理的,因为我们的EBS读取吞吐量非常高,而堆基本上保持未使用/低。您有什么建议,可以在查询数量增加时控制磁盘读取吞吐量? - asgs
1
@asgs 这取决于你的情况,但是帮助我的查询扩展的方法是进行过滤+渗透查询,这样可能的匹配项在其余部分被渗透之前就已经被缩小了。我手头没有代码示例,但希望这有意义。在我的情况下,这对于过滤掉软删除记录(其中大部分都是)非常有用,因此那些记录根本不会被渗透。 - MattM
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接