【发布时间】:2016-07-19 13:00:53
【问题描述】:
这是一个难以解释的问题,也不希望得到一个简单的答案,但认为值得一试。对可能会减慢与 Java 应用程序交互的长时间 Python 作业的原因感兴趣。
我们有一个 Tomcat 实例,它运行一个相当复杂且强大的 web 应用程序,名为 Fedora Commons(不要与 Fedora 操作系统混淆),这是用于存储数字对象的软件。此外,我们还有一个 python 中间件,它使用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 的 RAM。
我意识到可能导致这种行为的因素有很多,请原谅双关语,超出图表。但是我们与 Fedora Commons 和我们的 Python 中间件合作已经有一段时间了,并且大部分都取得了成功。这种减速你也可以设置你的手表,只是感觉与 Java / 垃圾收集有关,尽管我也可能错了。
感谢任何有关挖掘更多信息的帮助或建议!
【问题讨论】:
-
python部分是通过jython在jvm上运行的吗?还是一个单独的过程?如果是后者,您首先应该确定整个机器的哪个部分变慢了,即它是 java 还是 python 部分。
-
尝试将 Psi-Probe 添加到您的 Fedora Commons Tomcat 实例。通过仅查看作业完成时间,您无法判断 Fedora Commons 安装的哪个组件导致速度下降。问题可能是 Fedora、gSearch、Solr 或 Djatoka。通过添加 Psi-Probe,您将能够在 servlet 级别检查性能并更好地查明问题。 psi-probe.github.io/psi-probe
-
这太好了,谢谢@RickSarvas!我认识到其中许多组件与我们没有使用的 Islandora 密切相关。但是 Psi-Probe 对 Tomcat 来说听起来很笼统,它可能非常有用。感谢您的建议。
标签: java python tomcat garbage-collection fedora-commons