Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 在Tomcat上,Windows操作系统会消耗所有内存_Memory_Solr_Jvm_Tomcat7_Jvm Arguments - Fatal编程技术网

Memory 在Tomcat上,Windows操作系统会消耗所有内存

Memory 在Tomcat上,Windows操作系统会消耗所有内存,memory,solr,jvm,tomcat7,jvm-arguments,Memory,Solr,Jvm,Tomcat7,Jvm Arguments,更新 我已经配置了xms(初始内存)和xmx(最大内存分配jvm参数),重启后我连接了Visual VM以监控Tomcat内存使用情况。在索引过程运行时,Tomcat的内存使用情况似乎正常,内存消耗在定义的jvm参数范围内。(见图) 因此,文件系统缓冲区似乎正在消耗所有剩余内存,而不会丢弃内存?有没有办法处理这种行为,如更改nGram大小或directoryFactory 我对Solr和Tomcat很陌生,但现在我们开始: 操作系统Windows server 2008 4中央处理器 8GB

更新

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


我对Solr和Tomcat很陌生,但现在我们开始:

操作系统Windows server 2008

  • 4中央处理器
  • 8GB内存
Tomcat服务版本7.0(64位)

  • 只运行Solr
  • 未设置可选的JVM参数,但通过GUI进行Solr配置
Solr版本4.5.0

  • 一个核心实例(用于查询和索引)
架构配置:

  • minGramSize=“2”maxGramSize=“20”
  • 大多数字段都存储为=“true”(必填)
解决方案配置:

  • 兰布费西泽姆:100
  • 最大索引:8
  • 目录工厂:MMapDirectory
  • 自动提交:maxdocs 10000,maxtime 15000,opensearcher false
  • 缓存(默认值):
    过滤器缓存初始大小:512大小:512自动预热:0
    queryresultcache初始大小:512大小:512自动预热:0
    documentcache初始大小:512大小:512自动预热:0
我们使用.Net服务(基于Solr.Net)在单个Solr核心实例上更新和插入文档。发送到Solr的文档大小从1KB到8Mb不等。我们使用一个或多个线程分批发送文档。Solr索引的当前大小约为15GB

索引服务大约运行3到4小时,以完成对Solr的所有插入和更新。当索引过程运行时,Tomcat进程内存使用量持续增长到7 GB Ram,即使在24小时后也不会减少。 重新启动Tomcat后,或者在Solr Admin中重新加载内核后,内存会下降到1GB。内存泄漏

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


谢谢

您可以在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

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

我有以下设置(尽管问题小得多)。。。 5000个文档,文档大小从1MB到30MB不等。 我们需要在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使用太多内存的问题,即使数据集很小

到目前为止,我设置的解决方案或事物/配置似乎保持良好,如下所示:

  • 禁用除QueryResultCache之外的所有缓存
  • 不要在查询中包含文本/内容字段,只包含id
  • 不要使用大于10的行大小,也不要包含高亮显示
  • 如果使用突出显示(这是最大的问题),请首先从查询中获取文档标识符,然后再次使用突出显示和包含id字段的搜索词进行查询
  • 最后是内存问题,我不得不勉强实现一种非正统的方法来解决tomcat/java内存占用问题(因为java从不将内存返还给操作系统)

    我创建了一个内存调控器服务,该服务以调试权限运行,并调用windows API来强制tomcat进程释放内存。我还有一个全局互斥锁来防止在调用时访问tomcat

    令人惊讶的是,这种方法运行得很好,但如果您没有控制对Tomcat的访问的选项,那么它本身也会有风险


    如果您找到更好的解决方案/配置更改,请告知我们。

    您能否发布缓存的设置,这可能是问题所在。