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

Application slows down over time - Java + Python

这是一个很难解释的问题,对单一、简单的答案不抱希望,但认为值得一试。对什么可能会减慢与 Java 应用程序交互的长 Python 作业感兴趣。

我们有一个 Tomcat 运行 的实例,这是一个相当复杂且强大的 Web 应用程序,名为 Fedora Commons (not to be confused with Fedora the OS), software for storing digital objects. Additionally, we have a python middleware that performs long background jobs with Celery。一项特定的工作是摄取一本 400 多页的书,其中每一页都有一个大的 TIFF 文件,然后是一些较小的 PDF、XML 和元数据文件。在 10 到 15 分钟的过程中,从这些文件创建派生文件,并将它们添加到 Fedora 中的单个对象中。

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

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

左上角的图表是大型 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 内存。

我意识到可能导致这种行为的因素数量,请原谅双关语,超出了图表。但是我们使用 Fedora Commons 和我们的 Python 中间件已经有一段时间了,而且大部分都是成功的。这种减慢你也可以设置你的手表只是感觉可疑 Java / 垃圾收集相关,虽然我也可能是非常错误的。

任何有助于深入挖掘的帮助或建议都将不胜感激!

好吧,与其研究晦涩的 GC 设置,不如开始明确地管理内存,这样 GC 就不会对您的执行产生太大影响。

你说你怀疑 GC 是问题所在,但你没有显示 GC 指标。将您的程序放入分析器中,看看 GC 过载的原因。不查明原因很难解决问题

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

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

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

有趣的是,这些知识是如何在数字对象的智能组织背后被混淆的,而不是特别是 Fedora 带来的性能损失,但这可能是另一个论坛的素材。

再次感谢所有的建议 - 如果不出意外,Fedora 的正常使用比以前更好地调整和嗡嗡声。