使用CodeGuru审查GenAI应用程序性能
关键字: [yt, Amazon CodeGuru, Application Performance Optimization, Code Quality Improvement, Automated Code Review, Performance Profiling Recommendations, Actionable Insights]
本文字数: 2500, 阅读完需: 12 分钟
导读
在一场亚马逊云科技网络研讨会上,演讲者们阐释了”利用 CodeGuru 审视 GenAI 应用程序性能”。演示过程中,他们探讨了 Amazon CodeGuru(一种机器学习服务)如何助力开发人员提升代码质量和应用程序性能。具体而言,CodeGuru Reviewer 提供自动代码审查,并就缺陷提出修复建议;而 CodeGuru Profiler 则能识别性能瓶颈,为正在运行的应用程序提供优化建议。该演示重点介绍了 CodeGuru 如何实现代码问题的早期发现、最佳实践的遵循、性能瓶颈的识别、应用程序性能的可视化以及专业知识的获取,从而最终提高代码质量、减少延迟并优化成本。
演讲精华
以下是小编为您整理的本次演讲的精华,共2200字,阅读时间大约是11分钟。
在软件开发不断演进的领域中,应用程序变得越来越复杂和分布式,确保优化代码质量和应用程序性能已成为当务之急。亚马逊云科技(亚马逊云科技)认识到了这些挑战,并推出了Amazon CodeGuru,这是一项基于机器学习的服务,旨在彻底改变开发人员进行代码审查和性能优化的方式。
故事从亚马逊云科技ML经理欢迎与会者参加关于Amazon CodeGuru的网络研讨会开始。他解释说,CodeGuru是一项服务,通过可操作的建议,使开发人员能够提高代码质量、增强应用程序性能并减少服务器集群规模。该经理强调,本次网络研讨会旨在深入探讨CodeGuru的细节,揭示它提供的建议类型、所提供的可视化效果、其内部工作原理以及入门流程。
为了说明开发人员所面临的挑战,该经理介绍了Lynn这个虚构的Java技术主管人物,她在一家电子商务公司工作,负责监督核心后端服务,如高流量电子商务网站的搜索、订单和运输服务。Lynn的团队面临两个重大挑战:在生产环境中出现数据损坏问题,这是由数据竞争造成的,一名开发人员在四个小时的调查后发现了这个问题;以及网站延迟不断增加,一名当值开发人员建议通过增加服务器集群规模来缓解这一问题,尽管Lynn对此持怀疑态度,因为他们最近增加了集群规模,但流量并没有相应增加。
该经理深入探讨了Lynn和她团队所遵循的标准软件开发生命周期,坚持既定的做法,如编写和审查代码、构建和测试、部署、监控生产环境,并根据洞见进行改进。他们利用工具和流程,如代码审查、CI/CD工具、运营指标仪表板和警报。
Amazon CodeGuru 提供了两项服务:CodeGuru Reviewer 和 CodeGuru Profiler。CodeGuru Reviewer 能够自动检查代码,识别其中的缺陷,而 CodeGuru Profiler 则有助于在运行的应用程序中发现最有潜力的优化方法。优化这些应用程序可以显著提升速度、降低延迟并节省成本。
接下来,Shrinivasan 深入探讨了 Amazon CodeGuru Reviewer 的细节。该服务为 Java 应用程序提供自动代码审查评论,并与 GitHub 和 Amazon CodeCommit 存储库集成,利用了广为采用的基于拉取请求的代码审查工作流程。
施里尼瓦桑承认代码审查存在诸多挑战,包括缺乏专业知识以确保可用性、合规性和正确性,需要有经验的人才(可能有限)、软件涵盖多个功能领域(如亚马逊云科技服务和并发性)、人工代码审查通常关注业务逻辑而非功能正确性,以及源代码库数量和规模不断增加需要更多上下文。
CodeGuru Reviewer旨在解决这些挑战,它可以标记源代码中的关键缺陷和可靠性问题,无缝集成到基于拉取请求的工作流程中,并辅助人工代码审查而非完全取代。
CodeGuru Reviewer涉及的代码领域多样且全面:
- 亚马逊云科技最佳实践:确保正确使用亚马逊云科技API,包括等待器和分页等功能,如果使用不当可能导致性能或正确性问题。
- 并发性:识别与缺少或过度同步相关的问题,这可能分别导致正确性问题(如陈旧或不正确的结果)或性能问题。施里尼瓦桑指出,资源泄漏和并发性问题通常无法被单元测试发现,并且往往会渗透到生产环境中,在后期造成意外。
- 资源泄漏:正确处理数据库连接、套接字、文件、Web连接等资源,防止应用程序速度变慢和可用性问题。
- 敏感信息泄露:识别姓名、电子邮件和信用卡等敏感信息的泄露,这是一个专门的领域,团队可能缺乏专业知识,而不正确处理敏感信息可能导致合规性问题。
- 其他代码缺陷:通过挖掘代码语料库识别,涵盖亚马逊云科技最佳实践(例如,为每个Lambda调用创建客户端,可以优化为在每个Lambda中只创建一次,提高代码质量)等领域。
施里尼瓦桑概述了CodeGuru Reviewer的工作流程,首先是存储库管理员将代码存储库与CodeGuru Reviewer关联(一次性操作)。当开发人员创建拉取请求时,CodeGuru Reviewer会收到通知,克隆代码、分析它,并以拉取请求评论的形式提供建议。开发人员可以对这些建议提供反馈,有助于持续改进CodeGuru Reviewer。
在幕后,当提出一个拉取请求时,代码会被克隆,并创建一个捕获数据流和控制流方面的程序表示。这种表示被输入到机器学习模型中,这些模型是在亚马逊的代码库和数十万个来自亚马逊代码库的软件包以及数万个来自GitHub的软件包上进行训练的。随后,这些模型提供建议,作为代码审查意见传递给开发人员。
接下来,亚马逊云科技的产品经理Daniela Swattkova登台,介绍了专注于提高正在运行的应用程序性能的Amazon CodeGuru Profiler。
Daniela首先强调了应用程序性能不佳带来的挑战,包括对业务的影响(缓慢的在线服务导致客户体验差劲和潜在客户/销售损失)、资源利用率低下(平均CPU利用率的微小变化对于大型机群可能会产生重大成本影响)以及关键任务系统(即使10毫秒的小延迟也可能导致系统故障或重大业务影响,例如在铁路控制系统或金融交易系统中,可能会造成数百万美元的损失)。
导致这些挑战的因素包括:分布式服务和云计算平台提高了可扩展性和可靠性,但使发现性能问题变得更加困难;现有工具提供了难以理解的原始信息和可视化,导致开发人员只能猜测解决方案;性能工程专业知识匮乏,尽管应用程序开发数量和编写的代码行数激增,但性能工程师的数量在过去几十年中却没有跟上软件工程师的增长。
CodeGuru Profiler弥补了这一专业知识差距,它可以找到实时应用程序中最昂贵的代码行,并提供可操作的指导方针来修复它们。它在亚马逊多年的性能工程专业知识上进行了训练,并提供了丰富的交互式可视化,展示应用程序在CPU上的运行情况。Daniela强调,虽然Reviewer关注静态代码,但Profiler关注运行时应用程序,了解它的性能、运行和行为方式。
CodeGuru Profiler的主要特性包括:
- 发现运行时间过长、导致高延迟、低吞吐量或占用过多CPU的方法,这些方法具有优化性能的高潜力。
- 基于亚马逊的专业知识和经验教训,CodeGuru Profiler提供可操作的指导方针来修复代码。
- 它提供丰富的交互式可视化,显示应用程序在CPU上的运行情况,展示聚合的代码路径及其方法和占用CPU的百分比。
- 针对生产系统构建,开销低(约1%),支持持续分析,可在生产环境中运行而对性能几乎没有影响。
- 最初支持Java应用程序,未来将支持更多语言。
接入CodeGuru Profiler是一个简单的过程,包括四个步骤:
- 为要分析的应用程序创建分析组。
- 更新代理使用的IAM角色。
- 配置构建以包含CodeGuru Profiler代理。
- 在应用程序中启动分析线程。
演示人员解释说,第一次运行Profiler时,需要大约10分钟获得第一个分析结果,24小时后会得到初始的建议报告,之后每5分钟和每天会分别提供更新。
可视化效果称为火焰图,提供了给定时间段内观察到的所有堆栈跟踪的聚合视图,每个方法都表示为一个水平条或”框架”。框架越宽,表示占用CPU时间越长或导致的延迟越高,悬停在框架上时会显示百分比。例如,在演示应用程序中,用于调整图像亮度的方法显示为最耗费CPU的操作之一,耗时过长。
垂直轴显示了父方法和子方法之间的层次关系,类似于堆栈跟踪。演示人员解释了”概览”和”热点”视图之间的区别,“概览”视图显示主要入口点和操作,“热点”视图则提供了应用程序的”细节”,显示了主要消耗CPU时间的贡献方法。
丹妮拉强调了理解两个时间概念的重要性:CPU时间(方法在CPU上主动运行的时间)和墙上时钟时间(操作的延迟,无论它是否在CPU上运行)。可视化提供了对线程状态的洞见,使用颜色编码来识别应用程序或方法何时处于等待或阻塞状态,这对于排查延迟问题至关重要。在演示中,一个将图像上传到S3存储桶的方法显示占用了2.08%的墙上时钟时间,但只占用了1.59%的CPU时间,突出了两种视图的重要性。
除了可视化之外,CodeGuru Profiler还提供了自动化的建议报告,可以根据开发人员可能无意中引入的常见问题来识别性能问题。在演示应用程序中,识别出了两个问题:使用SimpleDateFormat解析日期花费了太多时间(占活动CPU时间近30%),以及检查枚举中不存在的值(占活动CPU时间近13%)。
丹妮拉演示了如何根据Profiler的建议来修复这些问题,展示了在实施建议的更改后的性能改进。对于SimpleDateFormat问题,建议在创建SimpleDateFormat实例时将默认符号实例传递给构造函数,将CPU时间从30%降低到不到10%。对于枚举问题,建议使用Guava的EnumGetIfPresent方法或静态HashMap,将CPU时间从27%降低到不到0.5%。
丹妮拉强调了使用可视化和建议报告的重要性,因为可视化为开发人员提供了丰富的信息,以识别任何意外或意外行为,而建议报告则通过突出显示常见的性能问题来提供低挂果实。
丹妮拉随后提供了有关CodeGuru Profiler在幕后工作原理的见解。当应用程序在多个实例(如容器或EC2实例)上运行时,每个实例都会运行一个分析线程,该线程会持续捕获堆栈跟踪并对其进行整理,每5分钟将数据发送回后端。Profiler后端会聚合这些数据,在其上运行性能模型,如果检测到性能问题,就会创建可操作的建议,同时始终提供交互式可视化。
为了阐明 CodeGuru Profiler 在现实世界中的影响,Daniela 分享了亚马逊的两个成功案例:
- 一位名为 Chris 的软件开发工程师曾面临一个导致 CPU 开销高达 56% 的性能问题。在 Profiler 的建议下,通过消除线程争用,Chris 能够在处理相同流量的情况下将实例数量减少 75%,单个主机的服务能力比之前提高了 7 倍。
- 另一位工程师 Rajesh 在部署代码变更之前使用 Profiler 进行了性能测试。可视化结果显示存在不必要的值克隆,在遵循 Profiler 的建议移除这些克隆后,Rajesh 观察到 CPU 利用率大幅降低,从而能够将机群规模缩减 40% 至 67%。
最后,Daniela 鼓励与会者上手使用 CodeGuru Profiler,并提供了入门资源,包括演示中使用的示例应用程序,该应用程序可在 GitHub 上获取。
总的来说,Amazon CodeGuru 凭借其强大的功能,解决了开发人员在确保代码质量和应用程序性能方面所面临的挑战。 通过 CodeGuru Reviewer 和 CodeGuru Profiler 两个组件,开发人员可以利用自动化代码审查、性能分析和基于亚马逊数十年专业经验的可操作建议。CodeGuru 无缝集成到软件开发生命周期中,并提供丰富的可视化,从而使开发人员能够优化应用程序、减少延迟、降低基础设施成本,最终为客户提供卓越的体验。
总结
在这场网络研讨会中,主讲人介绍了Amazon CodeGuru,这是一项利用机器学习帮助开发人员提高代码质量和应用程序性能的服务。CodeGuru由两个组件组成:CodeGuru Reviewer和CodeGuru Profiler。
CodeGuru Reviewer提供自动代码审查和可操作的建议,以修复源代码中的缺陷和可靠性问题。它与基于拉取请求的工作流程无缝集成,并支持诸如亚马逊云科技最佳实践、并发性、资源泄漏和敏感信息泄漏等领域。Reviewer利用在亚马逊代码库和开源仓库上训练的机器学习模型来识别问题并提出修复建议。
另一方面,CodeGuru Profiler有助于识别和优化正在运行的应用程序中代价高昂的代码行。它持续分析应用程序的性能,即使在生产环境中也开销很低。Profiler提供丰富的可视化效果,如火焰图,以了解应用程序花费大部分时间的位置。它还生成自动化的建议报告,其中包含解决性能问题的可操作步骤。
主讲人演示了如何轻松地将CodeGuru Reviewer和Profiler集成到软件开发生命周期中,使开发人员能够及早发现缺陷、遵循最佳实践并优化应用程序性能。他们展示了CodeGuru如何帮助亚马逊团队提高代码质量、减少延迟和降低基础设施成本的真实案例。
总的来说,Amazon CodeGuru旨在为开发人员提供虚拟性能专家和出色工程师,帮助他们编写更好的代码并交付高性能应用程序,而无需专门的专业知识。通过利用亚马逊数十年的经验,并不断从用户反馈中学习,CodeGuru不断发展,提供越来越准确和有价值的建议。
亚马逊云科技(Amazon Web Services)是全球云计算的开创者和引领者。提供200多类广泛而深入的云服务,服务全球245个国家和地区的数百万客户。亚马逊云科技致力于成为企业构建和应用生成式AI的首选,通过生成式AI技术栈,提供用于模型训练和推理的基础设施服务、构建生成式AI应用的大模型等工具、以及开箱即用的生成式AI应用。深耕本地、链接全球 – 在中国,亚马逊云科技通过安全、稳定、可信赖的云服务,助力中国企业加速数字化转型和创新,并深度参与全球化市场。