V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
xfack
V2EX  ›  问与答

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

  •  
  •   xfack · 2016-06-08 17:32:57 +08:00 · 6909 次点击
    这是一个创建于 3088 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    11 条回复    2016-06-13 18:39:41 +08:00
    andreby
        1
    andreby  
       2016-06-08 19:46:50 +08:00 via Android
    Mark
    mko0okmko0
        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
    mko0okmko0
        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
    simonlei
        4
    simonlei  
       2016-06-08 23:52:20 +08:00
    换成 elasticsearch 吧
    xfack
        5
    xfack  
    OP
       2016-06-10 12:54:07 +08:00 via iPhone
    @mko0okmko0 参数不知道哪里改…

    系统是 debian , jdk 是 1.8 , cpu 核心数是 16 核。
    xfack
        6
    xfack  
    OP
       2016-06-10 12:55:56 +08:00 via iPhone
    @simonlei 不行啊…现在这个项目是已经成型的,之前我还没有接手的时候数据量比较小,所以没有遇到这个问题,我接手后数据量就上来了,就出现这个问题了。之前提过说换 es ,数据量太多了,暂时是不会考虑换 es 的,
    mko0okmko0
        7
    mko0okmko0  
       2016-06-10 13:11:49 +08:00
    JDK 內有一個工具可以圖形化查看某 JAVA 執行的狀態.例如 CPU/RAM/IO...等.
    或是加參數讓他 LOG 出訊息.
    然後針對你看到的訊息去優化 JAVA 參數吧.
    搜尋" JAVA GC 優化 "
    mko0okmko0
        8
    mko0okmko0  
       2016-06-10 13:11:59 +08:00
    JDK 内有一个工具可以图形化查看某 JAVA 执行的状态.例如 CPU/RAM/IO...等.
    或是加参数让他 LOG 出讯息.
    然后针对你看到的讯息去优化 JAVA 参数吧.
    搜寻" JAVA GC 优化 "
    xfack
        9
    xfack  
    OP
       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
        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 可看图型化.这也要截图.
    你没监测没招解决.
    mko0okmko0
        11
    mko0okmko0  
       2016-06-13 18:39:41 +08:00
    你先换上我的参数.然后监测 CPU/RAM/IO/xlog/jconsole 以外注意多久后出现错误.
    应该会更晚出现错误.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1370 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:39 · PVG 01:39 · LAX 09:39 · JFK 12:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.