更新
我已经配置了XMS(初始内存)和XMX(最大内存分配JVM paramters,我已经迷上了视觉VM监测Tomcat的内存使用量的重新启动后,当索引程序运行,Tomcat的内存使用情况似乎确定,内存消耗是在定义的JVM则params的范围内。(见图像)
如此看来,文件系统缓存正在消耗所有剩余的内存,并且不降内存? 有没有办法解决这个问题,比如改变NGRAM大小或directoryFactory?
我很新到Solr和Tomcat的,但在这里我们去:
操作系统Windows Server 2008中
Tomcat服务版本7.0(64位)
- 只有运行的Solr
- 无可选参数JVM设置,而是通过GUI配置的Solr
Solr的版本4.5.0。
架构的配置:
- minGramSize = “2” maxGramSize = “20”
- 大多数字段被存储=“真”(需要的)
Solr的配置:
- ramBufferSizeMB:100
- maxIndexingThreads:8
- directoryFactory:MMapDirectory
- 自动提交:maxdocs 10000,MAXTIME 15000,opensearcher假
- 缓存(缺省值):
filtercache INITIALSIZE:512尺寸:512 autowarm:0
queryresultcache INITIALSIZE:512尺寸:512 autowarm:0
documentcache INITIALSIZE:512尺寸:512 autowarm:0
我们正在使用的.Net服务(基于Solr.Net)用于更新和插入在单个核心的Solr实例文档。 发送到Solr的文件大小从1 KB高达8MB,我们要发送的文件分批,使用一个或多个线程。 Solr的指数的当前大小约为15GB。
索引服务正在运行约3一4小时完成所有的插入和更新到Solr。 当索引程序运行Tomcat进程的内存使用量持续增长达> 7GB拉姆和不减少,甚至24小时后。 Tomcat的,或刷新核心在Solr管理重新启动后,内存降回1一2 GB RAM。 内存泄漏?
是否有可能配置在Tomcat的Solr的过程中,最大内存使用情况? 是否有其他的选择吗? 最佳做法?
谢谢
您可以设置JVM内存的tomcat设置上。 我通常做这与在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之外来处理文件系统缓存。 所以,千万不要在这种情况下使用的可用内存的50%以上为Tomcat。
我有以下设置(尽管小得多的问题)...... 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
这些帮助,但我遇到使用太多显存的内存不足和Tomcat的问题,即使这样一个小数据集。
这似乎拥有很好的解决方案或事物/配置到目前为止,我还设置如下:
- 禁止除QueryResultCache其他所有缓存
- 不包含文本/在你的查询内容字段仅包括ID
- 不要使用行的大小大于10,不包括突出。
- 如果使用的是高亮(这是最大的罪魁祸首),您可以通过查询该文件标识符第一,然后用突出,并与id字段搜索词包括再次进行查询。
最后,对于内存的问题。 我只好勉强实现一个非正统的方法来解决tomcat的/ Java内存粗加工的问题(如Java从未还给内存的OS)。
我创建了一个与调试权限运行,并调用windows API函数来强制Tomcat进程释放内存的内存州长服务。 我也有一个全球性的互斥体,防止进入到tomcat而发生这种情况时,一个电话用武之地。
令人惊讶的这一做法正在制定好,但不能没有自己的危险,如果你不具备控制访问到Tomcat的选项。
如果你找到一个更好的解决方案/配置更改,请告诉我们。