当前位置:Java -> 在Docker容器中监控和排查Java应用程序

在Docker容器中监控和排查Java应用程序

MoneySuite 是一家提供支付和金融自动化解决方案的金融科技SaaS平台。作为一家受监管的金融服务提供商,我们的应用是运行在Docker容器镜像中的银行级Java微服务。

作为我们服务运营准备工作的一个重要部分,我们对在Docker基础设施中运行的服务进行了全面的性能分析和故障排除,以实现以下目的:

  1. 分析和调整服务性能: Docker容器在有限的系统资源子集内运行。在受限环境内运行的应用程序需要经过细致的性能分析和调整,以确保在受限环境内实现最佳功能。
  2. 调试生产问题: Java服务的Docker镜像需要在实时生产环境中进行监控和故障排除,这与在主机上管理它们相比具有独特的挑战。

本文全面讨论并分享了我们实施的方法,以实现在Docker容器中运行的Java Docker镜像的性能分析和有效故障排除。

容器监控工具

容器服务对企业来说是相对较新的,可用于容器管理的工具非常有限。在本文中,我们将使用 yCrash,这是一款全面的非侵入式工具,具有360°数据捕获和分析功能,用于故障排除容器环境和其中运行的服务。

yCrash服务管理容器应用
yCrash服务管理容器应用

设置yCrash

设置yCrash包括三个简单的步骤:

  1. 注册yCrash。
  2. 安装yCrash代理。
  3. 设置yCrash服务器。

注册yCrash

yCrash提供免费套餐。您可以在他们的网站上注册。

安装 yCrash 服务器

yCrash 服务器是一个提供事故管理报告的 Web 应用程序,有两种变体:

  1. 云服务 — 无需安装的安全托管服务
  2. 企业版 — 一个在现场部署的实例,提供更大的控制力,并符合企业合规要求

注意:在本教程中,我们将使用云服务。

安装 yCrash 代理

yCrash 代理可以全方位地捕获服务和基础设施的视图。它可以通过几个简单的步骤部署。

yCrash 代理可以安装在容器内与应用程序一起,也可以安装在容器外。在此示例中,我们将使用容器内选项。

请参考以下链接处的 yCrash 代理安装指南这里

示例应用程序

可以对运行 Java 服务的任何 Docker 容器进行故障排除。在本博客中,我们使用了 Spring Boot 容器应用程序,这是一个全面的 Spring Boot 容器 API 服务,能够模拟各种性能问题。

您可以从这个 GitHub 仓库查看并运行 Spring Boot Buggy API 服务。

yCrash 是非侵入性的,几乎不会产生额外开销,并具有深入的分析能力。

以 Docker 镜像报告的 YCrash 事故摘要

以 Docker 镜像报告的 YCrash 事故摘要

Java 应用程序:RCA 和性能调优

在容器中运行的Java进程需要性能调优和持续监控,以检查它是否在容器环境下健康运行。诸如YCrash之类的分析工具将详细显示Java应用的健康和性能统计信息。Java应用性能参数包括:

  • 垃圾收集分析:错误配置的GC可能导致应用性能下降和资源使用增加。有必要对GC配置进行深入分析和调优。

YCrash showing GC stats for tuning

YCrash showing GC stats for tuning

  • 线程分析:设计和编码错误可能导致严重的线程问题,如死锁和阻塞线程。需要对线程状态进行深入分析,以分析和修复与性能相关的线程问题。

以下是yCrash工具生成的线程转储分析报告,突出显示了导致死锁的两个线程及其堆栈跟踪。

YCrash highlighting deadlocks issue with detail

YCrash highlighting deadlocks issue with detail

您可以清楚地看到yCrash报告了线程-4线程-5受到死锁的影响。yCrash还报告了线程-4线程-5的堆栈跟踪。通过堆栈跟踪,您可以注意到线程-5获取了CoolObject的锁,它正在等待HotObject的锁。另一方面,线程-1获取了HotObject的锁,它正在等待CoolObject的锁。现在根据这个堆栈跟踪,我们知道导致问题的确切代码行。

  • 堆和内存分析:内存分析是Java应用的关键部分,以避免与内存相关的任何关键性停机,如堆空间不足和堆栈溢出。
  • 日志分析:大多数应用将异常记录到应用日志文件中,有助于分析运行时的Java错误。

资源监控

容器环境中运行的Docker服务需要定期进行健康监控,以进行健康和维护。常见的监控事项包括:

  • 进程管理:服务维护涉及监控在容器机器上运行的进程状态。
  • 网络健康:网络监控以了解由于网络连接引起的缓慢或中断。
  • 资源管理:有必要监控容器的完整资源,如CPU利用率、IO等,这可能会影响容器环境中运行的服务的性能。
  • 磁盘管理:持续监控磁盘空间;磁盘空间不足将导致应用性能下降甚至崩溃。

YCrash showing 360-degree resource view of Docker container

YCrash showing 360-degree resource view of Docker container

持续日志监控和通知

为了持续监控错误或性能下降,容器环境中的日志需要被监控以检测任何异常情况。环境应被彻底监控,并且任何事件应通过通知报告,以进行及时的服务管理操作。

YCrash showing log status highlighting exceptions

YCrash showing log status highlighting exceptions

结论

我们已经看到了在Docker容器环境中监控和管理服务的重要性,以及一个真实示例——像YCrash这样的监控工具,它显示Docker容器的所有细节,用于性能调优、根本原因分析和持续监控。

推荐阅读: 程序员在大连可以把去哪些公司

本文链接: 在Docker容器中监控和排查Java应用程序