2012-08-26 3 views
6

Sto facendo un test di carico per la mia applicazione Solr. L'indice ha più di 200 milioni di documenti. Uso il server Jetty predefinito e configuro la memoria JVM massima come 4 GB. Per testare la mia app, compongo 5000 query di testo e le invio a Solr una per una. Tuttavia, dopo circa 110 query, il contenitore Jetty genera un'eccezione.Perché questo accade sempre? Solr OutOfMemoryError Limite di overhead GC superato

Perché succede? Come posso risolverlo?

SEVERE: java.lang.OutOfMemoryError: GC overhead limit exceeded 
    at org.apache.lucene.util.AttributeImpl.clone(AttributeImpl.java:196) 
    at org.apache.lucene.util.AttributeSource$State.clone(AttributeSource.java:116) 
    at org.apache.lucene.util.AttributeSource$State.clone(AttributeSource.java:119) 
    at org.apache.lucene.util.AttributeSource.captureState(AttributeSource.java:349) 
    at org.apache.solr.highlight.TokenOrderingFilter.incrementToken(DefaultSolrHighlighter.java:595) 
    at org.apache.lucene.search.highlight.OffsetLimitTokenFilter.incrementToken(OffsetLimitTokenFilter.java:43) 
    at org.apache.lucene.analysis.CachingTokenFilter.fillCache(CachingTokenFilter.java:78) 
    at org.apache.lucene.analysis.CachingTokenFilter.incrementToken(CachingTokenFilter.java:50) 
    at org.apache.lucene.search.highlight.Highlighter.getBestTextFragments(Highlighter.java:225) 
    at org.apache.solr.highlight.DefaultSolrHighlighter.doHighlightingByHighlighter(DefaultSolrHighlighter.java:468) 
    at org.apache.solr.highlight.DefaultSolrHighlighter.doHighlighting(DefaultSolrHighlighter.java:379) 
    at org.apache.solr.handler.component.HighlightComponent.process(HighlightComponent.java:116) 
    at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:194) 
    at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:129) 
    at org.apache.solr.core.SolrCore.execute(SolrCore.java:1368) 
    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.headerComplete(HttpConnection.java:928) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
+0

Avete una versione java a 64 bit e una a 64 bit? –

+0

Prova ad aumentare lo stack JVM usando '-Xss4m'. –

+1

Ho appena capito. È stato causato dalla cache di Lucene di basso livello. Disabilito quel codice. Quindi funziona. (anche se un po 'lento) – Xiao

risposta

1

Ovviamente 4 GB di RAM è molto basso per gestire il test di carico su indice 200M. Abbiamo eseguito test delle prestazioni per Solr 4.2 su documenti 300M con dimensioni medie del documento di 1K. L'obiettivo era calcolare una configurazione minima della macchina su cui possiamo avere un tempo di risposta stabile < 3 secondi per le query senza sfaccettature. Per 100 query simultanee il nostro risultato ha mostrato che la configurazione minima della macchina era di 8 core CPU/15 GB di RAM. Ovviamente i risultati variano a seconda di molti fattori, tuttavia è possibile utilizzarlo come regola empirica per il dimensionamento della propria macchina.