最近在使用 solr 进行对 mysql 进行检索,发现当 mysql 数据量超过 5 千万的时候 solr 去增量导入的时候会出现内存溢出这个问题,然后翻了下官方文档,发现官方那边是使用 batchSize="-1"这个参数,但是并没有用.不知道 v2 里有没有大神遇到过这样的问题,并且解决过这样问题的....
机器配置是 32G,给了 solr -Xms=8G -Xmx=16G
1
andreby 2016-06-08 19:46:50 +08:00 via Android
Mark
|
2
mko0okmko0 2016-06-08 20:29:22 +08:00
系統是?JDK 版本是?CPU 核心總數量是?
先給你一個我通用的 JAVA 參數 -Xms2m -Xmx30g -Xss512k -XX:+AggressiveOpts -XX:MaxHeapFreeRatio=20 -XX:MinHeapFreeRatio=15 -XX:MaxGCPauseMillis=200 -XX:GCTimeRatio=1 -XX:+ScavengeBeforeFullGC -XX:+BindGCTaskThreadsToCPUs -XX:+DoEscapeAnalysis -XX:+EliminateLocks -XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0 -XX:+UseFastAccessorMethods -XX:+UseFastEmptyMethods -XX:+UseFastJNIAccessors -XX:+OptimizeStringConcat -XX:UseAVX=2 -XX:UseSSE=5 -XX:+UseSSE42Intrinsics -XX:+UseTLAB -XX:+ResizeTLAB -XX:+UseAdaptiveGCBoundary -XX:+UseAdaptiveSizePolicy -XX:+TieredCompilation -XX:CompileThreshold=8000 -XX:+BackgroundCompilation -XX:+UseG1GC -XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=0 意義: https://www.v2ex.com/t/235137 |
3
mko0okmko0 2016-06-08 20:29:34 +08:00 1
系统是?JDK 版本是?CPU 核心总数量是?
先给你一个我通用的 JAVA 参数 -Xms2m -Xmx30g -Xss512k -XX:+AggressiveOpts -XX:MaxHeapFreeRatio=20 -XX:MinHeapFreeRatio=15 -XX:MaxGCPauseMillis=200 -XX:GCTimeRatio=1 -XX:+ScavengeBeforeFullGC -XX:+BindGCTaskThreadsToCPUs -XX:+DoEscapeAnalysis -XX:+EliminateLocks -XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0 -XX:+UseFastAccessorMethods -XX:+UseFastEmptyMethods -XX:+UseFastJNIAccessors -XX:+OptimizeStringConcat -XX:UseAVX=2 -XX:UseSSE=5 -XX:+UseSSE42Intrinsics -XX:+UseTLAB -XX:+ResizeTLAB -XX:+UseAdaptiveGCBoundary -XX:+UseAdaptiveSizePolicy -XX:+TieredCompilation -XX:CompileThreshold=8000 -XX:+BackgroundCompilation -XX:+UseG1GC -XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=0 意义: https://www.v2ex.com/t/235137 |
4
simonlei 2016-06-08 23:52:20 +08:00
换成 elasticsearch 吧
|
5
xfack OP |
6
xfack OP @simonlei 不行啊…现在这个项目是已经成型的,之前我还没有接手的时候数据量比较小,所以没有遇到这个问题,我接手后数据量就上来了,就出现这个问题了。之前提过说换 es ,数据量太多了,暂时是不会考虑换 es 的,
|
7
mko0okmko0 2016-06-10 13:11:49 +08:00
JDK 內有一個工具可以圖形化查看某 JAVA 執行的狀態.例如 CPU/RAM/IO...等.
或是加參數讓他 LOG 出訊息. 然後針對你看到的訊息去優化 JAVA 參數吧. 搜尋" JAVA GC 優化 " |
8
mko0okmko0 2016-06-10 13:11:59 +08:00
JDK 内有一个工具可以图形化查看某 JAVA 执行的状态.例如 CPU/RAM/IO...等.
或是加参数让他 LOG 出讯息. 然后针对你看到的讯息去优化 JAVA 参数吧. 搜寻" JAVA GC 优化 " |
9
xfack OP @mko0okmko0
``` { "error": { "msg": "java.lang.OutOfMemoryError: Java heap space", "trace": "java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space tat org.apache.solr.servlet.HttpSolrCall.sendError(HttpSolrCall.java:604) tat org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:473) tat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:225) tat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:183) tat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) tat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) tat org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) tat org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) tat org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) tat org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) tat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) tat org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) tat org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) tat org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110) tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) tat org.eclipse.jetty.server.Server.handle(Server.java:499) tat org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) tat org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) tat org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) tat org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) tat org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) tat java.lang.Thread.run(Unknown Source) Caused by: java.lang.OutOfMemoryError: Java heap space tat java.util.HashMap.resize(Unknown Source) tat java.util.HashMap.putVal(Unknown Source) tat java.util.HashMap.put(Unknown Source) tat org.apache.solr.handler.dataimport.DocBuilder.collectDelta(DocBuilder.java:812) tat org.apache.solr.handler.dataimport.DocBuilder.doDelta(DocBuilder.java:344) tat org.apache.solr.handler.dataimport.DocBuilder.execute(DocBuilder.java:224) tat org.apache.solr.handler.dataimport.DataImporter.doDeltaImport(DataImporter.java:444) tat org.apache.solr.handler.dataimport.DataImporter.runCmd(DataImporter.java:482) tat org.apache.solr.handler.dataimport.DataImportHandler.handleRequestBody(DataImportHandler.java:186) tat org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:155) tat org.apache.solr.core.SolrCore.execute(SolrCore.java:2082) tat org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:670) tat org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:458) tat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:225) tat org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:183) tat org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) tat org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) tat org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) tat org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) tat org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) tat org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) tat org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) tat org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) tat org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) tat org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) tat org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110) tat org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) tat org.eclipse.jetty.server.Server.handle(Server.java:499) tat org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) tat org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) tat org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) ", "code": 500 } } ``` 这是我的报错 |
10
mko0okmko0 2016-06-13 18:34:23 +08:00
"java.lang.OutOfMemoryError: Java heap space"说明了一切.
但你还是需要监察该 JAVA 程式的 CPU/IO/RAM 用量. 最好每秒监测跟 java 的 xlog 都要. 可找"jdk log GC"来开启 log.每秒监测可用 top(linux)或是 proccess hacker(windows). jconsole 可看图型化.这也要截图. 你没监测没招解决. |
11
mko0okmko0 2016-06-13 18:39:41 +08:00
你先换上我的参数.然后监测 CPU/RAM/IO/xlog/jconsole 以外注意多久后出现错误.
应该会更晚出现错误. |