Solr on Tomcat,Windows操作系统消耗所有内存

时间:2014-01-15 10:57:24

标签: memory solr jvm tomcat7 jvm-arguments

更新

我已配置xms(初始内存)和xmx(最大内存分配jvm参数,重启后我已连接Visual VM以监控Tomcat内存使用情况。当索引进程正在运行时,内存使用情况Tomcat似乎没问题,内存消耗在定义的jvm params范围内。(见图)
因此,文件系统缓冲区似乎正在消耗所有剩余内存,并且不会丢弃内存?有没有办法处理这种行为,比如更改nGram size或directoryFactory?


我对Solr和Tomcat很新,但是我们走了:

OS Windows Server 2008

  • 4 Cpu
  • 8 GB Ram

Tomcat服务版本7.0(64位)

  • 仅运行Solr
  • 没有设置可选的JVM参数,但是通过GUI
  • 进行Solr配置

Solr版本4.5.0。

  • 一个核心实例(用于查询和索引)

架构配置:

  • minGramSize =“2”maxGramSize =“20”
  • 大多数字段都存储=“true”(必填)

Solr config:

  • ramBufferSizeMB:100
  • maxIndexingThreads:8
  • directoryFactory:MMapDirectory
  • autocommit:maxdocs 10000,maxtime 15000,opensearcher false
  • 缓存(默认值):
    filtercache initialsize:512 size:512 autowarm:0
                     queryresultcache initialsize:512 size:512 autowarm:0
                     documentcache initialsize:512 size:512 autowarm:0

我们使用.Net服务(基于Solr.Net)在单个Solr Core实例上更新和插入文档。发送给Solr的文档大小从1 Kb到8Mb 变化,我们使用一个或多个线程批量发送文档。 Solr Index的当前大小约为15GB。

索引服务大约运行3-4个小时,以完成对Solr的所有插入和更新。在索引过程正在运行时, Tomcat进程内存使用 不断增长到> 7GB Ram 并且即使在24小时后也不会减少。 重新启动Tomcat或Solr Admin中的Reload Core后,内存将减少到1 GB 2 GB。内存泄漏?

是否可以在Tomcat上配置Solr进程的最大内存使用量? 还有其他选择吗?最佳做法?

enter image description here

由于

3 个答案:

答案 0 :(得分:0)

您可以在tomcat上设置JVM内存设置。我通常使用tomcat的bin目录中的setenv.bat文件(与catalina.bat / .sh文件相同的目录)执行此操作。

根据您的需要调整以下值:

set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx512m"

以下是明确的说明:

http://wiki.razuna.com/display/ecp/Adjusting+Memory+Settings+for+Tomcat

答案 1 :(得分:0)

首先,您必须设置XMX参数以限制Tomcat可以使用的最大内存。但是在SOLR的情况下,你必须记住它在JVM之外使用大量内存来处理文件系统缓冲区。因此,在这种情况下,永远不要为Tomcat使用超过50%的可用内存。

答案 2 :(得分:0)

我有以下设置(尽管问题要小得多)...... 5000个文档,文档大小从1MB到30MB不等。 我们要求在2 CPU / 2GB系统上运行低于1GB的Tomcat进程

经过一些实验,我想出了JAVA的这些设置。

-Xms448m
-Xmx768m
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:ParallelCMSThreads=4
-XX:PermSize=64m
-XX:MaxPermSize=64m
-XX:NewSize=384m
-XX:MaxNewSize=384m
-XX:TargetSurvivorRatio=90
-XX:SurvivorRatio=6
-XX:+CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=55
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+OptimizeStringConcat
-XX:+UseCompressedOops
-XX:MinHeapFreeRatio=5
-XX:MaxHeapFreeRatio=5

这些有所帮助,但是我遇到了OutOfMemory和Tomcat使用太多内存的问题,即使这么小的数据集也是如此。

解决方案或者迄今为止我设置的东西/配置似乎很好,如下:

  1. 禁用QueryResultCache以外的所有缓存
  2. 请勿在查询中包含文字/内容字段,仅包含ID
  3. 请勿使用大于10的行大小,并且不要包含突出显示。
  4. 如果您正在使用突出显示(这是最大的罪魁祸首),请首先从查询中获取文档标识符,然后再使用突出显示和包含id字段的搜索字词进行查询。
  5. 最后针对内存问题。我不得不勉强实现一种非正统的方法来解决tomcat / java内存占用问题(因为java永远不会给操作系统回放内存)。

    我创建了一个内存管理器服务,它使用debug特权运行并调用windows API来强制tomcat进程释放内存。我还有一个全局互斥锁来阻止访问tomcat,而当调用进来时会发生这种情况。

    令人惊讶的是,如果您没有控制对Tomcat的访问权限,这种方法运行良好,但并非没有自己的危险。

    如果您发现更好的解决方案/配置更改,请告诉我们。