当前位置:Java -> Java 应用程序延迟降低与陷阱

Java 应用程序延迟降低与陷阱

在我的应用开发生涯中,我面对的一个艰难而模糊的问题是改善分布式数据检索应用的延迟。

这是一个容器化的Java应用程序,用于在最大的零售网站之一上展示产品广告。其目的是降低延迟,以便为额外的处理提供空间,尤其是运行和尝试高级机器学习模型,以为客户展示更好的广告。

我使用的技术之一是内存分析,以了解JVM内存使用情况周围的活动。尽管听起来微不足道,但我发现了一些主要障碍,花了一些时间才弄清楚。最终,我能够克服这些障碍,成功将应用程序的p99延迟从400毫秒减少到240毫秒。

延迟降低对我来说是一个新的挑战,所以我需要最佳的工具来解决它。虽然有很多工具可用,包括开源和付费工具,但我发现eclipse内存分析工具MAT是所有免费工具中最有用的。有很多关于如何安装和使用MAT的文章,所以我就不详细介绍了。

在本文中,我将介绍与大型生产应用程序的内存分析相关的挑战以及如何克服这些挑战。

挑战

  1. 大型应用程序的JVM堆内存占用相当大,我的情况下大约为100GB。分析如此大的堆转储需要大量内存来运行分析工具,在常规笔记本上通常运行缓慢。
  2. 大型堆转储占用相等的磁盘空间。如果磁盘空间不足,堆转储命令将失败,或者最坏的情况下,填满根分区并使主机崩溃。
  3. 堆转储是一个暂停应用中所有活动的全局性事件,这可能导致服务的健康检查失败,也可能导致服务被终止,这使得难以获得堆转储文件。

解决方案

  1. 在进行大型堆转储时,最好使用像AWS EC2这样具有足够内存和磁盘空间的云资源。
  2. 为了解决磁盘空间问题,如果应用程序运行在某个云资源上,通常会有单独的存储附加到它上。在进行堆转储之前可以增加单独的存储。
  3. 检查应用程序是否被定期健康检查监视,比如是否属于负载均衡器的一部分。在这种情况下,需要将其从服务中心拿出来,以避免在开始堆转储命令后被终止。
  4. 在一定间隔内获取多个堆转储,以捕获服务状态的变化。

改进

  1. 最大的罪魁祸首之一是内存缓存,导致保留的堆过大,因此导致频繁的垃圾回收影响延迟。
  2. 内存分析为我提供了一个关键线索,即用于数据检索的数据索引的使用情况。结果表明,完整的索引加载在JVM堆中,并且还存储在tmpfs上,因此使用了两倍于所需内存的数量,这是不必要的,也导致频繁的垃圾回收。

结论

对于任何大型生产应用程序来说,分析内存都是至关重要的。

在应用程序中缓存数据可能是有用的,但应该密切监视以检测任何随时间的下降。

堆转储分析是一个强大的工具。如果使用合适的机器和工具进行,它可能会变得痛苦。

在获取堆转储时,要密切关注生产应用程序的健康检查例程,以成功地获取相同的堆

我没有深入细节以保持文章简洁。如果有人想要更多信息,请随时联系我。

推荐阅读: 5.prototype.toString.call检测类型

本文链接: Java 应用程序延迟降低与陷阱