`
hankesi2000
  • 浏览: 97303 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

影响solr性能的一些因素(附使用经验)

阅读更多
原文:SolrPerformanceFactors

Solr本身的性能不错,但是在使用过程中,还是会遇到一些使用错误,或是没考虑到的地方;在出现瓶颈时,可以首先考虑哪些点呢?下面就来看一下Solr官方的总结,个人觉得总结的很好。SOLR+LUCENE的官网还是挺给力的 

对Schema设计的考虑
索引域的数量增长会很大程度的影响以下的内容:
 
引用
索引期间的内存使用
段的合并时间
优化(optimization)时间

如果设置omitNorms="true" ,则可以减小对这些影响
批注:如果设置Norms,则会影响评分的标准,但会大大的增大索引文件的大小,如果对该字段没有需求,建议关掉


存储域
通过查询结果获取存储域的值是一个相当大的开销。如果文档的数据特别大,或者一些数据存储到了分布式的磁盘中(需要更多的IO来查询域)时,那么花费将会很大。这在存储大数据时很容易被考虑到,尤其是整个文档内容的存储。

考虑将大数据的存储放到solr之外。如果非要这么做,那么可以考虑使用压缩域,这将会用CPU的开销来换取IO的开销。

如果你并不需要使用所有的存储域,允许延迟加载(enableLazyFieldLoading)将会是很好的方式,由于是对那些压缩的字段。

批注:延迟加载在查询期间很有用,尤其是需要对某些字段作额外的处理时,它既能减少内存使用,又加速了程序的处理。另外,尽量减小索引的大小绝对不是坏事。

SOLR配置考虑

mergeFactor

mergeFactor大致决定了段的数量。mergeFactor的值告诉lucene有多少个段需要进行合并。它可以被认为是一个基本的数量系统。

举个例子,如果你设置mergeFactor为10,每1000个文档时会创建一个新的段到硬盘中。当第10个段被添加时,所有的10个段将被合并为1个段 (包含10000个文档);当这样的10个文档被创建时,它们又会被合并为个包含100,000个文档的段,依次类推(当然也有上限)。这样,在任何时候,都不会有多余9个的段(相同索引大小情况下)存在。

该值在solrconfig.xml中的mainIndex设置(它会忽略indexDefaults)。
批注:关于合并的策略,请看我之前的博客:lucene内部的合并策略

mergeFactor Tradeoffs
高值的merge factor(比如25):
引用
Pro:一般会加快索引的速度
Con:低合并延迟,在查询时需要搜索更多的文件,所以会使查询变慢


低值的merge factor(比如2):
引用
Pro:更少的索引文件,加快查询的速度
Con:更多的文件合并,将使索引变慢


批注:一般来说不需要这么极端,设10即可。保证读速度的同时,也保证合并的速度。

HashDocSet最大值的考虑
SOLR1.4之后不支持了,不再描述。

cache中autoWarm数量的考虑
当一个新的searcher被打开时,它的cache可以从旧的searcher中重新加载或者自动预热(autowarmd)缓存的对象。autowarmCount是将被拷贝到新searcher中的对象的数量,你需要根据autowarm的时间来设置autowarmCount。如何使用autowarmCount,需要你根据时间和数量来设定。

批注:autoWarm即新的searcher会有多少数据被缓存,如果没有缓存,一些热点数据无疑会变得很慢。所以,合理的这是这个值,能大大加快查询的效率。


缓存命中率
在Solr的admin中监控缓存的统计。增加缓存的大小通常是提高性能的最好方法,尤其是你对一个指定的缓存类型作逐出操作时。请关注filterCache,它也被用来作solr的facetting。

批注:一个典型的场景是范围查询,类似fl=price:[100 TO 200]这样的情况,将数据该范围存储起来时,对其他的一些查询都可以复用这个缓存的数据,很高效。

对排序的域作明确的预热
如果你的工作大多基于排序的方式,那么你最好在“newSearcher”和“firstSearcher”时间监听器中添加明确的预热查询规则,这样FiledCache可以在用户的查询被执行前就将数据加载。

优化的考虑
你可能想在任何时候都可以优化你的索引。比如你创建索引后,就没有修改过它。

如果你的索引收到了一串需要更新的流,那么请考虑以下的因素:
引用

1. 如果过多的段被添加到索引中,那么查询的性能将会下降;lucene的段自动合并能将段的数量控制在一定范围
2. auto-warming的时间也会延长,它通常依赖于所做的查询
3. 优化后的第一次分布耗时比之后的分布耗时要长。具体请看 Collection Distribution
4. 在优化期间索引的问题大小会加倍,优化后会回到原始大小或更小
5. 如果可以,请确保没有并发的commit请求,否则会有很大的性能损失


在优化时所有的索引会放到唯一的段中;优化索引会避免“文件打开数过多”的问题。
这里有一篇关于该问题的文章:ONJava Article

更新和提交的频率
如果slaves收到的数据过频,那么性能必然受损。为了避免这个问题,你必须了解slaver的更新机制,这样你才能更好的调整相关的参数(commit的数量/频率、snappullers、autowarming/autocount)以使新数据的写入不会那么频繁。

引用
1. 集合的快照会在客户端运行commit时建立,或者在optimization时;这依赖于在master上的postCommit或postOptimize的钩子方法
2. slaver上的Snappuller会运行corn去检查master上是否有新的快照,如果它找到新的版本,就会把它拿过来并install这些新的数据。
3. 当一个新的searcher被打开时,autowarming会先于Solr的查询请求之前完成。有了预热的缓存,查询的延迟将会小很多。


这里有三个相关的参数:
引用
快照的数量/频率:这取决于客户端的索引。因此,集合的版本号依赖于客户端的活跃度
snappluller:基于cron,他可以精确到秒级别。它们运行时,会获取最近它们没有的集合
缓存预热:在solrconfig.xml中配置


查询响应的压缩
在Solr返回xml应答给客户端之前对其进行压缩有时是值得做的。如果应答结果非常大,或者网络IO有限制,或者没有千兆网卡,请考虑使用压缩机制。

压缩会增加CPU的使用,并且Solr本身也是CPU密集型的应用,所以压缩会降低查询的性能。压缩会使文件减小到1/6的大小,使网络包减小到1/3的大小;相对的,查询的性能会降低15%左右。

请查看你的应用服务器的相关文档(tomcat、resion、jetty...)来获取关于压缩的信息。

索引的性能
一般情况下,一次更新多个文档比一个一个更新要快。

对于这种块级的更新方式,考虑使用StreamingUpdateSolrServer.java,它提供多线程多连接的方式来更新流数据。
批注:StreamingUpdateSolrServer类相对CommonsHttpSolrServer要快很多,主要在于它将原本单个的文档写入变为了批量写入,加上多线程多连接的方式,性能上快了超多。我们的测试数据表明,至少要快4-6倍以上。

内存使用的考虑

OutOfMemoryErrors

如果你的solr实例没有足够的内存,那么JVM有时会抛出OutOfMemoryErrors。这并不会对数据有影响,并且solr也会试图优美的恢复它。任何 添加/删除/提交 的命令在异常抛出时都可能不成功;其他不利的影响也可能会产生。对应用而言,如果SimpleFSLock 的锁机制在使用的话,OutOfMemoryError 会导致solr丢失这个锁。如果这发生了,更新索引的结果将会是这样的异常:
SEVERE: Exception during commit/optimize:java.io.IOException: Lock obtain timed out: SimpleFSLock@/tmp/lucene-5d12dd782520964674beb001c4877b36-write.lock


如果你想在OOM时看堆的情况,请设置"-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/the/dump"

JVM内存的分配
针对这个错误的最简单方法,在JVM并没有完全使用你的物理内存时,考虑加大JVM的内存容量:
java -Xms512M -Xmx1024M -jar start.jar


影响内存使用的因素

你可能想去减小solr的内存使用。

一个方式就是减小文档的大小。

当运行add命令时,标准的xml更新请求会有两个限制:

引用
1. 所有的文档必须同时放入到内存中。通常,它的取值为sum(域的实际长度,maxFieldLength)。所以,调整maxFieldLength的大小可能会有帮助
2. 每个<field>...</field>标签都必须放入到内存中,而不管maxFieldLength


注意一些不同的add请求会在不同的线程中并发运行。越多的线程,就会导致越多的内存使用。


我的一些其他使用经验:
1.schema中的类型定义很重要,它直接影响了索引的性能
2.尽量少用filter,虽然它很好用,但是其hashSet的数量如果过多,很容易oom
3. cache的类,都用FastLRUCache吧,LRUCache还有锁,太慢了
4. 通过docId取doc的过程看似平常,但是量大了就是一个灾难,在这点需要根据实际场景考虑
5. 能用缓存的用缓存,不能用缓存的,尝试使用MMapDirectoryFactory,最好是SSD硬盘
6.其他,待想到了再补充
8
3
分享到:
评论
3 楼 wjk1943 2013-11-13  
看了你的这篇文章,写的不错,确实对solr有一定的研究的
我请教你一个问题,我为了测试solr的搜索性能,特意关闭了solr所有的缓存,查询时有一个问题,在一千万级别的数量级下,使用一个词条搜索,第一次耗时600ms~,第二次耗时30ms~,定位到代码发现lucene4.3.0在定位索引后缀文件为doc的文件时第一次就很慢,第二次就非常快。这是什么原因呢。
2 楼 liaowb_1105 2011-11-14  
写的不错,我想问下 如果改停顿词文件,必须得重启solr项目么?
1 楼 悲剧了 2011-09-26  
写得很好,为什么这么多踩,果断顶起,现在分享solr的人很少

相关推荐

    solr7.0性能测试报告

    在监控系统资源方面,通过 Linux 命令检查了 CPU 和 I/O 使用情况,以评估 Solr 在高负载下的性能表现。 测试结果显示: 1. 在 50x100 并发写入测试中,单节点的磁盘使用和 IO 情况与集群模式下有所不同。 2. 对比...

    Solr(Cloudera)使用手册

    - **使用Solr Admin UI**:每个Solr节点都提供了一个Admin UI页面,可以查看该节点的状态和性能指标。 - **使用SolrCloud API**:通过调用SolrCloud API获取集群的状态信息。 #### 七、使用Solr缓存 Solr支持多种...

    solr索引和检索性能测试报告

    solr在做检索的时候时常需要得知他的性能参数,此处使用8G内存,双核处理器测试的结果

    solr的安装使用步骤

    ### Solr的安装使用步骤详解 #### Solr概述与特性 **Solr** 是 Apache 下的一个顶级开源项目,它基于 **Lucene** 进行构建,提供了强大的全文搜索能力。相较于 Lucene,Solr 提供了更为丰富的查询语言支持,并且...

    solr5.5.4部署及使用

    在实际应用中,Solr的部署和使用不仅涉及上述基础步骤,还需要考虑集群配置、性能优化、安全设置等多个方面。例如,通过SolrCloud实现分布式部署,利用Sharding和Replication提高可用性和性能,以及通过设置过滤器、...

    ES和solr搜索方案对比

    ES(ElasticSearch)和Solr都是基于Lucene的搜索引擎,...由于两者都是基于Lucene构建的,因此对于一些基本的全文搜索需求,两者都能够胜任,但高级特性和服务架构的选择将直接影响到整个搜索系统的性能和可维护性。

    solr中文解析器以及使用文档

    总的来说,"solr中文解析器以及使用文档"这个主题涵盖了如何在Solr中配置和使用IK Analyzer进行中文文本处理,以及如何优化其性能以适应各种实际应用。通过深入学习这些内容,可以有效地提升Solr在中文环境下的搜索...

    solr的安装与使用

    Solr安装与使用 Solr是一款功能强大的搜索引擎,能够帮助我们快速搭建企业搜索平台。在本文中,我们将详细介绍Solr的安装和使用过程。 一、安装Solr 首先,我们需要下载Solr的安装包。这里我们使用的是Solr 1.3...

    solr在java中使用总结

    Solr是一个高性能的全文搜索引擎,基于Apache Lucene开发,使用Java 5编写。它不仅继承了Lucene的强大功能,还提供了更丰富的查询语言以及更好的性能优化。Solr具备高度可配置性和可扩展性,支持通过HTTP请求提交XML...

    solr6.5使用的IK分词

    "solr6.5使用的IK分词"就是一个针对Solr 6.5版本的中文分词解决方案。 **IK分词器** IK分词器(Intelligent Chinese Analyzer)是由Lucene社区开发的一款高性能的中文分词工具,适用于Java环境。它的主要目标是为...

    Apache Solr(solr-8.11.1.tgz)

    - **性能优化**:Solr团队不断努力提升查询速度和索引效率,8.11.1版本可能包含了一些新的性能优化。 - **新功能**:可能引入了新的搜索特性,比如新的查询语法、更强大的分析器或者对最新技术标准的支持。 - **稳定...

    easynet.solr开发与使用

    《easynet.solr开发与使用》 在现代信息技术领域,搜索引擎已经成为不可或缺的一部分,而Apache Solr作为一款强大的开源搜索引擎,被广泛应用于各种数据检索场景。为了方便开发者更高效地集成和操作Solr,Easynet...

    solr 的使用及安装

    本文将深入讲解 Solr 的使用及安装过程。 一、Solr 简介 Solr 基于 Lucene 库,提供了一个高度可配置和可扩展的平台,用于处理和索引大量数据,支持多种数据源,如文件、数据库等。其主要特性包括: 1. **全文搜索...

    solr(solr-9.0.0.tgz)

    Solr-9.0.0是该软件的最新版本,此版本可能包含了一些新的特性和改进,比如性能优化、新的查询语法、更强大的分析器等。 在Solr-9.0.0的压缩包中,通常会包含以下组件: 1. **bin** 文件夹:这个目录下有启动和...

    使用docker 部署solr

    centos7 环境 安装docker 并在docker 中部署solr 并使用

    solr-dataimport-scheduler.jar 可使用于solr7.x版本

    总的来说,solr-dataimport-scheduler.jar是Solr 7.x版本中实现定时数据导入和索引更新的关键工具,它极大地提升了Solr在实时和大数据环境下的性能和可靠性。通过合理配置和使用,可以确保你的Solr实例始终拥有最新...

    SOLR的应用教程

    **SOLR应用教程** **一、概述** ...这个SOLR应用教程涵盖了从基础概念到实际应用,包括安装配置、索引和搜索操作、SolrJ的使用以及性能优化等多个方面,为读者提供了一个全面了解和掌握Solr的路径。

    solr资料以及问题汇总

    "Lucene-Solr开发经验.mht"文件可能分享了一些开发者的实战经验,这对于遇到问题时寻找解决方案或者避免常见错误非常有帮助。 "Solr and Jboss.mht"讨论了Solr与JBoss应用服务器的集成,对于在企业环境中部署Solr的...

    Apache Solr(solr-8.11.1.zip)

    8. **搜索性能优化**:Solr提供了多种优化手段,包括使用倒排索引、缓存策略、查询优化器等,以提高查询速度和整体性能。 9. **安全与认证**:Solr 8.x引入了内置的安全性框架,包括Zookeeper的ACL和Solr的Role-...

Global site tag (gtag.js) - Google Analytics