这是一个难以解释的问题,也不希望有一个简单的答案,但认为值得一试。对可能会减慢与 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'
我们正在12GB
此 VM 上使用 RAM。
我意识到可能导致这种行为的因素有很多,请原谅双关语,超出图表。但是我们与 Fedora Commons 和我们的 Python 中间件合作已经有一段时间了,并且大部分都取得了成功。这种减速你也可以设置你的手表,只是感觉与 Java / 垃圾收集有关,尽管我也可能错了。
任何有关挖掘更多信息的帮助或建议都将不胜感激!