3

设置: 我在 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 服务器大约每 2 周开始响应缓慢。当我检查 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 周重新启动一次?

4

1 回答 1

1

不了解您的应用程序,我不应该发表太多评论...但是对于该索引大小和处理器内核数量(我怀疑,不超过 4 个)而言,500 个内核似乎很高。

您可以重新加载 solr 核心,根据我的经验,它有助于从某些长期存在的对象中回收内存。 http://wiki.apache.org/solr/CoreAdmin#RELOAD

您真的注意到日志中的内存不足错误吗?您可以从启用 verbosegc 开始,并将您注意到的错误与详细 gc 输出相关联。

于 2012-06-22T01:33:07.933 回答