更新
我已配置xms(初始内存)和xmx(最大内存分配jvm参数,重启后我已连接Visual VM以监控Tomcat内存使用情况。当索引进程正在运行时,内存使用情况Tomcat似乎没问题,内存消耗在定义的jvm params范围内。(见图)
因此,文件系统缓冲区似乎正在消耗所有剩余内存,并且不会丢弃内存?有没有办法处理这种行为,比如更改nGram size或directoryFactory?
我对Solr和Tomcat很新,但是我们走了:
OS Windows Server 2008
Tomcat服务版本7.0(64位)
Solr版本4.5.0。
架构配置:
Solr config:
我们使用.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进程的最大内存使用量? 还有其他选择吗?最佳做法?
由于
答案 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使用太多内存的问题,即使这么小的数据集也是如此。
解决方案或者迄今为止我设置的东西/配置似乎很好,如下:
最后针对内存问题。我不得不勉强实现一种非正统的方法来解决tomcat / java内存占用问题(因为java永远不会给操作系统回放内存)。
我创建了一个内存管理器服务,它使用debug特权运行并调用windows API来强制tomcat进程释放内存。我还有一个全局互斥锁来阻止访问tomcat,而当调用进来时会发生这种情况。
令人惊讶的是,如果您没有控制对Tomcat的访问权限,这种方法运行良好,但并非没有自己的危险。
如果您发现更好的解决方案/配置更改,请告诉我们。