本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
优化 AWS Blu Age 现代化应用程序的性能
亚马逊 Web Services 的 Vishal Jaswani、Manish Roy 和 Himanshu Sah
摘要
使用 AWS Blu Age 进行现代化改造的大型机应用程序需要在部署到生产环境之前进行功能和性能等效性测试。在性能测试中,现代化应用程序的运行速度可能比传统系统慢,尤其是在复杂的批处理作业中。之所以存在这种差异,是因为大型机应用程序是单体的,而现代应用程序则使用多层架构。这种模式提供了一些优化技术,可以解决通过在 Blu Age 中使用自动重构实现现代化的应用程序的 AWS这些性能差距。
该模式使用具有原生 Java 和数据库调整功能的 AWS Blu Age 现代化框架来识别和解决性能瓶颈。该模式描述了如何使用分析和监控来识别性能问题,包括指标(例如 SQL 执行时间、内存利用率和 I/O 模式)。然后,它解释了如何应用有针对性的优化,包括数据库查询重组、缓存和业务逻辑优化。
批处理时间和系统资源利用率的改善可帮助您与现代化系统中的大型机性能水平相匹配。在向基于云的现代架构过渡期间,这种方法可以保持功能等同性。
要使用此模式,请按照长篇故事部分中的说明设置系统并识别性能热点,然后应用 “架构” 部分中详细介绍的优化技术。
先决条件和限制
先决条件
AWS 蓝光时代的现代化应用程序
安装数据库客户端和分析工具的管理权限
AWS Blu Age 3 级认证
对 AWS Blu Age 框架、生成的代码结构和 Java 编程有中级水平的了解
限制
以下优化功能和特性不在此模式的范围之内:
应用程序层之间的网络延迟优化
通过亚马逊弹性计算云 (Amazon) 实例类型和存储优化实现基础设施级优化 EC2
并行用户负载测试和 stress 测试
产品版本
JProfiler 版本 13.0 或更高版本(我们推荐最新版本)
pgadmin 版本 8.14 或更高版本
架构
此模式使用 JProfiler 和 pgadmin 等工具为 AWS Blu Age 应用程序设置分析环境。它支持通过 B AWS lu Age APIs 提供的 DAOManager 和 SQLExecution生成器进行优化。
本节的其余部分提供了详细信息和示例,用于识别现代化应用程序的性能热点和优化策略。Epics 部分中的步骤请参考此信息以获取进一步指导。
识别现代化大型机应用程序中的性能热点
在现代化的大型机应用程序中,性能热点是代码中导致严重减速或效率低下的特定区域。这些热点通常是由大型机和现代化应用程序之间的架构差异造成的。要识别这些性能瓶颈并优化现代化应用程序的性能,您可以使用三种技术:SQL 日志记录、查询EXPLAIN计划和 JProfiler 分析。
热点识别技术:SQL 日志记录
现代 Java 应用程序,包括那些使用 AWS Blu Age 实现现代化的应用程序,都具有记录 SQL 查询的内置功能。您可以在 Bl AWS u Age 项目中启用特定的记录器来跟踪和分析应用程序执行的 SQL 语句。这种技术对于识别效率低下的数据库访问模式特别有用,例如过多的单个查询或结构不佳的数据库调用,可以通过批处理或查询优化来优化。
要在 AWS Blu Age 现代化应用程序中实现 SQL 日志记录,请将application.properties文件中 SQL 语句DEBUG的日志级别设置为,以捕获查询执行的详细信息:
level.org.springframework.beans.factory.support.DefaultListableBeanFactory : WARN level.com.netfective.bluage.gapwalk.runtime.sort.internal: WARN level.org.springframework.jdbc.core.StatementCreatorUtils: DEBUG level.com.netfective.bluage.gapwalk.rt.blu4iv.dao: DEBUG level.com.fiserv.signature: DEBUG level.com.netfective.bluage.gapwalk.database.support.central: DEBUG level.com.netfective.bluage.gapwalk.rt.db.configuration.DatabaseConfiguration: DEBUG level.com.netfective.bluage.gapwalk.rt.db.DatabaseInteractionLoggerUtils: DEBUG level.com.netfective.bluage.gapwalk.database.support.AbstractDatabaseSupport: DEBUG level.com.netfective.bluage.gapwalk.rt: DEBUG
使用记录的数据来识别优化目标,从而监控高频率和执行缓慢的查询。重点关注批处理过程中的查询,因为它们通常对性能的影响最大。
热点识别技术:查询解释计划
此方法使用关系数据库管理系统的查询规划功能。你可以使用诸如 EXPLAIN PostgreSQL 或 MySQ EXPLAIN PLAN L 或 Oracle 中的命令来检查你的数据库打算如何运行给定查询。这些命令的输出为查询执行策略提供了宝贵的见解,包括是使用索引还是执行全表扫描。这些信息对于优化查询性能至关重要,尤其是在适当的索引可以显著缩短执行时间的情况下。
使用特定于您的数据库的EXPLAIN命令,从应用程序日志中提取最重复的 SQL 查询,并分析执行缓慢的查询的执行路径。以下是 PostgreSQL 数据库的示例。
查询:
SELECT * FROM tenk1 WHERE unique1 < 100;
EXPLAIN 命令:
EXPLAIN SELECT * FROM tenk1 where unique1 < 100;
输出:
Bitmap Heap Scan on tenk1 (cost=5.06..224.98 rows=100 width=244) Recheck Cond: (unique1 < 100) -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0) Index Cond: (unique1 < 100)
您可以按如下方式解释EXPLAIN输出:
从最里面到最外面(从下到上)的操作阅读
EXPLAIN计划。寻找关键术语。例如,
Seq Scan表示全表扫描并Index Scan显示索引使用情况。检查成本值:第一个数字是启动成本,第二个数字是总成本。
有关估计的输出行数,请参阅该
rows值。
在此示例中,查询引擎使用索引扫描来查找匹配的行,然后仅读取这些行 (Bitmap Heap Scan)。尽管单行访问的成本更高,但这比扫描整个表更高效。
EXPLAIN计划输出中的表扫描操作表示缺少索引。优化需要创建适当的索引。
热点识别技术: JProfiler 分析
JProfiler 是一款全面的 Java 分析工具,可通过识别缓慢的数据库调用和 CPU 密集型调用来帮助您解决性能瓶颈。该工具在识别缓慢的 SQL 查询和低效的内存使用方面特别有效。
查询分析示例:
select evt. com.netfective.bluage.gapwalk.rt.blu4iv.dao.Blu4ivTableManager.queryNonTrasactional
“ JProfiler 热点” 视图提供以下信息:
“时间” 列
显示总执行时长(例如,329 秒)
显示占应用程序总时间的百分比(例如,58.7%)
帮助识别最耗时的操作
“平均时间” 列
显示每次执行的持续时间(例如,2,692 微秒)
表示个人操作性能
帮助发现缓慢的单个操作
“事件” 专栏
显示执行次数(例如,122,387 次)
表示操作频率
帮助识别经常调用的方法
对于示例结果:
高频率:122,387 次执行表明有可能进行优化
性能问题:平均时间为 2,692 微秒表明效率低下
严重影响:总时间的 58.7% 表示存在重大瓶颈
JProfiler 可以分析应用程序的运行时行为,以揭示通过静态代码分析或 SQL 日志记录可能不明显的热点。这些指标可帮助您识别需要优化的操作,并确定最有效的优化策略。有关 JProfiler 功能的更多信息,请参阅JProfiler 文档
将这三种技术(SQL 日志记录、查询EXPLAIN计划和 JProfiler)结合使用时,可以全面了解应用程序的性能特征。通过识别和解决最关键的性能热点,您可以弥合原始大型机应用程序和基于云的现代化系统之间的性能差距。
确定应用程序的性能热点后,可以应用优化策略,下一节将对此进行介绍。
大型机现代化的优化策略
本节概述了优化大型机系统中已实现现代化的应用程序的关键策略。它侧重于三种策略:使用现有缓存 APIs、实现有效缓存和优化业务逻辑。
优化策略:使用现有的 APIs
AWS Blu Age 提供了几个强大 APIs 的 DAO 接口,你可以用它们来优化性能。两个主要接口—— DAOManager 和 SQLExecution生成器——提供了增强应用程序性能的功能。
DAOManager
DAOManager 充当现代化应用程序中数据库操作的主要接口。它提供了多种方法来增强数据库操作和提高应用程序性能,特别是用于直接的创建、读取、更新和删除 (CRUD) 操作以及批处理。
使用 SetMaxResults。在 DAOManager API 中,您可以使用SetMaxResults方法指定在单个数据库操作中要检索的最大记录数。默认情况下,一次只能 DAOManager 检索 10 条记录,这在处理大型数据集时可能会导致多次数据库调用。当您的应用程序需要处理大量记录并且当前正在进行多个数据库调用以检索这些记录时,请使用此优化。这在迭代大型数据集的批处理场景中特别有用。在以下示例中,左边的代码(优化前)使用 10 条记录的默认数据检索值。右边的代码(优化后)设置setMaxResults为一次检索 100,000 条记录。

注意
请谨慎选择较大的批量大小并检查对象大小,因为这种优化会增加内存占用。
替换 SetOnGreatorOrEqual 为 SetOnEqual。此优化涉及更改用于设置检索记录条件的方法。该SetOnGreatorOrEqual方法检索大于或等于指定值的记录,而仅SetOnEqual检索与指定值完全匹配的记录。
当您知道需要精确匹配并且当前正在使用SetOnEqual后面跟着 readNextEqual() 的SetOnGreatorOrEqual方法时,请按以下代码示例所示使用。这种优化减少了不必要的数据检索。

使用批量写入和更新操作。您可以使用批处理操作将多个写入或更新操作分组为单个数据库事务。这减少了数据库调用的次数,并且可以显著提高涉及多条记录的操作的性能。
在以下示例中,左边的代码在循环中执行写入操作,这会降低应用程序的性能。您可以使用批量写入操作来优化此代码:在
WHILE循环的每次迭代中,您都要向批处理中添加记录,直到批处理大小达到预先确定的大小 100。然后,您可以在批次达到预先确定的批次大小时将其刷新,然后将所有剩余的记录刷新到数据库中。这在处理需要更新的大型数据集的场景中特别有用。
添加索引。添加索引是一种数据库级优化,可以显著提高查询性能。索引允许数据库快速查找具有特定列值的行,而无需扫描整个表。对
WHERE子句、JOIN条件或ORDER BY语句中经常使用的列使用索引。对于大型表或快速数据检索至关重要时,这一点尤其重要。
SQLExecution生成器
SQLExecutionBuilder 是一个灵活的 API,您可以使用它来控制将要执行的 SQL 查询,INSERT通过使用和使用SELECT动态表名仅获取某些列。在以下示例中, SQLExecutorBuilder 使用您定义的自定义查询。

在 DAOManager 和 SQLExecution生成器之间进行选择
这两者之间的选择 APIs 取决于您的具体用例:
DAOManager 当你希望 AWS Blu Age Runtime 生成 SQL 查询而不是自己编写查询时使用。
当您需要编写 SQL 查询以利用数据库特定的功能或编写最佳 SQL 查询时,请选择 B SQLExecution uilder。
优化策略:缓存
在现代化应用程序中,实施有效的缓存策略可以显著减少数据库调用并缩短响应时间。这有助于弥合大型机和云环境之间的性能差距。
在 AWS Blu Age 应用程序中,简单的缓存实现使用内部数据结构,例如哈希映射或数组列表,因此您不必设置需要成本和代码重组的外部缓存解决方案。这种方法对于经常访问但不经常更改的数据特别有效。在实现缓存时,请考虑内存限制和更新模式,以确保缓存的数据保持一致并提供实际的性能优势。
成功缓存的关键是确定要缓存的正确数据。在以下示例中,左边的代码始终从表中读取数据,而当本地哈希映射没有给定键的值时,右边的代码从表中读取数据。 cacheMap是一个在程序上下文中创建的哈希映射对象,并在程序上下文的清理方法中清除。
使用以下方法进行缓存 DAOManager:

使用 SQLExecution生成器缓存:

优化策略:业务逻辑优化
业务逻辑优化的重点是重构从 AWS Blu Age 自动生成的代码,以更好地与现代架构功能保持一致。当生成的代码保持与传统大型机代码相同的逻辑结构时,这就变得必要了,这对于现代系统来说可能不是最佳选择。目标是提高性能,同时保持与原始应用程序的功能等同性。
这种优化方法不仅仅是简单的 API 调整和缓存策略。它涉及更改应用程序处理数据和与数据库交互的方式。常见的优化措施包括避免为简单更新进行不必要的读取操作,删除冗余的数据库调用,以及重组数据访问模式以更好地与现代应用程序架构保持一致。下面是几个示例:
直接在数据库中更新数据。使用直接 SQL 更新来重构业务逻辑,而不是使用循环进行多项 DAOManager 操作。例如,以下代码(左侧)会调用多个数据库并使用过多的内存。具体而言,它在循环中使用多个数据库读取和写入操作、单独更新而不是批处理,以及为每次迭代创建不必要的对象。
以下经过优化的代码(右侧)使用单个 Direct SQL 更新操作。具体而言,它使用单个数据库调用而不是多个调用,并且不需要循环,因为所有更新都是在单个语句中处理的。这种优化提供了更好的性能和资源利用率,并降低了复杂性。它可以防止 SQL 注入,提供更好的查询计划缓存,并有助于提高安全性。

注意
始终使用参数化查询来防止 SQL 注入并确保适当的事务管理。
减少冗余的数据库调用。冗余的数据库调用会显著影响应用程序性能,尤其是当它们发生在循环内时。一种简单但有效的优化技术是避免多次重复相同的数据库查询。以下代码比较演示了将
retrieve()数据库调用移到循环之外如何防止重复执行相同的查询,从而提高效率。
使用 SQL
JOIN子句减少数据库调用。实现 SQLExecution Builder 以最大限度地减少对数据库的调用。 SQLExecutionBuilder 可以更好地控制 SQL 的生成,对于 DAOManager 无法有效处理的复杂查询特别有用。例如,以下代码使用多个 DAOManager 调用:List<Employee> employees = daoManager.readAll(); for(Employee emp : employees) { Department dept = deptManager.readById(emp.getDeptId()); // Additional call for each employee Project proj = projManager.readById(emp.getProjId()); // Another call for each employee processEmployeeData(emp, dept, proj); }优化的代码在 SQLExecution Builder 中使用单个数据库调用:
SQLExecutionBuilder builder = new SQLExecutionBuilder(); builder.append("SELECT e.*, d.name as dept_name, p.name as proj_name"); builder.append("FROM employee e"); builder.append("JOIN department d ON e.dept_id = d.id"); builder.append("JOIN project p ON e.proj_id = p.id"); builder.append("WHERE e.status = ?", "ACTIVE"); List<Map<String, Object>> results = builder.execute(); // Single database call for(Map<String, Object> result : results) { processComplexData(result); }
同时使用优化策略
这三种策略协同作用: APIs 提供高效数据访问的工具,缓存可减少重复数据检索的需求,业务逻辑优化可确保以最有效的方式使用 APIs 这些工具。定期监控和调整这些优化措施可确保持续提高性能,同时保持现代化应用程序的可靠性和功能性。成功的关键在于了解何时以及如何根据应用程序的特征和性能目标应用每种策略。
工具
JProfiler
是一款专为开发人员和性能工程师设计的 Java 分析工具。它分析 Java 应用程序并帮助识别性能瓶颈、内存泄漏和线程问题。 JProfiler 提供 CPU、内存和线程分析以及数据库和 Java 虚拟机 (JVM) 监控,以深入了解应用程序行为。 注意
作为替代方案 JProfiler,你可以使用 Java Visual
VM。这是一款适用于 Java 应用程序的免费开源性能分析和监控工具,可实时监控 CPU 使用率、内存消耗、线程管理和垃圾收集统计信息。由于 Java VisualVM 是一个内置的 JDK 工具,因此它比 JProfiler 满足基本分析需求更具成本效益。 pgadmin
是一款适用于 PostgreSQL 的开源管理和开发工具。它提供了一个图形界面,可帮助您创建、维护和使用数据库对象。您可以使用 pgadmin 执行各种任务,从编写简单的 SQL 查询到开发复杂的数据库。它的功能包括突出显示语法的 SQL 编辑器、服务器端代码编辑器、用于 SQL、shell 和批处理任务的调度代理,以及为新手和有经验的 PostgreSQL 用户提供的所有 PostgreSQL 功能的支持。
最佳实践
确定性能热点:
在开始优化之前,请记录基准性能指标。
根据业务需求设定明确的绩效改进目标。
进行基准测试时,请禁用详细日志记录,因为它可能会影响性能。
设置性能测试套件并定期运行。
使用最新版本的 pgadmin。(旧版本不支持
EXPLAIN查询计划。)对于基准测试,请在优化完成 JProfiler 后分离,因为这会增加延迟。
对于基准测试,请确保在启动模式而不是调试模式下运行服务器,因为调试模式会增加延迟。
优化策略:
在
application.yaml文件中配置SetMaxResults值,根据您的系统规格指定大小合适的批次。根据数据量和内存限制配置SetMaxResults值。
更改SetOnGreatorOrEqual为 “SetOnEqual仅在后续调用时”
.readNextEqual()。在批量写入或更新操作中,请单独处理最后一个批次,因为它可能小于配置的批次大小,并且可能被写入或更新操作错过。
缓存:
引入用于缓存的字段
processImpl,这些字段在每次执行时都会发生变化,应始终在此上下文中定义。processImpl还应使用doReset()或cleanUp()方法清除这些字段。实现内存缓存时,请正确调整缓存的大小。存储在内存中的超大缓存会占用所有资源,这可能会影响应用程序的整体性能。
SQLExecution生成器:
对于计划在 SQLExecution Builder 中使用的查询,请使用密钥名称,例如
PROGRAMNAME_STATEMENTNUMBER。使用 SQLExecution Builder 时,请务必检查该
Sqlcod字段。此字段包含一个值,用于指定查询是否正确执行或遇到任何错误。使用参数化查询来防止 SQL 注入。
业务逻辑优化:
在重构代码时保持功能等同性,并对相关的程序子集运行回归测试和数据库比较。
保留分析快照以进行比较。
操作说明
| Task | 描述 | 所需技能 |
|---|---|---|
安装和配置 JProfiler。 |
| 应用程序开发人员 |
安装和配置 pgadmin。 | 在此步骤中,您将安装并配置用于查询数据库的数据库客户端。这种模式使用 PostgreSQL 数据库和 pgadmin 作为数据库客户端。如果您使用的是其他数据库引擎,请按照相应数据库客户端的文档进行操作。
| 应用程序开发人员 |
| Task | 描述 | 所需技能 |
|---|---|---|
在您的 AWS Blu Age 应用程序中启用 SQL 查询日志记录。 | 在 Bl AWS u Age 应用程序 | 应用程序开发人员 |
生成和分析查询 | 有关详细信息,请参阅 “架构” 部分。 | 应用程序开发人员 |
创建 JProfiler 快照以分析执行缓慢的测试用例。 |
| 应用程序开发人员 |
分析 JProfiler 快照以确定性能瓶颈。 | 按照以下步骤分析 JProfiler 快照。
有关使用的更多信息 JProfiler,请参阅 “架构” 部分和JProfiler 文档 | 应用程序开发人员 |
| Task | 描述 | 所需技能 |
|---|---|---|
在实施优化之前,请先建立性能基准。 |
| 应用程序开发人员 |
| Task | 描述 | 所需技能 |
|---|---|---|
优化读取呼叫。 | 使用该 DAOManager SetMaxResults方法优化数据检索。有关此方法的更多信息,请参阅 “架构” 部分。 | 应用程序开发者, DAOManager |
重构业务逻辑以避免多次调用数据库。 | 使用 SQL | 应用程序开发者、 SQLExecution生成器 |
重构代码以使用缓存来减少读取调用的延迟。 | 有关此技术的信息,请参阅 “架构” 部分中的缓存。 | 应用程序开发人员 |
重写使用多个 DAOManager 操作进行简单更新操作的低效代码。 | 有关直接更新数据库中数据的更多信息,请参阅 “架构” 部分中的业务逻辑优化。 | 应用程序开发人员 |
| Task | 描述 | 所需技能 |
|---|---|---|
在保持功能等效性的同时,以迭代方式验证每项优化更改。 |
注意使用基准指标作为参考,可以确保准确衡量每项优化的影响,同时保持系统的可靠性。 | 应用程序开发人员 |
故障排除
| 事务 | 解决方案 |
|---|---|
当你运行现代应用程序时,你会看到一个带有错误的异常 | 要解决此问题,请执行以下操作:
|
您已经添加了索引,但没有看到任何性能改进。 | 请按照以下步骤确保查询引擎正在使用索引:
|
你遇到了一个 out-of-memory例外。 | 验证代码是否释放了数据结构所占用的内存。 |
Batch 写入操作会导致表中缺少记录 | 查看代码,确保在批次计数不为零时执行额外的写入操作。 |
SQL 日志记录不会出现在应用程序日志中。 |
|
相关资源
使用 AWS Blu Age 自动重构应用程序(AWS Mainframe Modernization 用户指南)