将批量数据插入grails app时,性能会呈指数衰减

时间:2014-10-17 09:59:23

标签: performance grails gorm bulkinsert

我们需要在运行性能测试之前为300万个实体播种应用程序。 应通过应用程序加载300万个实体,以模拟3年的实际数据。

我们一次插入1-5000个实体。在开始时响应时间非常好。但过了一会儿,它们呈指数衰减。

我们在groovy脚本中使用URL来启动每一轮插入。

  1. 重新启动应用程序会重置响应时间 - 即暂时解决问题。
  2. 在不重新启动应用程序的情况下重新运行脚本无效。
  3. 我们使用以下内容来提高性能

    1)每100次插入后清理GORM:

    def session = sessionFactory.currentSession
    session.flush()
    session.clear()
    DomainClassGrailsPlugin.PROPERTY_INSTANCE_MAP.get().clear()
    

    (老Ted Naleid技巧:http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql

    2)我们使用GPars进行并行插入:

    GParsPool.withPool {
        (0..<1000).eachParallel {
            def entity = new Entity(...)
            insertionService.insert(entity)
        }
    }
    

    注释

    • 在查看日志输出时,我注意到每个实体的处理时间是相同的,但系统似乎在每次迭代之间停留的时间越来越长。
    • 插入的实体的确切数量并不重要,只有3个左右,所以如果有些失败,我们可以忽略它。
    • 一次调整实体数量几乎没有影响。

    帮助

    我真的希望有人对如何解决问题有个好主意。

    环境

    • Grails:2.4.2(GRAILS_OPTS = -Xmx2G -Xms512m -XX:MaxPermSize = 512m)
    • Java:1.7.0_55
    • MBP:OS X 10.9.5(2,6 GHz Intel Core i7,16 GB 1600 MHz DDR3)

1 个答案:

答案 0 :(得分:0)

暂停会让我觉得JVM正在进行垃圾收集。您是否使用过VisualVM等分析器来查看垃圾收集的时间?通常,这将是了解JVM中应用程序发生情况的最佳方法。

此外,将数据直接加载到数据库中,而不是使用您的应用程序,如果您正在尝试种子&#34;应用程序。当然是表现明智。

(根据评论添加为答案)