为什么这个Solr查询这么慢?

时间:2015-10-13 17:19:22

标签: solr

我在Ubuntu 12.04上使用Solr 5.2.1。我有~250,000个索引的文件。从所有文档中获取2个小字段大约需要2.5分钟。 为什么需要这么长时间,我该怎么做才能加快速度?要说明我正在做的事情:我正在将solr文档与MySQL记录同步。执行此操作(处理删除)的最简单方法是将Solr中的所有内容与MySQL中的所有内容进行比较。

http://localhost:8983/solr/[my collection] / select?q = %3A & fl = field1& fl = field2& rows = 300000& wt = json

如果我用curl获取它,我可以看到它以大约50KBps的速度写入结果,这比普通的本地http服务器文档慢,所以我知道问题必须是Solr内部的。但为什么呢?

令人惊讶的是,使用CSV的wt(编写器类型,也称为响应格式)的同一查询也同样慢。似乎瓶颈是Solr本身。

我认为这可能是由于我运行的是Solr,我相信它是默认选项。以下是ps的过程:

java -server -Xss256k -Xms512m -Xmx512m -XX:NewRatio = 3 -XX:SurvivorRatio = 4 -XX:TargetSurvivorRatio = 90 -XX:MaxTenuringThreshold = 8 -XX:+ UseConcMarkSweepGC -XX:+ UseParNewGC -XX:ConcGCThreads = 4 -XX:ParallelGCThreads = 4 -XX:+ CMSScavengeBeforeRemark -XX:PretenureSizeThreshold = 64m -XX:+ UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction = 50 -XX:CMSMaxAbortablePrecleanTime = 6000 -XX:+ CMSParallelRemarkEnabled -XX:+ ParallelRefProcEnabled -XX:CMSFullGCsBeforeCompaction = 1 -XX:CMSTriggerPermRatio = 80 -verbose:gc -XX:+ PrintHeapAtGC -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -XX:+ PrintGCTimeStamps -XX:+ PrintTenuringDistribution -XX:+ PrintGCApplicationStoppedTime -Xloggc:/ home / tylercollier / solr / dist / server / logs / solr_gc.log -Djetty.port = 8983 -DSTOP.PORT = 7983 -DSTOP.KEY = solrrocks -Duser.timezone = UTC -Djetty.home = / home / tylercollier / solr / dist / server -Dsolr.solr.home = / home / tylercollier / solr / dist / server / solr -Dsolr.install.dir = / home / tylercollier / solr / dist -jar start.jar -XX:OnOutOfMemoryError = / h ome / tylercollier / solr / dist / bin / oom_solr.sh 8983 / home / tylercollier / solr / dist / server / logs --module = http

我即将尝试使用this page中描述的内存大小。我仍然想先在这里提出这个问题,因为我通常会发现这些“猜测和检查”设置令人沮丧地处理,因为它与代码和机器的情况有很大关系。但我会用我的调查结果报告。

UPDATE :将Xmx值从512m更改为2g可将时间从约150秒减少到约50秒。但是进一步增加Xmx似乎没有任何区别(我尝试过3g,4g)。改变Xss似乎毫无差别。它的默认值是256k,但我尝试了1米和5米。所以,50秒是150秒的改进,但远不及我想要的。 MySQL可以在2秒或更短的时间内给我这些结果。是什么给了什么?

UPDATE 2 :更改查询以返回所有字段(而不是将其限制为2个字段)也没有时间差异。这对我来说真的很令人惊讶。现在CURL传输速率约为11 MB / s。我不相信索尔尔不能更快地完成自己的记录。

更新3 :是否有其他人尝试同时从Solr获取这么多文档(无论是使用分页还是一次性获取)?你也这么慢吗?

1 个答案:

答案 0 :(得分:1)

有一个专用的请求处理程序,仅用于此目的,Export Request Handler

如果您需要检索完整的查询集,那可能是更好的解决方案。

最新版本的Solr中还有Streaming API support,如果您需要检索大型结果集并在检索它时对其进行处理,则可能是合适的,而无需一次为整个集分配内存。但这仅限于支持DocValues的字段,因此在这种情况下可能不适用(正如您的上一条评论所示)。