根据这篇文章,linux机器最好在索引大小方面拥有1.5倍的RAM。因此,为了验证这一点,我尝试在不同的RAM分配量中测试solr性能,保持其他配置(即固态驱动器,8核处理器,64位)在两种情况下都相同。
https://wiki.apache.org/solr/SolrPerformanceProblems
1)最初,linux机器有32 GB RAm,其中我分配了14GB到solr。
export CATALINA_OPTS =“ - Xms2048m -Xmx14336m -XX:+ UseConcMarkSweepGC -XX:+ PrintGCApplicationStoppedTime -XX:+ PrintGCDetails -XX:+ PrintGCTimeStamps -Xloggc:./ logs / info_error / tomcat_gcdetails.log”
1000个查询的平均搜索时间为300毫秒。
2)之后,RAM增加到68 GB,其中我为Solr分配了40GB。现在,奇怪的是,同一组查询的平均搜索时间是3000毫秒。
现在,在此之后,我在68GB机器上将solr分配的内存减少到了25GB。但是,与第一种情况相比,搜索时间仍然更长。
我缺少什么。请建议
答案 0 :(得分:2)
在我看来,你使用的Java堆太大了。
RAM对于Solr非常重要,但主要是将索引文件保留在Java堆空间之外的内存中。
Solr默认使用" MMapDirectory"它将索引文件加载到OS磁盘缓存中,然后将其映射到Solr进程的虚拟内存中。重要的是,这发生在Java堆空间之外。
您在声明的文档中也说了这一点:
Solr性能的主要驱动因素是RAM。索尔要求 两个独立的东西有足够的内存:一个是Java堆,即 其他是"免费"操作系统磁盘缓存的内存。
...
对于索引更新,Solr依赖于快速批量读取和写入。对于 搜索,快速随机读取是必不可少的。满足这些的最好方法 要求是确保有大型磁盘缓存可用。
要更好地理解这一点http://blog.thetaphi.de/2012/07/use-lucenes-mmapdirectory-on-64bit.html
那么Java堆空间应该有多大?我将从2 GB开始,然后查看GC日志
这是其中一个没有通用答案的问题。你想要一个 堆得足够大,以便你没有OutOfMemory(OOM) 持续垃圾收集的错误和问题,但足够小 你不会浪费内存或遇到巨大的垃圾收集 暂停。长版本:您必须进行实验。