作者: Eugen Paraschiv
翻译: 雁惊寒
本文首先介绍了负载测试, 基于 APM 工具的应用程序和服务器监控, 随后介绍了编写高性能 Java 代码的一些最佳实践.
最后研究了 JVM 特定的调优技巧, 数据库端的优化和架构方面的调整. 以下是译文.
介绍
在这篇文章中, 我们将讨论几个有助于提升 Java 应用程序性能的方法. 我们首先将介绍如何定义可度量的性能指标, 然后看看有哪些工具可以用来度量和监控应用程序性能, 以及确定性能瓶颈.
我们还将看到一些常见的 Java 代码优化方法以及最佳编码实践. 最后, 我们将看看用于提升 Java 应用程序性能的 JVM 调优技巧和架构调整.
请注意, 性能优化是一个很宽泛的话题, 而本文只是对 JVM 探索的一个起点.
性能指标
在开始优化应用程序的性能之前, 我们需要理解诸如可扩展性, 性能, 可用性等方面的非功能需求.
以下是典型 web 应用程序常用的一些性能指标:
应用程序平均响应时间
系统必须支持的平均并发用户数
在负载高峰期间, 预期的每秒请求数
这些指标可以通过使用多种监视工具监测到, 它们对分析性能瓶颈和性能调优有着非常大的作用.
示例应用程序
我们将使用一个简单的 Spring Boot Web 应用程序作为示例, 在这篇文章中有相关的介绍. 这个应用程序可用于管理员工列表, 并对外公开了添加和检索员工的 REST API.
我们将使用这个程序作为参考来运行负载测试, 并在接下来的章节中监控各种应用指标.
找出性能瓶颈
负载测试工具和应用程序性能管理 (APM) 解决方案常用于跟踪和优化 Java 应用程序的性能. 要找出性能瓶颈, 主要就是对各种应用场景进行负载测试, 并同时使用 APM 工具对 CPU,IO, 堆的使用情况进行监控等等.
Gatling 是进行负载测试最好的工具之一, 它提供了对 HTTP 协议的支持, 是 HTTP 服务器负载测试的绝佳选择.
Stackify 的 Retrace 是一个成熟的 APM 解决方案. 它的功能很丰富, 对确定应用程序的性能基线很有帮助. Retrace 的关键组件之一是它的代码分析功能, 它能够在不减慢应用程序的情况下收集运行时信息.
Retrace 还提供了监视基于 JVM 应用程序的内存, 线程和类的小部件. 除了应用程序本身的指标之外, 它还支持监视托管应用程序的服务器的 CPU 和 IO 使用情况.
因此, 像 Retrace 这样功能全面的监控工具是解锁应用程序性能潜力的第一步. 而第二步则是在你的系统上重现真实使用场景和负载.
说起来容易, 做起来难, 而且了解应用程序当前的性能也非常重要. 这就是我们接下来要关注的问题.
Gatling 负载测试
Gatling 的模拟测试脚本是用 Scala 编写的, 但该工具还附带了一个非常有用的图形界面, 可用于记录具体的场景, 并生成 Scala 脚本.
在运行模拟脚本之后, Gatling 会生成一份非常有用的, 可用于分析的 html 报告.
定义场景
在启动记录器之前, 我们需要定义一个场景, 表示用户在浏览 Web 应用时发生的事情.
在我们的这个例子中, 具体的场景将是 "启动 200 个用户, 每个用户发出一万个请求."
配置记录器
根据 "Gatling 的第一步" 所述, 用下面的代码创建一个名为 EmployeeSimulation 的 scala 文件:
classEmployeeSimulationextendsSimulation{val scn = scenario("FetchEmployees").repeat(10000) { exec(http("GetEmployees-API").get("http://localhost:8080/employees").check(status.is(200)) ) }setUp(scn.users(200).ramp(100))}
运行负载测试
要执行负载测试, 请运行以下命令:
$GATLING_HOME/bin/gatling.sh-sbasic.EmployeeSimulation
对应用程序的 API 进行负载测试有助于发现及其细微的并且难以发现的错误, 如数据库连接耗尽, 高负载情况下的请求超时, 因为内存泄漏而导致堆的高使用率等等.
监控应用程序
要使用 Retrace 进行 Java 应用程序的开发, 首先需要在 Stackify 上申请免费试用账号. 然后, 将我们自己的 Spring Boot 应用程序配置为 Linux 服务.
我们还需要在托管应用程序的服务器上安装 Retrace 代理, 按照这篇文章所述的操作即可.
Retrace 代理和要监控的 Java 应用程序启动后, 我们就可以到 Retrace 仪表板上单击 AddApp 按钮添加应用了. 添加应用完成之后, Retrace 将开始监控应用程序了.
找到最慢的那个点
Retrace 会自动监控应用程序, 并跟踪数十种常见框架及其依赖关系的使用情况, 包括 SQL,MongoDB,Redis,Elasticsearch 等等. Retrace 能帮助我们快速确定应用程序为什么会出现如下性能问题:
某个 SQL 语句是否会拖慢系统的速度?
Redis 突然变慢了吗?
特定的 HTTP Web 服务宕了, 还是变慢了?
例如, 下面的图形展示了在一段给定的时间内速度最慢的组件.
想了解更多 Java, 程序员相关内容, 搜索微信公众号 "速学 Java", 还有资料等你来拿~
来源: http://www.jianshu.com/p/82f95f7596df