应用程序随着时间的推移变慢 - 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 的正常使用比以前更好地调整和嗡嗡声。
这是一个很难解释的问题,对单一、简单的答案不抱希望,但认为值得一试。对什么可能会减慢与 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 的正常使用比以前更好地调整和嗡嗡声。