solr 面对 mysql 大数据量(1 亿)的时候出现内存溢出

2016-06-08 17:32:57 +08:00
 xfack

最近在使用 solr 进行对 mysql 进行检索,发现当 mysql 数据量超过 5 千万的时候 solr 去增量导入的时候会出现内存溢出这个问题,然后翻了下官方文档,发现官方那边是使用 batchSize="-1"这个参数,但是并没有用.不知道 v2 里有没有大神遇到过这样的问题,并且解决过这样问题的....

机器配置是 32G,给了 solr -Xms=8G -Xmx=16G

6762 次点击
所在节点    问与答
11 条回复
andreby
2016-06-08 19:46:50 +08:00
Mark
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
mko0okmko0
2016-06-08 20:29:34 +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
simonlei
2016-06-08 23:52:20 +08:00
换成 elasticsearch 吧
xfack
2016-06-10 12:54:07 +08:00
@mko0okmko0 参数不知道哪里改…

系统是 debian , jdk 是 1.8 , cpu 核心数是 16 核。
xfack
2016-06-10 12:55:56 +08:00
@simonlei 不行啊…现在这个项目是已经成型的,之前我还没有接手的时候数据量比较小,所以没有遇到这个问题,我接手后数据量就上来了,就出现这个问题了。之前提过说换 es ,数据量太多了,暂时是不会考虑换 es 的,
mko0okmko0
2016-06-10 13:11:49 +08:00
JDK 內有一個工具可以圖形化查看某 JAVA 執行的狀態.例如 CPU/RAM/IO...等.
或是加參數讓他 LOG 出訊息.
然後針對你看到的訊息去優化 JAVA 參數吧.
搜尋" JAVA GC 優化 "
mko0okmko0
2016-06-10 13:11:59 +08:00
JDK 内有一个工具可以图形化查看某 JAVA 执行的状态.例如 CPU/RAM/IO...等.
或是加参数让他 LOG 出讯息.
然后针对你看到的讯息去优化 JAVA 参数吧.
搜寻" JAVA GC 优化 "
xfack
2016-06-13 14:41:24 +08:00
@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
}
}
```

这是我的报错
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 可看图型化.这也要截图.
你没监测没招解决.
mko0okmko0
2016-06-13 18:39:41 +08:00
你先换上我的参数.然后监测 CPU/RAM/IO/xlog/jconsole 以外注意多久后出现错误.
应该会更晚出现错误.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/284435

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX