Performance 将批量数据插入grails应用程序时,性能会呈指数衰减

Performance 将批量数据插入grails应用程序时,性能会呈指数衰减,performance,grails,gorm,bulkinsert,Performance,Grails,Gorm,Bulkinsert,在运行性能测试之前,我们需要为一个包含300万个实体的应用程序植入种子。 应通过应用程序加载300万个实体,以模拟3年的真实数据 我们一次插入1-5000个实体。在开始时,响应时间非常好。但一段时间后,它们呈指数衰减 我们使用at groovy脚本点击URL开始每一轮插入 重新启动应用程序会重置响应时间,即暂时修复问题。 在不重新启动应用程序的情况下重新运行脚本不会产生任何效果。 我们使用以下方法来提高性能 每100次插入后1次清理GORM: def session = sessionFacto

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

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

我们使用at groovy脚本点击URL开始每一轮插入

重新启动应用程序会重置响应时间,即暂时修复问题。 在不重新启动应用程序的情况下重新运行脚本不会产生任何效果。 我们使用以下方法来提高性能 每100次插入后1次清理GORM:

def session = sessionFactory.currentSession
session.flush()
session.clear()
DomainClassGrailsPlugin.PROPERTY_INSTANCE_MAP.get().clear()
GParsPool.withPool {
    (0..<1000).eachParallel {
        def entity = new Entity(...)
        insertionService.insert(entity)
    }
}
泰德·纳莱德的老把戏:

2我们使用GPAR进行并行插入:

def session = sessionFactory.currentSession
session.flush()
session.clear()
DomainClassGrailsPlugin.PROPERTY_INSTANCE_MAP.get().clear()
GParsPool.withPool {
    (0..<1000).eachParallel {
        def entity = new Entity(...)
        insertionService.insert(entity)
    }
}
笔记 在查看日志输出时,我注意到每个实体的处理时间都是相同的,但是系统在每次迭代之间的停顿时间似乎越来越长。 插入的实体的确切数量并不重要,大约为300万个,因此如果某些实体失败,我们可以忽略它。 一次调整实体的数量几乎没有效果。 帮助 我真的希望有人对如何解决这个问题有个好主意

环境 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
暂停会让我觉得是JVM在进行垃圾收集。您是否使用过VisualVM之类的分析器来查看垃圾收集花费了多少时间?通常,这是了解JVM中应用程序发生了什么的最佳方法

此外,如果您试图为应用程序添加种子,那么直接将数据加载到数据库比使用应用程序要好得多。当然是性能方面


根据评论添加答案

暂停会让我觉得是JVM在进行垃圾收集。您是否使用过VisualVM之类的分析器来查看垃圾收集花费了多少时间?此外,如果您试图为应用程序添加种子,那么直接将数据加载到数据库比使用应用程序要好得多。当然是性能方面的。也可能是Hibernate的二级缓存?不清楚您使用的是Hibernate 3还是Hibernate 4轻微的默认配置变化这里还有一些其他提示:疯狂的问题,不使用ui如何?将数据加载到数据库中。我知道这不是一个解决方案,但这对你来说是一个有效的用例吗?@brianjohnsen想知道你是否找到了一个解决方案来分享?我正在经历完全相同的指数级减速&在执行大容量插入时暂停,并且侧面加载到db也不是我们真正的选择。@Sitati我们最终将其侧面加载到db中。这不是我们真正想要的,但已经足够接近了。必须有数据库管理帮助。。。我没有仔细检查,但我们的问题很可能是由我们后来发现的内存泄漏引起的。如果我是你,我肯定会运行som诊断。我们通过单独查看堆转储找到了它。