首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SOLR性能调优

SOLR性能调优
EN

Stack Overflow用户
提问于 2011-12-25 00:14:27
回答 2查看 12.1K关注 0票数 11

我读过以下文章:

http://wiki.apache.org/solr/SolrPerformanceFactors

http://wiki.apache.org/solr/SolrCaching

http://www.lucidimagination.com/content/scaling-lucene-and-solr

我有几个问题要问:

  1. 如果我使用JVM选项-XX:+UseCompressedStrings,我可以节省什么样的内存?为了保持一个简单的例子,如果我在omitNorms=true和omitTf=true中有一个索引字段(string)和一个存储字段(string),那么我可以期望在索引和文档缓存中节省什么呢?我猜大概有50%,但这可能太乐观了。
  2. Solr过滤器缓存究竟是什么时候做的?如果我只是做一个简单的查询和一些OR,并按分数排序,我甚至需要它吗?
  3. 如果要缓存文档缓存中的所有文档,如何计算所需的空间?使用上面的示例,如果我有20M文档,使用压缩字符串,并且存储字段的平均长度为25个字符,空间是否基本需要(25个字节+ small_admin_overhead) * 20M?
  4. 如果所有文档都在文档缓存中,查询缓存有多重要?
  5. 如果我想将每个文档自动武装到文档缓存中,*:*的自动臂查询会这样做吗?
  6. 比例-lucene和solr的文章说,FuzzyQuery是缓慢的。如果我使用solr的拼写检查功能,那么基本上是使用模糊查询对(因为拼写检查做了相同的编辑距离计算)?那么,拼写检查和模糊查询可能都同样“慢”?
  7. 描述字符串的lucene字段缓存的部分有点混乱。我是否正确地读到所需的空格基本上是索引字符串字段+整数数组的大小,等于该字段中唯一项的数量?
  8. 最后,在最大化吞吐量的情况下,有一个关于为OS磁盘缓存留出足够空间的声明。它说,“总的来说,对于一个大型索引来说,最好确保至少有几‘s的RAM超出了提供给JVM的内存。”因此,如果我有一个12 3GB的内存机器(例如),我应该给操作系统至少2-3GB?我可以通过查看on磁盘索引大小来估算操作系统所需的磁盘缓存空间吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-25 06:00:30

  1. 唯一确定的方法就是试一试。但是,我认为索引中的节省很少,因为索引每次只包含一次实际字符串,其余的都是文档中该字符串位置的数据。它们并不是指数的很大一部分。
  2. 过滤器缓存仅缓存筛选器查询。它可能对您的精确用例没有帮助,但许多人确实认为它们很有用。例如,按国家、语言、产品类型等缩小结果。如果经常使用Solr,可以避免重新计算查询结果。
  3. 实际上,您只需尝试并使用分析器来测量它。如果不深入了解所使用的数据结构,其他任何东西都是纯拖拽的。你的计算和其他人的计算一样好。
  4. 文档缓存只会节省计算查询后生成结果的时间。如果您将大部分时间用于计算查询,那么文档缓存对您没有什么好处。查询缓存只对重复使用的查询有用。如果没有重复查询,则查询缓存是无用的。
  5. 是的,假设您的文档缓存足够大,足以容纳它们。

6-8不肯定。

根据我在Solr性能调优方面的经验,您应该离开Solr来处理查询,而不是文档存储。你的大部分问题都集中在文档是如何占据空间的。Solr是一个搜索引擎,而不是文档存储库。如果您希望Solr快速并占用最少的内存,那么它应该保存的唯一东西是索引信息,以便进行搜索。文档本身应该存储、检索和呈现在其他地方。最好是在专门针对该工作进行优化的系统中。您应该存储在Solr文档中的唯一字段是从文档存储系统检索的ID。

票数 8
EN

Stack Overflow用户

发布于 2011-12-26 13:01:21

缓存

一般来说,缓存看起来是一个提高性能的好主意,但这也有很多问题:

  • 缓存的对象很可能进入到旧一代的垃圾收集器中,收集起来成本更高,
  • 管理插入和驱逐会增加一些开销。

此外,除非查询中有模式,否则缓存不太可能大大提高搜索延迟。相反,如果20%的流量是由于几个查询造成的,那么查询结果缓存可能会很有趣。配置缓存要求您很好地了解查询和文档。如果没有,则应该禁用缓存。

即使禁用所有缓存,由于OS I/O缓存,性能仍可能相当好。实际上,这意味着如果您一次又一次地读取文件的同一部分,很可能只会第一次从磁盘读取,然后从I/O缓存读取。禁用所有缓存允许您将更少的内存分配给JVM,这样I/O缓存就会有更多的内存。如果您的系统有12 2GB的内存,如果您将2GB的内存分配给JVM,这意味着I/O缓存可能能够缓存高达10G的索引(这取决于其他运行中也需要内存的应用程序)。

我建议您阅读这篇文章是为了获得更多关于应用程序级缓存和I/O缓存的信息:

https://www.varnish-cache.org/trac/wiki/ArchitectNotes

http://antirez.com/post/what-is-wrong-with-2006-programming.html

字段缓存

字符串的字段缓存的大小为(长度为maxDoc的整数数组)+(所有唯一字符串实例的一个数组)。因此,如果您有一个具有一个字符串字段的索引,该字段平均具有N个大小为S的实例,而如果索引有M个文档,则该字段的字段缓存的大小将近似为M * 4 + N * S

字段缓存主要用于面和排序。即使是非常短的字符串(少于10个字符) > 40字节。,这也意味着如果您对具有大量唯一值的字符串字段进行排序或排序,Solr将需要大量内存。

模糊查询

FuzzyQuery在Lucene 3.x中速度慢,在Lucene 4.x中则快得多。

这取决于您选择的拼写检查器实现,但我认为Solr 3.x拼写检查器使用N-克来查找候选项(这就是为什么它需要一个专用索引),然后只计算候选人在此集合上的距离,因此性能仍然相当好。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8627594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档