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

我的上一篇文章描述了如何使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyUI 加载时需要显示和隐藏 panel(面板)内容破版问题

1.当页面加载的完成时,如果面板中的内容是未加载的如果把他的状态从隐藏变为显示会导致破版,页面信息显示不全 2.这时需要刷新面板$(#id).panel(open).panel(refresh); 3.它就会重新加载转载于:https://www.cnblogs.com/eagle-xie/p/6892706.html

java中间件_90%的Java程序员,都扛不住这波消息中间件的面试四连炮!

概述大家平时也有用到一些消息中间件(MQ)&#xff0c;但是对其理解可能仅停留在会使用API能实现生产消息、消费消息就完事了。对MQ更加深入的问题&#xff0c;可能很多人没怎么思考过。比如&#xff0c;你跳槽面试时&#xff0c;如果面试官看到你简历上写了&#xff0c;熟练掌握…

python 取array并集_Python内置数据结构原理与性能简易分析

ins ngladc文末左下方阅读原文指向了本人博客链接&#xff0c;不含广告。参考资料中的相关链接&#xff0c;可以在博客文章的最下方获取。推荐苹果手机用户使用浅色模式观看。前言 对于一些算法题&#xff0c;可以使用Python自带的内置函数解决。但很多时候用就用了&#xff0c…

ae合成复制脚本_稀缺资源—这几个AE脚本使用频率很高,赶紧收藏吧!

「第442期」毫无疑问&#xff0c;AE已经成为目前制作短视频比较主流的软件&#xff0c;效果的多样化深受很多创作者的喜爱。随着对软件的熟悉&#xff0c;越发觉得AE主要是基于多图层控制的软件。如果制作一些简单的效果&#xff0c;几个图层几个滤镜就可以搞定&#xff0c;但如…

android activity and fragment活动周期

1.状态 /* 每个活动一共有四种状态 *&#xff1a;1。运行状态&#xff0c;就是栈顶的那个 * 2。暂停状态&#xff1a;就是不处于栈顶&#xff0c;但是依然可见&#xff0c;比如对话框下面的界面 * 3。停止状态&#xff1a;不处于栈顶&#xff0c;并且不可见 * 4。销毁状态 * */…

html css基础知识

1 这是自己学习html时候做的一些记录&#xff0c;供大家参考 <!--2 块和内联3 块元素:独占一行的元素4 div p h ul5 div没有任何语义&#xff0c;就是一个纯粹的快元素6 就是为了方便布局7 …

番石榴的ListenableFuture

Guava中的ListenableFuture试图为Future对象定义一致的API&#xff0c;以注册完成回调。 通过在Future完成时添加回调的功能&#xff0c;我们可以异步有效地响应传入的事件。 如果您的应用程序与许多将来的对象高度并发&#xff0c;我强烈建议您尽可能使用ListenableFuture 。 …

程序员的幸福感和颈椎病

脖子一直疼&#xff01; 去医院检查&#xff0c;拍片子的医生在造影室里冲我喊&#xff1a; “小伙子&#xff0c;你多大年纪啦&#xff1f;” 我说&#xff1a;“我三十来岁&#xff0c;咋啦” 医生说&#xff1a;“怎么这么年轻就得这种病啊&#xff01;” 我当时腿就有点软&…

python实现词语相似度计算分析_相似度计算的方法及Python实现

现实生活中&#xff0c;我们经常提到距离这个词&#xff0c;本文谈的相似度就是基于距离定义的&#xff0c;当两个向量之间的距离特别小时&#xff0c;就说这俩个向量相似度高&#xff0c;反之相似度不高。所以&#xff0c;衡量相似度的指标就是距离度量。经常使用的相似度计算…

poll函数_I/O复用 - 三组I/O复用函数的比较

在之前的文章中 I/O复用 - epoll 和 I/O复用 - select&poll 中我们讨论了三组I/O复用的系统调用&#xff0c;这3组系统调用都能同时监听多个文件描述符。它们将等待由timeout参数指定的超时时间&#xff0c;直到一个或多个文件描述符上有事件发生时返回&#xff0c;返回值是…

HTML适应手机浏览器宽度

在网页的<head>中增加以上这句话&#xff0c;可以让网页的宽度自动适应手机屏幕的宽度: <meta name"viewport" content"widthdevice-width, initial-scale1.0, minimum-scale0.5, maximum-scale2.0, user-scalableyes" /> <meta name&q…

css3画图那些事(三角形、圆形、梯形等)

闲来无事&#xff0c;写写图形。当时巩固一下css3吧.。前端小白&#xff0c;写的不好还请前辈多指教。 三角形 { width: 0;height: 0;border-bottom: 140px solid red ;border-right: 70px solid transparent;border-left: 70px solid transparent; } 圆形 {width: 0px;height…

MyBatis教程– CRUD操作和映射关系–第1部分

CRUD操作 MyBatis是一个SQL Mapper工具&#xff0c;与直接使用JDBC相比&#xff0c;它极大地简化了数据库编程。 步骤1&#xff1a;创建一个Maven项目并配置MyBatis依赖项。 <project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema…

Java开发人员的升级之路

第一部分&#xff1a;对于参加工作一年以内的同学。恭喜你&#xff0c;这个时候&#xff0c;你已经拥有了一份Java的工作。这个阶段是你成长极快的阶段&#xff0c;而且你可能会经常加班。但是加班不代表你就可以松懈了&#xff0c;永远记得我说的那句话&#xff0c;从你入行那…

docker 数据库 mysql_在Docker中体验数据库之MySql

在上一篇在Docker中体验数据库之Mongodb之后&#xff0c;这次记录一下在docker中安装mysql。过程要比Mongodb麻烦一点……参考网址&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/linux-installation-docker.htmlhttps://hub.docker.com/r/mysql/mysql-server/安装过程如…

STL概览——栈( stack )、队列( queue )和优先级队列( priority_queue)

栈&#xff08;stack&#xff09; stack是一种先进后出&#xff08;First In Last Out&#xff0c;FILO&#xff09;的数据结构&#xff0c;它只有一个口&#xff0c;平常在我们写深度优先遍历算法时&#xff0c;&#xff0c;就会用到栈&#xff0c;stack允许我们增加&#xff…

使用JMeter对异步HTTP / REST服务进行压力/负载测试

尽管我一直在使用JMeter进行Web应用程序的压力测试和负载测试好几次&#xff0c;但我们还是花了一些时间才弄清楚如何使用该工具测试基于异步HTTP / REST的服务。 在我们这里&#xff0c;我是指一名程序员&#xff0c; Holger Staudacher &#xff0c;我很荣幸能与当前的一个项…

转义字符的使用和功能python_Python中转义符和格式符的混合使用,python,转义字符,与,格式化...

# coding: utf-8 mon 麻辣小龙虾 #周一麻辣小龙虾 tue 宫保鸡丁 #周二宫保鸡丁 wed 水煮肉片 #周三水煮肉片 thu 果儿拌菜 #周四果儿拌菜 fri 小鸡炖蘑菇 #小鸡炖蘑菇 Cf_price 23 #麻辣小龙虾价格 CK_price 12 #宫保鸡丁价格 BM_price 32 #水煮肉片价格 MV_price 19 …

mock接口开发,excel(读,写,修改)

mock接口开发 首先需要安装 Flask 模块 &#xff1a;pip install flask 然后引用 from flask import request #想获取到请求参数的话&#xff0c;就得用这个 lanxia flask.Flask(__name__) #把这个python文件当做一个web服务 lanxia.server(/login,[ post , get ] )#第…

web前端学习之ruby标记和rt/rp标记

ruby 标记定义ruby注释&#xff08;中文注音或字符&#xff09;。ruby标记与rt标记一同使用。ruby标记由一个或多个字符&#xff08;需要一个解释/发音&#xff09;和一个提供该信息的rt 标记组成&#xff0c;还包括可选的rp标记&#xff0c;定义当浏览器不支持ruby 标记时显示…