我的上一篇文章描述了如何使用JMeter完成异步REST / HTTP服务的压力测试或负载测试。 但是,运行这样的测试通常表明被测系统不能很好地应对不断增加的负载。 现在的问题是如何找到瓶颈?

深入研究代码以检测可疑部分可能是另一种选择。 但是考虑到潜在的巨大代码库,因此考虑到瓶颈隐藏1的众多可能性,这似乎不太有希望。 幸运的是,有一些工具可以在遥测2的基础上提供有效的分析功能。 记录和检查此类测量值通常被称为概要分析,而本博文简要介绍了如何使用Yourkit 3进行此操作。

首先,我们推出我们的SUT( 体系ü的nDer 牛逼 EST),并使用JMeter的建立系统的负荷。 为此,JMeter可能执行一个测试方案,该方案模拟了多个用户向SUT发送大量请求的情况。 在测试场景中定义的测试计划 。 后者可能包含侦听器 ,这些侦听器允许捕获请求的执行时间并提供统计信息,例如最大/最小/可用性请求持续时间,偏差,吞吐量等。 这就是我们检测到我们的系统扩展性不佳的方式…

在发现之后,我们使Yourkit可以检索遥测。 因此,SUT的VM由特殊的探查器代理启动。 探查器工具提供了多个视图,这些视图允许实时检查CPU利用率,内存消耗等。 但是,为了全面分析例如SUT在负载下的性能,Yourkit需要通过所谓的快照捕获代理提供的CPU信息。

建议在单独的计算机上运行SUT,JMeter和Yourkit,以避免篡改测试结果。 在同一台机器上运行例如SUT和JMeter可能会降低吞吐量,因为JMeter线程可能会消耗大量可用的计算时间。

考虑到此设置,我们将介绍一个概要分析会话的小示例。 以下代码段摘录了我们用作SUT的基于JAX-RS的服务4

@Path( '/resources/{id}' )
public class ExampleResourceProvider {private List<ExampleResource> resources;[...]@Override@GET@Produces( MediaType.TEXT_PLAIN )public String getContent( @PathParam( 'id' ) String id ) {ExampleResource found = NOT_FOUND;for( ExampleResource resource : resources ) {if( resource.getId().equals( id ) ) {found = resource;}}return found.getMessage();}

该服务在ExampleResource实例列表中执行查找。 ExampleResource对象只是将标识符映射到以String表示的消息。 找到给定标识符的消息将返回。 在使用GET请求调用服务时,您可以使用浏览器测试结果:

出于演示目的,服务的粘合代码以无序方式使用500000个元素初始化列表。

一旦运行了SUT,就可以使用JMeter在负载下对其进行设置。 该测试计划一次执行大约100个并发请求。 如下图所示,平均请求执行时间约为1秒。

Yourkit在JMeter测试计划执行期间记录的CPU遥测揭示了请求执行时间长的原因。 选择配置文件快照的“ Hot spots选项卡显示列表迭代消耗了大约72%的CPU利用率。 查看列出了所选热点方法的调用者树的Back Traces视图,我们发现示例服务方法导致列表迭代。

因此,我们在下一步中更改服务实现,以对有序列表使用二进制搜索进行ExampleResource查找。

@Override@GET@Produces( MediaType.TEXT_PLAIN )public String getContent( @PathParam( 'id' ) String id ) {ExampleResource key = new ExampleResource( id, null );int position = Collections.binarySearch( resources, key );return resources.get( position ).getMessage();}

之后,我们重新运行JMeter测试计划:

现在平均请求大约需要3毫秒,这是一个很大的改进。

查看相应的CPU性能分析会话的Hot spots ,可以确认由我们的方法引起的瓶颈已经消失。

诚然,以上示例中的问题似乎非常明显。 但是我们在生产代码中发现了一个非常相似的代码,它隐藏在系统的深度中(可耻的是……)。 重要的是要注意,在开始压力和负载测试之前,问题并没有变得很明显5

我想我们在找到原因之前(如果有的话)将花费大量时间手动检查代码库。 然而,剖析会议将我们直接指出了所有邪恶的根源。 通常情况下,实际问题并不难解决。 因此,概要分析可以帮助您更有效地处理一些工作。

至少它对我有用-顺便说一下-这也很有趣

  1. 请注意,导致瓶颈的代码也可能属于第三个库。 ↩
  2. 当我现在在一个客户项目中进行这种分析时,我想到了写这篇文章的想法↩
  3. 我在这里没有做任何工具广告或评级-我只是使用我熟悉的工具来给出一个更抽象的概念的可复制示例。 市场上有很多更好的工具可以满足您的需求↩
  4. 请注意,本文中的代码片段的唯一目的是作为如何查找和解决性能瓶颈的示例。 这些代码片段编写得很差,不应以任何方式重复使用! ↩
  5. 根据我的经验,新创建的代码库包含其中的一些块是很常见的。 因此,有这样的测试是必须的,以便找到性能问题的顾客发现他们在生产之前... ↩

参考:来自JCG合作伙伴 Frank Appel的JMeter和Yourkit对REST / HTTP服务的性能分析,位于Code Affine博客上。

翻译自: https://www.javacodegeeks.com/2012/11/performance-analysis-of-resthttp-services-with-jmeter-and-yourkit.html

使用JMeter和Yourkit进行REST / HTTP服务的性能分析相关推荐

  1. jmeter性能分析_使用JMeter和Yourkit进行REST / HTTP服务的性能分析

    jmeter性能分析 我的上一篇文章描述了如何使用JMeter完成异步REST / HTTP服务的压力测试或负载测试. 但是,运行这样的测试通常表明被测系统不能很好地应对增加的负载. 现在的问题是如何 ...

  2. 【性能测试】JMeter聚合报告和性能分析

    一.简介 2-5-10原则 一般情况下,当用户能够在2秒以内得到响应时,会感觉系统的响应很快: 当用户在2-5秒之间 得到响应时,会感觉系统的响应速度还可以: 当用户在5-10秒以内得到响应时,会感觉 ...

  3. Go 服务进行自动采样性能分析的方案设计与实现

    线上服务的性能分析,一直以来都是比较难的点,主要是难在无法在性能出现异常的当时捕捉到现场信息.有人可能会说,这有什么难的,直接用 Go 工具集里的 pprof 访问一下,进行采样拿下来分析就行了.话虽 ...

  4. 软件性能测试分析与调优实践之路-JMeter对RPC服务的性能压测分析与调优-手稿节选

    一.JMeter 如何通过自定义Sample来压测RPC服务 RPC(Remote Procedure Call)俗称远程过程调用,是常用的一种高效的服务调用方式,也是性能压测时经常遇到的一种服务调用 ...

  5. 记一次Socket.IO长链服务的性能压测

    网易云信IM系统中的Web版使用了Socket.IO实现浏览器环境下的长链服务:区别于常规的长链服务,为该服务的压测提出了一些新的挑战,本文总结了测试过程中的一些收获供参考. Part1 测试工具选项 ...

  6. Web服务端性能提升实践

    随着互联网的不断发展,日常生活中越来越多的需求通过网络来实现,从衣食住行到金融教育,从口袋到身份,人们无时无刻不依赖着网络,而且越来越多的人通过网络来完成自己的需求. 作为直接面对来自客户请求的Web ...

  7. Nagios—服务和性能监控

    Nagios-服务和性能监控 简介: Nagios是一个监视系统运行状态和网络信息的监视系统.Nagios能监视所指定的本地或远程主机以及服务,同时提供异常通知功能等. Nagios可运行在Linux ...

  8. Linux中sysstat服务,Linux 性能优化工具包 sysstat 以及 sysstat 服务

    1. sysstat service 1.1. /etc/cron.d/sysstat Linux 下的性能分析,少不了要使用 sysstat 工具包中的命令.同时 sysstat 服务会自动每个10 ...

  9. android6.0源码分析之AMS服务源码分析

    activitymanagerservice服务源码分析 1.ActivityManagerService概述 ActivityManagerService(以下简称AMS)作为Android中最核心 ...

最新文章

  1. 自学python要多久才能学会-怎么自学python,大概要多久?
  2. 深入浅出MFC:DDX_Control本质探究
  3. 取消一个请求(Cancel)
  4. 成本管控难题怎么破?BI大神带你一步步拆解分析,节省成本390万
  5. Sentinel系统规则_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0044
  6. 关于VBA中【按钮的改名】 和 【函数名字的改变】
  7. Oracle VM VirtualBox UUID already exists 问题解决
  8. linux给用户user1设置密码,Linux用户管理之useradd、passwd命令讲解
  9. 体系结构复习2——指令级并行(分支预测和VLIW)
  10. 计算机辅助设计学哪个软件,高校有必要进行计算机辅助设计软件的教学.pdf
  11. Python3入门教程:Excel 基础操作(上)
  12. 设计模式学习笔记(一)
  13. 风云编程python基础语法(6)
  14. java 私有全局变量_java中的全局变量
  15. 一次云服务器购买经历,给个人建站的小白做些参考
  16. JDBC 学习笔记 day02 用 PreparedStatement 实现 CRUD 操作
  17. 基于Echarts的销售企业经营数据分析-散点图
  18. 基于联邦学习的多源异构数据融合算法
  19. 趣说西门子的经济型PLC S7-200SMART和S7-1200
  20. 嵌入式系统开发笔记62:分数等级转换(switch)

热门文章

  1. 转-聚合查询变慢-详解Elasticsearch的Global Ordinals与High Cardinality
  2. 机器学习评价指标大汇总
  3. java编译器API——使用编译工具
  4. 如何导入数据模板到MVC
  5. 客户端服务端防止用户重复提交表单
  6. 使用poi统计工作职责
  7. java使用迭代器删除元素_使用Java从地图中删除元素
  8. HTTP缓存与Spring示例
  9. java对响应数据做封装_1000种对Java的响应没有死
  10. String#repeat来到Java吗?