设置: 我在CentOS 5.7 linux 2.6.32-042stab044.5上的Jetty容器中运行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
My 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)
当我检查内存使用情况时,jetty进程使用3GB,而free -m
报告正在使用~3GB。
我目前的解决方法是重启jetty进程(/etc/init.d/solr restart)。 “锁定获得超时”例外停止并且表现在另一周或两周内是合理的。
SolrPerformance wiki表示这是一个内存问题,这就是为什么我将内存使用量设置为2GB并在终止进程之前检查内存使用情况。但是,我不确定这是什么问题,因为有备用的内存(3GB专用的3GB,加上2GB的“爆发”RAM)。
问题: 我该怎么做才能防止“锁定获取超时”异常并最终提高我的Solr设置的稳定性,所以我不必每两周重新启动一次?
答案 0 :(得分:1)
不知道你的应用程序,我不应该评论太多......但是500核心对于索引大小和处理器核心数量来说似乎很高(我怀疑,不超过4)。
您可以重新加载solr内核,根据我的经验,可以帮助从某些长寿命对象中回收内存。 http://wiki.apache.org/solr/CoreAdmin#RELOAD
您是否真的注意到日志中的内存不足错误?您可以从启用verbosegc开始,并将您注意到的错误与详细的gc输出相关联。