繁体   English   中英

随着时间的流逝,应用程序变慢-Java + Python

[英]Application slows down over time - Java + Python

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

我们有一个Tomcat实例,它运行着一个相当复杂且强大的Web应用程序,称为Fedora Commons (不要与OS的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 /垃圾回收有关,尽管我对此也可能是非常错误的。

感谢您提供更多帮助或建议!

您说您怀疑GC是问题所在,但没有显示任何GC指标。 将您的程序通过事件探查器,查看GC超载的原因。 如果不查明原因,很难解决问题。

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

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

添加数据流图

减速曲线几乎相同,这表明这不是我们特定的摄取方法或文件大小。 此外,促使我回顾有关Fedora Commons的旧论坛帖子,这些帖子确认单个对象并不意味着包含大量数据流。

有趣的是,这些知识如何被数字对象的知识组织背后所迷惑,而不是专门针对Fedora带来的性能影响,但这可能是另一个论坛的麻烦所在。

再次感谢所有人的建议-如果没有其他问题,Fedora的正常使用情况会比以前更好地进行调整,并且嗡嗡作响。

好吧,您可能不希望研究晦涩的GC设置,而是希望显式开始管理内存,因此GC不会对您的执行产生太大影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM