Solr 4.5上有一个索引,其中包含大约50K个文件,大小为4Gb。 JVM可用的物理RAM是6Gb(服务器上总共10Gb),OS是64bit CentOS 5。
其中一个应用程序查询在一个循环中多次索引,一个请求在前一个请求完成时立即发送,几乎没有任何延迟,但仍然不是同时发生。
查询都是一样的,并符合以下简单模式:
( q中的所有字段都是索引化的标记文本)
经过相对较less的这种查询(有时在第三次之后,有时在第五次之后等等)之后,Solr侧收到垃圾回收器,因为所有内存都很忙。 这导致Solr响应之前几秒钟的延迟,导致应用程序发送请求在超时中止。
如果应用程序在后续查询之间等待发送约1秒,则所有这些查询都快速完成,并且RAM不会超出; 但查询一个接一个地发送得越快,下一个查询的更改就会导致GC触发和不需要的超时。
相同的索引(由相同应用程序的相同数据构build而成)在旧版Solr(1.4)上使用相同的使用模式是绝对正确的。
增加solrconfig.xml中的caching大小似乎没有太大的影响,但将rows参数从100减less到100会使得超时的可能性降低,而不是完全不可能的。 configuration中的queryResultWindowSize设置为默认值20。
我想可能有不止一个观察到的行为的原因,我没有提供足够的细节。 如果是这样,我需要改变或简介从这里缩小范围?
这是Java的本质:垃圾收集意味着整个世界停止。
我知道的接受的解决scheme通常都很糟糕:
由于升级到Solr的新版本后才遇到问题,因此可能需要检查其邮件列表和问题跟踪器,以确定这是否是已知的问题,在以后的版本中解决。
如果你想分析和debugging应用程序本身,这实际上是更多的堆栈溢出问题 – 这可能是你的Solr是次优的(在你的查询或在应用程序),这使得它使用更多的RAM比它需要。
尤里,我在阿祖尔系统工作。 去年,我们将Zing虚拟机与Lucene的步伐进行了基准testing。 我们编写的解决scheme简介显示了第二页graphics中的代表性延迟统计数据: http : //www.azulsystems.com/partners/apache-lucene-solr 。
Zing垃圾回收器“C4”与Hotspot中的不同。 Zing下的垃圾收集意味着整个世界不会停止。 相反,Java mutator线程继续进行,GC操作并行运行,通常在不同的核心上运行。 Zing的世界模式无论是在主要的GC策略还是作为后备,无论是在新一代或老一代collections家。
我不能说我们已经看到Solr 4.5是一个特殊的罪魁祸首。 如果您确定Solr或您的应用程序没有错误,并且在分类后仍然有GC暂停,请考虑查看Zing: http : //www.azulsystems.com/products/zing/whatisit
Voretaq7对替代品的评价不应该包括C4或Zing。 至less我希望如此。
祝你好运。
马特