建立:
我在CentOS 5.7 linux 2.6.32-042stab044.5的码头容器中运行Apache Solr。该服务器是具有4GB专用RAM和2GB“突发” RAM的VPS。
我正在使用以下选项运行Solr(为便于阅读,请使用换行符):
/opt/jre/bin/java -Dsolr.solr.home=/opt/solr/solr
-Xms2048m -Xmx2048m
-Djetty.logs=/var/log/solr
-Djetty.home=/opt/solr
-Djava.io.tmpdir=/tmp
-jar /opt/solr/start.jar
/opt/solr/etc/jetty-logging.xml
/opt/solr/etc/jetty.xml
我的Solr配置使用约500个核心,每个核心使用13MB,总共6.8GB磁盘空间。
问题:
大约每两周solr服务器就会开始缓慢响应。当我检查stderror日志时,我看到很多这样的条目:
Jun 21, 2012 9:36:11 AM org.apache.solr.common.SolrException log
SEVERE: org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@/opt/solr/solr/examplestore/data/index/write.lock
at org.apache.lucene.store.Lock.obtain(Lock.java:84)
at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:1108)
at org.apache.solr.update.SolrIndexWriter.<init>(SolrIndexWriter.java:83)
at org.apache.solr.update.UpdateHandler.createMainIndexWriter(UpdateHandler.java:101)
at org.apache.solr.update.DirectUpdateHandler2.openWriter(DirectUpdateHandler2.java:171)
at org.apache.solr.update.DirectUpdateHandler2.addDoc(DirectUpdateHandler2.java:219)
at org.apache.solr.update.processor.RunUpdateProcessor.processAdd(RunUpdateProcessorFactory.java:61)
at org.apache.solr.update.processor.LogUpdateProcessor.processAdd(LogUpdateProcessorFactory.java:115)
at org.apache.solr.handler.XMLLoader.processUpdate(XMLLoader.java:158)
at org.apache.solr.handler.XMLLoader.load(XMLLoader.java:79)
at org.apache.solr.handler.ContentStreamHandlerBase.handleRequestBody(ContentStreamHandlerBase.java:58)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:129)
at org.apache.solr.core.SolrCore.execute(SolrCore.java:1372)
at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:356)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:252)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
当我检查内存使用情况时,码头进程正在使用3GB,并且
free -m
报告正在使用〜3GB。我当前的解决方法是重新启动码头程序(/etc/init.d/solr restart)。 “锁定获取超时”异常停止,并且性能在另外一两个星期内是合理的。
SolrPerformance Wiki指示这是内存问题,这就是为什么我将内存使用量设置为2GB并在终止进程之前检查内存使用量的原因。但是,我不确定这是否是问题所在,因为还有可用的内存(3GB专用内存为4GB,再加上2GB的“突发” RAM)。
题:
为了防止“锁定获取超时”异常并最终提高Solr设置的稳定性,我不必每2周重新启动一次,该怎么办?
最佳答案
不知道您的应用程序,我不应该发表过多评论...但是,对于该索引大小和处理器内核数量而言,500个内核似乎很高(我怀疑,不超过4个)。
您可以重新加载solr核心,以我的经验,这有助于从某些长期存在的对象中回收内存。 http://wiki.apache.org/solr/CoreAdmin#RELOAD
您实际上注意到日志中的内存不足错误吗?您可以先启用verbosegc,然后将您注意到的错误与详细gc输出相关联。
关于solr - Solr NativeFSLock超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11143129/