应用程序随着时间的推移而变慢 - Java + Python

时间:2016-07-19 13:00:54

标签: java python tomcat garbage-collection fedora-commons

这是一个难以解释的问题,并且对单一简单的答案没有希望,但认为它值得一试。对可能会减慢与Java应用程序交互的长Python作业感兴趣。

我们有一个Tomcat实例运行一个相当复杂和强大的webapp,名为Fedora Commons(不要与操作系统的Fedora混淆),用于存储数字对象的软件。此外,我们还有一个python中间件,可以使用Celery执行长时间后台作业。一个特别的工作是摄取400多页的书,其中书的每一页都有一个大的TIFF文件,然后是一些较小的PDF,XML和元数据文件。在10-15分钟的过程中,衍生物是从这些文件创建的,它们被添加到Fedora中的单个对象中。

我们的问题:在摄取一本书的过程中,将文件添加到Java应用程序中的数字对象Fedora Commons非常一致且可预测地减慢速度,但我无法弄清楚如何或为什么。

我认为摄取速度的图表可能有所帮助,也许它掩盖了一些常见的内存管理模式,那些更有经验的Java可能会认识到:

enter image description here

左上图是大TIFF的时间,转换为JP2,然后被摄入Fedora Commons。左下角是非常小的XML文件,没有衍生物,也被摄取。如您所见,它们的曲线减速斜率几乎相同。在右边,这两个过程是一起绘制的。

我一直在互联网上试图了解Java(GC)中的垃圾收集,尝试不同的配置,但对减速没有太大影响。如果它有帮助,这里有一些内存配置,我们将传递给Tomcat(我认为尾端主要是诊断):

JAVA_OPTS='-server -Xms1g -Xmx1g -XX:+UseG1GC -XX:+DisableExplicitGC -XX:SurvivorRatio=10 -XX:TargetSurvivorRatio=90 -verbose:gc -Xloggc:/var/log/tomcat7/ggc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC'

我们正在使用此VM上的12GB RAM。

我意识到可能导致这种行为的因素的数量,是借口,从图表中脱离。但是我们已经使用Fedora Commons和我们的Python中间件很长一段时间了,而且大部分都是成功的。这种速度慢下来你可以设置你的手表只是感觉可疑Java /垃圾收集相关,虽然我也可能是非常错误的。

对于挖掘更多内容的任何帮助或建议表示赞赏!

3 个答案:

答案 0 :(得分:0)

您说您怀疑GC是问题,但您没有显示GC指标。将程序通过分析器,看看GC过载的原因。没有找出原因就很难解决问题。

一旦找到问题所在的位置,您可能需要更改代码而不是仅调整GC设置。

答案 1 :(得分:0)

感谢所有关于GC和Tomcat分析的建议。事实证明,放缓的原因完全在于Fedora Commons构建数字对象的方式。我能够通过创建一个非常简单的数字对象来隔离它,迭代地添加接近零大小的数据流并观察进度。您可以在下图中看到:

graph of adding datastreams

减速曲线几乎相同,这表明它不是我们特定的摄取方法或文件大小。此外,促使我深入研究old forum posts about Fedora Commons,确认单个对象不包含大量数据流。

这些知识如何在数字对象的知识组织背后被混淆,或者特别是你对Fedora的性能打击,这或许很有趣,但这可能是另一个论坛的推荐。

再次感谢所有人的建议 - 如果没有其他的话,Fedora的正常使用会比以前更好地调整和哼唱。

答案 2 :(得分:-1)

好吧,您可能希望明确地开始管理内存,而不是查看模糊的GC设置,因此GC不会对您的执行造成太大影响。