很多软件系统的失败都是因为性能问题,在开发生命周期和性能测试生命周期的每个阶段都有性能失败的原因。有时性能问题会失控,超出项目经理、技术架构师或性能工程师的控制范围。从业务和个人层面来看,大多数系统性能故障仅仅是由于性能工程师、开发人员、DBA、业务团队和利益相关者之间从一开始就缺乏沟通,这会导致许多其他问题,这些问题将直接影响应用程序性能和投资回报率。对任何应用程序/产品进行有效性能测试的唯一目标是获得令人满意的投资回报。性能测试和软件工程是有风险的,总是需要从开发的早期阶段开始进行大量的反复试验。必须像对待其他业务问题一样对待系统性能故障。了解出了什么问题、发生的原因以及如何预防。在大多数情况下,每个人都需要知道/理解端到端全生命周期实施中的性能挑战。另一座山的石头,根据老码农的经验,总结了一系列导致系统性能故障的原因。1.对最终用户的反馈充耳不闻作为最终用户,您只知道存在的潜在性能问题。为了了解生产系统中存在的性能问题,需要最终用户不断反馈应用程序在不同预期负载条件下的性能。总是有很多用户在生产环境中使用一个特性,即使这个特性没有达到他们预期的性能,他们也不会质疑它并认为它是正确的,当用户可以从多个位置同时访问它时时间,这可能是个大问题。因此,如果要提高应用程序的性能,就必须让最终用户参与进来,以获取有关应用程序或系统在生产环境中的性能的持续反馈。当然,与最终用户的交互需要时间和精力,但为了让产品/应用程序提供最佳性能,这绝对是值得的。2.不注重性能目标设定目标是决定系统性能的最重要方面之一。很多团队为了改进,常常达不到性能目标,花费大量时间修复系统中存在的和隐藏的性能问题。性能测试的完美目标应该在最现实的条件下定义、设计和执行,例如真实的浏览器、设备和多个地理位置。确定要监控的正确指标,为每个指标定义最小阈值,执行性能测试以获得基线结果,所有这些数字都是确定哪些更改可以带来性能改进所必需的。在软件开发生命周期的早期开始性能测试以首先消除瓶颈并确保在高用户负载下不断检查应用程序的性能是一种很好的做法。3.非功能需求收集不明确和不完整完整的非功能需求比功能需求更复杂,因为它们被认为是第二类甚至第三类需求。因此,它们经常被误解和忽视,只有少数组织将非功能性需求视为一等公民。这会导致系统架构/设计出现严重问题,经常导致项目崩溃和网站崩溃,导致系统无法使用。在大多数情况下,在大多数不成功的项目中,非功能需求文档不完整、不一致或不存在。性能测试的第一步是对应用程序/系统进行可行性分析,并创建一组清晰的非功能性需求。可靠的非功能需求文档将确定产品/应用程序最佳执行的所有标准。还需要:为产品/应用程序和系统建立明确的性能目标和期望必须得到每个人(开发团队、QA、管理团队、DBA、利益相关者和业务团队)的同意。在技??术、项目和业务团队之间建立沟通,以了解生产环境中最终用户的实际性能问题使用分析工具获取生产流量统计数据,以创建适当的工作负载模型收集非功能性需求时,了解应用程序/产品架构,设计、问题和现有的性能问题如果应用程序是全新的,基线和基准测试是必不可少的性能测试是必要的。获取有关所有涉及的内部和外部组件的完整信息,并了解它们如何通信(CDN、防火墙、DNS、负载均衡器、服务器、网络和系统、缓存等)了解应用程序内存占用和第三方架构限制和问题与业务团队了解目标并确定什么是基本的、现有的遗留系统性能问题、平台限制和竞争对手。有必要记录一切并与业务和其他利益相关者开会以确定现有的非功能性要求是否合适并就定义的SLA达成一致。4、糟糕的架构设计最初,糟糕的架构设计只会导致小问题,一开始会比较小,但会逐渐积累。简单维护是一项挑战,一个区域的任何更改都会破坏应用程序的其他部分。如果在架构设计阶段做出不恰当的决定,应用程序/系统可能会出现严重的性能下降,从而导致网络延迟过大等问题。如果不了解定义良好的系统架构,在负载测试执行阶段存在太多不确定性和复杂性的高风险,这可能会给性能测试和工程团队带来意想不到的性能问题。在软件开发生命周期的应用程序设计和开发阶段,软件发布可能会因性能挑战而延迟。5.缺乏可预见的依赖性技术依赖是为了让应用程序和功能组件之间有更多的联系。特定操作系统版本、应用程序服务器、数据库服务器或Java虚拟机、公共语言运行时和框架都是依赖性的示例。但是,有些依赖关系更为复杂,例如由Linux、Java和脚本语言(如Python和Ruby)中的各种包组成的依赖关系。了解每种技术在设计和基础架构方面对每个组件的依赖性,使用哪些技术以及使用哪些框架和工具来开发应用程序对于系统性能至关重要,以完成具有预期结果的性能测试。6.新功能的过度扩展新功能的过度扩展是软件开发人员经常遇到的一大障碍。处理这种情况的有效方法是定期举行面向用户体验的会议和讨论,每个团队成员都参与其中,以验证每个功能并确保它有意义地解决设定的问题。性能测试团队必须从规划发布时间表开始,并且应该主动宣布所需的时间,以防在发布前的最后一刻添加任何新功能。如果项目有固定的截止日期,则需要提前规划环境要求,以确保意外的环境延迟不会影响性能测试进度。如果在最后一刻继续添加新功能,交付质量很可能会受到影响。最终,客户可能会拒绝最终交付成果,造成返工和额外资源短缺。7.赞美大成功在性能测试执行的初始版本中,直接关注目标SLA以达到可接受的限度可能不太现实。性能测试是一个迭代过程,需要进行广泛的持续性能测试以识别和消除任何性能瓶颈。需要花费额外的时间来优化每一行代码和组件,以提高系统/应用程序的性能。在性能测试中,每一个SLA和KPI都是必要的,而需要的响应时间、吞吐量只能通过持续的性能测试、代码分析、内存分析、性能工程、客户端和服务器流量、网络延迟和资源的监控和调优来获得。利用率,这有时可能需要很长时间。分析所有性能结果和降级并使用来自用户级别、操作系统级别、系统级别、网络级别和服务器级别的适当指标收集数据对于所有性能问题的根本原因分析至关重要。8.缺乏容量规划许多基础设施没有实施有效的规划。简而言之,容量规划过程并不简单。我们可以创建一个场景、添加流量、评估结果、解决性能问题,然后重复直到我们满意为止,但真正的问题往往来自糟糕的容量规划。容量规划不当会增加性能缺失、完全暴露和最终失败的可能性。所有这些都可以通过仔细的容量规划得到妥善解决。来自基础架构领域的系统工程师、来自数据库领域的DBA和来自应用程序开发领域的程序员是最需要参与有效容量规划流程的三个群体。许多人有时会将容量管理与容量规划混淆,不准确地预测和错误预测未来的工作负载。您需要确保确定准确的资源需求(CPU、内存、磁盘空间和网络带宽)以支持当前和未来增加的工作负载以满足业务需求并避免容量规划失败。使用正确的指标进行持续监控将帮助我们进行有效的容量规划,还有助于处理流量增加后无法预料的工作负载。9.性能问题没有完全解决当应用程序的用户数量增加时,你会经常看到更多的性能问题。系统中隐藏的性能问题和已知的性能问题是导致性能随时间持续下降的主要原因。必须与项目的每个团队成员讨论每个已识别的瓶颈,以成功确保性能符合客户的SLA。当涉及到性能问题时,每一秒都很重要,如果您忽略现有的性能问题,您的系统将会变慢,甚至更糟。例如,某些服务可能会在严重超载的服务器上停止运行,从而使应用程序无法访问。找出监控数据并检查服务的健康状况通常可以找出性能问题的常见原因。10.缺乏方法论如果没有合适的方法来建立性能测试策略及其覆盖范围,就很难获得有效的性能测试结果。了解性能测试方法和流程将帮助团队中的每一位工程师,尤其是在出现性能问题时,为出现的每个瓶颈提供正确的解决方案。性能测试过程应该被很好地计划、定义和记录。良好的文档可以在开发人员、DBA和QA之间建立有效的沟通。随着软件变得越来越复杂和多样化,需要测试的平台和位置越来越多,需要一种健壮的性能测试方法来确保开发中的软件系统经过充分的性能测试,以确保它们满足特定的业务需求并能够在所有预期的负载条件和环境下以高性能执行。
