关于人工智能:案例分享在生产中持续使用Amazon-CodeGuru-Profiler进行程序优化

8次阅读

共计 2818 个字符,预计需要花费 8 分钟才能阅读完成。

本文由 Atlassian 高级软件工程师 Behrooz Nobakht、工程技术经理 Matthew Ponsford 以及高级软件工程师 Narayanaswamy Anandapadmanabhan 联手撰写。

寰球范畴内,有成千上万的团队正在应用 Atlassian 公司的 Jira 云性能团队所开发的 Jira 及 Trello 等工具。该团队致力于为用户发明杰出的产品、实际与凋谢的工作成绩。Jira 云性能团队是一个专项工作组,致力于让 Jira 与 Atlassian 团队可能更好地理解、监控并加强自有产品及服务的性能体现。

背景介绍

Atlasian 目前构建的产品有数百名开发人员负责进行开发,这些产品包含单体应用程序和微服务程序。当呈现突发事件时,因为代码库中的代码变更很频繁,这样很难对问题进行疾速根因诊断。

通过代码分析能够显著放慢根因诊断,代码分析是辨认应用程序中的运行时问题和提早问题的无效技术。如果不采纳代码分析,通常须要自定义代码和长期提早检测,这种形式容易出错而且会引起其余副作用。Atlassian 始终有工具用于分析生产中的服务,例如应用 Linux perf) 或 async-profiler,尽管这些工具十分有价值,但他们的办法仍有一些限度:

  • 须要人员(或零碎)的干涉,能力在正确的工夫捕捉配置文件,这意味着常常错过一些暂时性问题
  • 长期分析,无奈提供要与之前比拟的基线信息
  • 出于安全性和可靠性的思考,在生产环境中运行这些工具的状况并不多

这些限度促使 Atlassian 钻研继续分析(Continuous profiling)。除了帮忙诊断服务破费的 CPU 周期(或工夫)外,他们还心愿找到一种剖析解决方案,提供火焰图等可视化成果,这些可视化成果对于后续问题诊断有很大的帮忙,比方能够更快地通过调用门路了解简单动静应用程序的调用关系,还能够用于帮忙开发人员理解零碎。

Atlassian 现有的外部分析的解决方案由与服务一起部署的脚本形成,这些脚本能够应用 Linux perf 或 async-profiler 生成分析报告。一部分有权限的开发人员(和 SRE)能够应用 AWS System Manager 在生产节点上运行这些脚本。Atlassian 应用 Linux perf 和 async-profiler 具备以下几个长处:

  • 能够可视化为火焰图(易于解释)的格局数据
  • 剖析单个过程或整个节点的能力
  • 跨不同维度(如 CPU、内存和 I /O)进行剖析

Atlassian 最后的间断分析解决方案包含定期运行 async-profiler(或 Linux perf)的预约作业,将原始后果发送给一个微服务,该微服务用于将数据转换为列式数据(Parquet),而后将后果写入 Amazon 简略存储服务(Amazon S3)中。而后在 AWS Glue 中定义了一个架构(Schema),容许开发人员应用 Amazon Athena 查问特定服务的性能分析数据。Athena 使开发人员可能通过编写简单的 SQL 查问的形式,筛选肯定工夫范畴内和堆栈帧等维度上的性能分析数据。Atlassian 还构建了一个 UI 来运行 Athena 查问,并应用 SpeedScope 将后果可视化为火焰图。

即便曾经为这个解决方案付出了致力,然而仍有大量工作要做,以构建最佳解决方案。同时,Amazon CodeGuru Profiler 的公布引起了 Atlassian 的留神。该服务产品与需要高度相干,并且在很大水平上与现有的能力重叠。通过深刻的评估后,Atlassian 最终决定进行构建本人的解决方案,转而集成 CodeGuru Profiler。为此,他们抉择为每个较小的服务定义一个剖析组(profiling group)。对于较大的服务,将其被划分为多个分片(每个分片都有独自的主动缩放组),而后为每个分片创立一个剖析组。

大家能够通过两种可用模式集成 Java Profiler:代理模式和代码模式。为了可能与现有的性能分析性能集成,同时更好的管制代理,Atlassian 决定应用代码模式,从利用程序代码中启动代理。这使他们可能通过现有的性能标记机制管制何时启动(或进行)代理。至此,Atlassian 在平台级别集成了 CodeGuru 探查器,使任何 Atlassian 服务团队都可能轻松利用此性能。

检查和提早

Atlassian 应用 CodeGuru Profiler 的第一种场景是辨认代码调用门路,这些代码调用门路能够直观的看到 CPU 利用率或提早方面的问题。在采集的性能数据中查找不同的模式的同步调用,一个乏味的事件是由 Collections.synchronizedMap 形成的 EnumMap 类。以下截图显示此局部代码在 24 小时中的堆栈帧线程状态监控。

只管所波及的堆栈跟踪耗费的运行工夫不到 0.5%,但当进一步察看线程状态的提早时,能够看到它在 BLOCKED 状态下破费的工夫是 RUNNABLE 状态的两倍。为了减少在 RUNABLE 状态下破费的工夫比例,咱们从应用 EnumMap 转向应用 ConcurrentHashMap 的实例。提醒:如果大量线程处于 BLOCKED,阐明 CPU 始终在期待一些资源的开释能力持续解决,这样造成了 CPU 的节约,比方 EnumMap 由 Collections.synchronizedMap 形成,它是通过同步的形式实现的,这样会产生大量的锁从而引起线程的 BLOCKED。这里咱们将其替换为 ConcurrentHashMap 类来实现,ConcurrentHashMap 是通过分段式锁来实现的,相较于 Collections.synchronizedMap 更高效。

上面的截图显示了相似的 24 小时内的性能数据。实现更改后,相干的堆栈跟踪当初全副处于 RUNABLE 状态。

倡议报告

CodeGuru Profiler 还为每个剖析组提供了相干的倡议报告,从性能角度辨认常见的反模式(anti-patterns),并给出已知的倡议解决方案。咱们收到的一份这样的报告(见上面的截图)强调了咱们如何应用 JacksonObjectMapper。

收到此报告后,咱们可能疾速的辨认问题,并对代码问题进行解决。

论断

通过与 CodeGuru Profiler 的集成,对咱们来说是向前迈出的重要一步,使 Atlassian 外部的每个开发人员都具备了发现和解决利用性能问题的能力。自启用 CodeGuru Profuler 以来,咱们已取得以下收益:

  • 任何 Atlasian 开发人员都能够从任何工夫点查找性能情况,从而疾速的理解生产中进行的调用门路,以便剖析和发现线上的问题。这有助于开发人员理解简单的应用程序,并在考察性能问题时帮忙咱们。
  • 大大减少了诊断生产中性能问题的工夫,同时咱们的开发人员在诊断问题时不再须要注入自定义检测代码。
  • 整个组织中性能监测数据的凋谢,有助于进步开发人员自行处理性能优化的主动性。

咱们对 CodeGuru Profiler 团队构建的性能感到兴奋,并期待他们接下来将构建的探查技术和性能。

正文完
 0