一、性能测试架构的重要性
性能测试架构在软件性能评估和优化中起着至关重要的作用。一个良好的性能测试架构能够准确地模拟真实用户场景,为软件性能的评估提供可靠的数据支持。
首先,性能测试架构可以帮助开发团队在软件上线前发现潜在的性能问题。通过模拟不同的负载情况,如高并发用户访问、大数据量处理等,性能测试架构能够揭示系统在各种压力下的表现,从而让开发团队有针对性地进行优化。例如,使用 JMeter 等负载测试工具,可以模拟大量用户同时访问系统,评估系统在不同负载下的响应时间和稳定性。
其次,性能测试架构有助于确定系统的性能瓶颈。通过对系统资源的监控,如 CPU、内存、网络带宽等的使用情况,性能测试架构可以帮助开发人员快速定位性能瓶颈所在。例如,在数据库集群和库表散列的性能测试中,可以发现数据库查询是否成为瓶颈,及时进行优化调整。
此外,性能测试架构还能为系统的扩展性提供评估依据。随着业务的发展,系统需要能够支持更高的用户量和更复杂的操作。性能测试架构可以模拟未来可能的负载情况,验证系统的扩展性,确保其在用户量增加时仍能保持稳定。例如,通过对大型系统架构的性能测试,可以评估系统在采用负载均衡技术、分布式架构等情况下的性能表现。
总之,重视性能测试架构的选择对于软件性能的评估和优化至关重要。它不仅可以提升用户体验,还能降低运营成本,保障业务连续性,为企业在激烈的市场竞争中赢得优势。
二、常见性能测试架构类型
(一)简单系统架构
表示层又称表现层 UI,位于三层构架的最上层,与用户直接接触,主要是 B/S 信息系统中的 Wed 浏览页面。其主要功能是实现系统数据的传入与输出,在此过程中不需要借助逻辑判断操作就可以将数据传送到业务逻辑层进行数据处理,处理后会将处理结果反馈到表示层中。
业务逻辑层作为中间层,是表示层和数据层的桥梁。它响应表示层的用户请求,执行任务并从数据层抓取数据,并将必要的数据传送给表示层。业务逻辑层针对具体问题进行操作,对数据进行业务逻辑处理,包括对数据的验证、计算、转换等。
数据层定义、维护数据的完整性、安全性,它响应逻辑层的请求,访问数据。数据层通常由大型的数据库服务器实现,如 Oracle、Sybase、MS SQL Server 等。数据层在作业过程中访问数据系统中的文件,实现对数据库中数据的读取保存操作。
这三层架构相互协作,实现了 “高内聚,低耦合” 的思想。开发人员可以只关注整个结构中的其中某一层,降低了层与层之间的依赖,有利于标准化和各层逻辑的复用,同时也提高了项目的扩展性、安全性,使得项目结构更清楚,分工更明确,有利于后期的维护和升级。
(二)大型系统架构
在大型系统中,操作系统的选择至关重要。在个人操作系统领域,windows 无疑是绝对的霸主,但在服务器领域,linux/unix 以其不俗的性能表现,超强的稳定性与安全性使其变成众多企业的首选。因为系统服务器由少数技术人员使用,他们更看重系统的性能、稳定性和安全性等方面的表现。
Web 服务器即中间件服务器,是应用程序的载体。对于 window 系统来说,IIS 是微软配套的 web 服务器。而 apache 作为开源力量代表,不管在 windows 还是 linux 下面都非常得宠。常用的系统架构有:Linux + Apache + PHP + MySQL、Linux + Apache + Java (WebSphere) + Oracle、Windows Server 2003/2008 + IIS + C#/ASP.NET + 数据库、Window Server 2003/2008 + tomcat + MySql。
提高系统性能的相关技术有很多,比如网页 HTML 静态化,效率最高、消耗最小的就是纯静态化的 html 页面,可以将网站上的页面采用静态页面来实现,对于大型网站来说,拥有一套高效、可管理的 CMS 是必不可少的。图片服务器分离、数据库集群和库表散列也是提高大型网站性能的重要手段。在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase 等都有很好的方案,常用的 MySQL 提供的 Master/Slave 也是类似的方案。
(三)CS/CSS 系统架构
CS/CSS 系统架构即 CLIENT/SERVER 结构或客户 / 应用服务器 / 数据库服务器三层结构。传统的 C/S 结构一般分为两层:客户端和服务器端。该结构的基本工作原理是,客户程序向数据服务器发送 SQL 请求,服务器返回数据和结果。客户端负责实现用户接口功能,同时封装了部分应用逻辑。服务器端的数据库服务器主要提供数据存储功能,也通过触发器和存储过程提供部分应用逻辑。
C/S/S 结构即客户 / 应用服务器 / 数据库服务器三层结构,中间增加了应用服务器,通常实现应用逻辑,是连接客户与数据库服务器的桥梁。它响应用户发来的请求执行某种业务任务,并与数据库服务器打交道,技术实现上通常选用中间件产品,如 BEA 公司的 TUXEDO 和 IBM 公司的 CICS 等。
CS/CSS 系统架构的性能影响因素众多,整个系统的各个部分使用多种操作系统,性能上有差别;各个环节上使用多种数据库,同样在性能上有差别;应用是多个,分属多个种类,分布在不同设备上;系统中的设备、组件通过不同协议进行连接、通讯;内部接口多,性能瓶颈多;系统的性能指标不光同应用系统架构有关,还和具体行业应用的业务模式有关;采用此架构的行业应用往往是一个 7×24 小时系统;高柜业务多,影响性能度量项的选取和转换;各个环节基本上以交换数据报文的方式通信,其格式经常会比较复杂。
在该架构下性能测试的基本策略包括确定好测试工作范围、分析好客户的性能测试需求、做好性能测试的计划和方案、确定测试通过准则并获得客户认可。性能测量在性能测试开始前必须认真规划,包括确定性能测量的策略、规划使用的测量工具、保证测量的代表性和可重复性。性能探测技术可以在程序的关键点插入代码探针来测量软件的执行特性,提高性能数据获取的便利性、数据的详细程度和数据收集方式的可控性。
三、性能测试架构的选择要点
(一)根据业务需求选择
在选择性能测试架构时,业务需求是首要考虑因素。如果项目中读操作远多于写操作,且数据量较大,一主多从的数据库架构可能是一个不错的选择。主数据库负责写入数据,多个从数据库可以分担读操作的压力,提高系统的响应速度。例如,在一个电商平台中,商品信息的查询频率远远高于商品信息的更新频率,采用一主多从的架构可以有效地提高系统的性能。
如果对数据的安全性和可用性要求极高,双机热备架构则更为合适。双机热备可以确保在主服务器出现故障时,备用服务器能够立即接管服务,保证系统的不间断运行。比如在金融交易系统中,任何数据丢失或系统中断都可能带来巨大的损失,因此双机热备架构能够提供更高的可靠性。
(二)考虑性能指标
性能指标是选择性能测试架构的重要依据。响应时间是用户体验的关键指标,架构的选择应确保系统能够在可接受的时间内响应用户请求。根据搜索到的素材,响应时间可以通过公式 “响应时间 = 网络传输时间(请求)+ 服务器处理时间(一层或是多层)+ 网络传输时间(响应)+ 页面前段解析时间” 来评估。例如,对于一个在线办公系统,用户可接受的最大响应时间不超过 3 秒,那么在选择架构时,就需要考虑如何优化网络传输、服务器处理和前端解析等环节,以满足这个响应时间要求。
并发用户数也是一个重要的性能指标。对于已有系统,可以参考系统用户数、在线用户数等数据来评估并发用户数。一般来说,可选取高峰时刻,在一定时间内使用系统的人数作为在线用户数,而并发用户数可以取其中 8% - 15% 的比例基数。例如,在 1 个小时内,使用系统的在线用户数为 10 万,那么取 8000 - 1.5 万作为并发用户数就基本足够了。新系统则可以通过业务部门进行评估。在选择架构时,要确保架构能够支持预期的并发用户数,避免出现系统崩溃或响应缓慢的情况。
(三)综合评估优缺点
不同的性能测试架构都有其优缺点,需要综合评估后做出选择。
一主多从架构的优点是可以提高读操作的性能,分担主数据库的压力,适用于读多写少的业务场景。缺点是增加了系统的复杂性,需要进行数据同步和主从切换的管理。如果从数据库数量过多,可能会导致数据同步延迟,影响数据的一致性。
双机热备架构的优点是提供了高可用性,确保系统在主服务器故障时能够继续运行。缺点是成本较高,需要两台服务器同时运行,且在切换过程中可能会出现短暂的中断。
在选择架构时,要根据项目的具体需求进行综合考虑。如果对数据安全性和可用性要求高,且预算允许,可以选择双机热备架构;如果读操作频繁,且希望提高系统的性能和扩展性,可以选择一主多从架构。同时,还可以结合其他技术手段,如缓存、负载均衡等,进一步优化系统性能。
四、性能测试工具与架构的关系
(一)性能测试工具的基本原理
性能测试工具在性能测试中起着关键作用,其基本原理主要包括以下几个方面:
-
模拟负载:性能测试工具能够模拟用户或系统产生的负载,涉及各种请求类型,如 HTTP 请求、数据库操作等,以此来测试服务器的处理能力。例如,在模拟电商平台的高并发场景时,工具可以同时发起大量的商品查询请求,以检验服务器在高负载下的性能表现。
-
并发控制:工具可以模拟多个用户同时发送请求的场景,检测服务器在并发高峰时的性能。通过设置不同的并发用户数,如 1000 个用户同时访问一个网站,观察服务器的响应时间、吞吐量等性能指标。
-
事务模拟:模拟用户的行为序列,如登录、查询数据、更新记录等,有效地创建对服务器的真实压力。以在线办公系统为例,模拟用户先登录,然后进行文档查询和编辑等一系列操作,测试系统在复杂业务场景下的性能。
-
性能指标监控:这些工具可以监控并记录关键的性能数据,如服务器响应时间、吞吐量、错误率以及 CPU、内存、磁盘和网络 I/O 等资源的使用情况。在性能测试过程中,实时监测这些指标,以便及时发现性能瓶颈。
-
数据收集与分析:性能测试工具会保留测试过程中收集的数据,使得测试人员可以在测试完成后分析,以便识别性能瓶颈,理解服务器的处理极限,并对性能进行基线标定。例如,通过对收集的数据进行分析,确定系统在不同负载下的性能表现,为系统优化提供依据。
(二)性能测试工具架构
性能测试工具架构由多个组件组成,各组件相互协作,共同完成性能测试任务:
-
控制器 — 管理节点:作为性能测试流程的指挥中心,控制器管理着启动测试、控制负载生成器、配置测试场景以及收集与汇总性能数据的任务。它提供了一个用户友好的界面,使得测试人员可以轻松地进行配置和监控。例如,在使用 LoadRunner 时,Controller 可以设置不同的测试场景,如逐步增加并发用户数、持续高负载等,同时监控测试过程中的各种性能指标。
-
负载发生器 — 代理节点:节点是负载产生的执行者。在分布式测试环境下,这些节点可以部署在不同地理位置,模拟多样化的用户负载。比如,在对一个全球范围内的应用进行性能测试时,可以在不同地区部署负载发生器,模拟不同地区用户的访问情况,以更真实地测试系统在全球范围内的性能表现。
-
目标系统 — 被测服务器:性能测试的直接对象,可能是 Web 服务器、应用服务器、数据库服务器或其他类型的服务组件。性能测试工具针对目标系统施加负载,检测其在各种情况下的性能表现。
-
监控代理:代理部署在目标系统上,负责搜集有关服务器性能和资源利用的详细数据。例如,监控代理可以实时监测服务器的 CPU 使用率、内存占用、网络带宽使用情况等,为性能分析提供数据支持。
-
数据仓库:性能数据、日志和监控结果都会被存储在数据库或其他形式的数据仓库中,方便后续的数据分析和长期历史数据的比较。通过数据仓库,可以对不同时间段的性能测试结果进行对比分析,了解系统性能的变化趋势。
-
分析与报告模块:此模块负责对收集到的性能数据进行深入分析,并生成详细的报告。这些报告通常包含图形化界面,帮助测试人员直观理解测试结果。例如,生成的报告可以包括响应时间曲线、吞吐量柱状图等,使测试人员能够快速了解系统的性能状况。
(三)常见性能测试工具比较
以下是对 Apache JMeter、LoadRunner、Gatling、Locust 和 BlazeMeter 等常见性能测试工具的特点比较:
-
Apache JMeter:一个开源的 Java 应用程序,支持广泛的协议和功能。适合所有技能水平的用户,并有一个活跃的社区。它具有强大的扩展性,可以通过编写插件满足各种特定的测试需求。例如,在对复杂的企业级应用进行性能测试时,可以利用 JMeter 的插件功能实现对特定协议的支持。
-
LoadRunner:一款功能强大的商业性能测试工具,提供广泛的技术支持,但成本相对较高。LoadRunner 在模拟复杂业务场景和大规模并发方面表现出色,适用于大型企业和对性能测试要求较高的项目。例如,在银行系统的性能测试中,LoadRunner 可以准确模拟大量用户同时进行交易操作的场景。
-
Gatling:使用 Scala 编写的开源工具,专注于基于 HTTP 协议的负载测试,适合开发人员和技术专业人员。Gatling 具有高效的性能和简洁的语法,能够快速构建基于 HTTP 协议的性能测试脚本。
-
Locust:一个轻量级的开源负载测试工具,使用 Python 编写,易于编写测试脚本并扩展用户负载。Locust 以其简单易用的特点受到很多开发者的喜爱,尤其适用于小型项目和快速验证系统性能的场景。
-
BlazeMeter:一个基于云的性能测试平台,提供 JMeter 的兼容性和其他高级功能,适合大型企业和高负载测试需求。BlazeMeter 可以轻松实现大规模的分布式测试,并且能够与其他工具集成,提供更全面的性能测试解决方案。
五、性能测试架构的优化思路
(一)系统性能问题分析流程
当我们发现性能问题时,首先要判断是单用户非并发状态下存在性能问题,还是在并发状态才出现性能问题。对于单用户性能问题,往往比较容易测试和验证。而对于并发性能问题,可以在测试环境进行加压测试和验证,以判断并发下的性能。
如果是单用户本身就存在性能问题,那么大部分问题都出在程序代码和 SQL 需要进一步优化上面。如果是并发性能问题,我们就需要进一步分析数据库和中间件本身的状态,看是否需要对中间件进行性能调优。
在加压测试过程中,我们还需要对 CPU、内存和 JVM 进行监控,观察是否存在类似内存泄漏无法释放等情况,即并发下性能问题本身也可能是代码本身原因导致性能异常。
(二)性能问题影响因素分析
- 硬件环境:
- 硬件环境包括计算、存储和网络资源。对于服务器的计算能力,厂家一般会提供 TPMC 参数作为参考数据,但实际中相同 TPMC 能力下的 X86 服务器能力仍低于小型机。
- 存储设备的重点是 IO 读写性能问题。有时候监控发现 CPU 和内存居高不下,而真正的瓶颈可能是由于 IO 瓶颈导致。比如在 Linux 环境下,可以使用 iostat、ps、sar、top、vmstat 等工具对 CPU、内存、JVM、磁盘 IO 等进行性能监控和分析,以发现真正的性能问题在哪里。
- 运行环境:
- 数据库和应用中间件性能调优是经常出现性能问题的地方。
- 数据库调优:以 Oracle 数据库为例,影响数据库性能的因素包括系统、数据库、网络。数据库的优化包括优化数据库磁盘 I/O、优化回滚段、优化 Redo 日志、优化系统全局区、优化数据库对象。要调整首先就需要对数据库性能进行监控,可以在 init.ora 参数文件中设置 TIMED_STATISTICS = TRUE 和在会话层设置 ALTER SESSION SET STATISTICS = TRUE。运行 svrmgrl 用 connect internal 注册,在应用系统正常活动期间,运行 utlbstat.sql 开始统计系统活动,达到一定时间后,执行 utlestat.sql 停止统计。统计结果将产生在 report.txt 文件中。
- 应用中间件性能分析和调优:应用中间件容器即 Weblogic、Tomcat 等应用中间件容器或 Web 容器。应用中间件调优一方面是本身的配置参数优化设置,另一方面就是 JVM 内存启动参数调优。对于应用中间件本身的参数设置,主要包括 JVM 启动参数设置、线程池设置、连接数的最小最大值设置等。如果是集群环境,还涉及到集群相关的配置调优。
- 软件程序:
- 单用户性能问题往往与程序代码和 SQL 优化不足有关。并发性能问题可能也与代码本身导致的性能异常有关,比如内存泄漏等问题。
(三)数据库和应用中间件性能调优
- 数据库优化:
- 设计合理的数据表结构:良好的数据库表结构能够提高查询效率,避免数据冗余,降低数据存储量。
- 选择合适的数据类型:选择最小的数据类型能够减少磁盘占用,提高查询效率。
- 创建合适的索引:索引可以加快查询速度,但是过多或不合适的索引也会拖慢数据库性能。
- 避免使用 SELECT :只选取所需的字段,能够减少查询时间和 I/O 操作。
- 避免大量的 JOIN 操作:JOIN 操作需要消耗大量的 CPU 及内存资源,应该尽量减少 JOIN 的使用。
- 优化查询语句:合理运用 JOIN、WHERE、ORDER BY 等语句,避免使用子查询等低效的查询方式。
- 避免使用临时表:临时表的使用会增加磁盘 I/O 操作,影响数据库性能。
- 数据库参数调优:
- innodb_buffer_pool_size:设置 InnoDB 缓存池大小,建议设置为总内存的 70%。
- innodb_log_buffer_size:设置 InnoDB 日志缓冲区大小,建议为 1MB。
- innodb_flush_log_at_trx_commit:设置 InnoDB 事务提交时写入日志缓冲的方式,建议设置为 1。
- query_cache_size:设置查询缓存大小,建议根据数据库大小设置在 256MB - 512MB 之间。
- max_connections:设置最大连接数,建议根据数据库负载情况和硬件配置设置,通常在 100 - 200 之间。
- key_buffer_size:设置 MyISAM 索引缓存大小,建议根据表大小设置在总内存的 1/4 - 1/3 之间。
- tmp_table_size:设置临时表大小,建议为 64MB。
- sort_buffer_size:设置排序缓冲区大小,建议为 2MB - 8MB。
- read_buffer_size 和 read_rnd_buffer_size:设置读取缓冲区大小,建议为 256KB - 512KB。
- table_open_cache 和 table_definition_cache:设置表缓存大小,建议根据数据库大小和表数量设置,通常在 2000 - 5000 之间。
- 应用中间件配置调优:
- JVM 启动参数调优:
- Java 整个堆大小设置,Xmx 和 Xms 设置为老年代存活对象的 3 - 4 倍,即 FullGC 之后的老年代内存占用的 3 - 4 倍。
- 永久代 PermSize 和 MaxPermSize 设置为老年代存活对象的 1.2 - 1.5 倍。
- 年轻代 Xmn 的设置为老年代存活对象的 1 - 1.5 倍。
- 老年代的内存大小设置为老年代存活对象的 2 - 3 倍。
- 线程池设置:设置合理的线程池大小,避免线程过多或过少导致的性能问题。
- 连接数设置:设置连接数的最小最大值,根据实际负载情况进行调整。
- 集群配置调优:如果是集群环境,还需要对集群相关的配置进行调优,以提高系统的性能和可用性。
六、总结与展望
(一)性能测试架构的重要性总结
性能测试架构的选择对于软件性能至关重要。不同的架构类型适用于不同的业务场景和性能需求,如简单系统架构、大型系统架构以及 CS/CSS 系统架构等,各有其特点和适用范围。在选择性能测试架构时,需要根据业务需求、性能指标以及综合评估各种架构的优缺点来做出决策。同时,性能测试工具与架构密切相关,不同的工具具有不同的特点和适用场景,能够为性能测试提供有力的支持。
(二)未来性能测试架构的发展趋势展望
随着技术的不断发展,未来性能测试架构将呈现出以下几个趋势:
- 智能化:未来的性能测试架构将更加智能化,能够自动分析业务需求和性能指标,自动选择最适合的架构和测试工具,并自动进行性能优化。例如,通过人工智能和机器学习算法,分析历史性能数据和业务模式,预测未来的性能需求,提前进行架构调整和优化。
- 云化:随着云计算技术的不断发展,越来越多的企业将采用云服务进行性能测试。云化的性能测试架构将具有更高的灵活性和可扩展性,能够快速部署和调整测试环境,满足不同业务场景的需求。同时,云服务提供商将提供更加专业的性能测试工具和服务,降低企业的测试成本和技术门槛。
- 全链路监控:未来的性能测试架构将更加注重全链路监控,从用户端到服务器端,全面监测应用程序的性能指标和用户体验。通过全链路监控,能够及时发现性能问题,并快速定位问题所在,提高性能优化的效率和效果。
- 微服务架构的优化:随着微服务架构的广泛应用,未来的性能测试架构将更加注重微服务架构的优化。微服务架构带来了更高的灵活性和可扩展性,但也带来了更多的性能挑战,如服务间的通信延迟、服务的负载均衡等。未来的性能测试架构将提供更加专业的微服务性能测试工具和方法,帮助企业优化微服务架构,提高应用程序的性能和可靠性。
总之,性能测试架构的选择是一个复杂的过程,需要综合考虑各种因素。未来的性能测试架构将更加智能化、云化、全链路监控和微服务架构优化,为企业提供更加高效、可靠的性能测试服务。