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

jmeter性能分析

我的上一篇文章描述了如何使用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在Code Affine博客上通过JMeter和Yourkit对REST / HTTP服务进行了性能分析 。

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

jmeter性能分析

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

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

相关文章

JAVA错误:无法从静态上下文中引用非静态变量 this

新学习&#xff1a;构造方法的重载&#xff0c;给成员变量赋值 错误代码&#xff1a; class Student {public static void main(String[] args) {Person p new Person();p.setAge(24);p.setName("杨洋");p.show();System.out.println("Hello World!");}…

datetime建立索引有用吗_超全的数据库建表、SQL、索引规范

背景因为工作岗位的原因&#xff0c;负责制定了关于后端组数据库的规约规范&#xff0c;作为所有产品线的规范&#xff0c;历经几版的修改&#xff0c;最终形成下边的文本&#xff0c;规范在整个后端执行也有大半年的时间&#xff0c;对于整个团队在开发阶段就减少不恰当的建表…

linux找不到动态链接库 .so文件的解决方法

如果使用自己手动生成的动态链接库.so文件&#xff0c;但是这个.so文件&#xff0c;没有加入库文件搜索路劲中&#xff0c;程序运行时可能会出现找不到动态链接库的情形。 可以通过ldd命名来查看可执行文件依赖的动态链接库&#xff0c;如下(其中D为可执行程序)&#xff1a; 其…

mui的学习图片预览

css部分 <link href"./css/mui.min.css" rel"stylesheet"/> <style> html,body {margin: 0px;padding: 0px;background-color: white;} .mui-preview-image.mui-fullscreen { position: fixed;z-index: 20; background-co…

Kafka Connect在MapR上

在本周的白板演练中&#xff0c;MapR的高级产品营销经理Ankur Desai描述了Apache Kafka Connect和REST API如何简化和提高在处理来自包括旧数据库或数据仓库在内的各种数据源的流数据时的敏捷性。 他还解释了使用MapR Streams与Kafka进行数据传输时此体系结构的差异。 其他资源…

LeetCode--palindrome-number回文数

1、问题 Determine whether an integer is a palindrome. Do this without extra space. click to show spoilers. Some hints: Could negative integers be palindromes? (ie, -1) If you are thinking of converting the integer to string, note the restriction of u…

如何取消 登录_LSAT | 退考、缺考、取消成绩,各自的区别和流程是怎样的?

专注顶尖法学院JD/LLM申请指导咨询&#xff0c;更多内容请关注联才微信公众号&#xff1a;wisdom-linked排版 | 联才; 编辑 | 联才掐指一算&#xff0c;现在距离6/23亚洲场LSAT考试只剩下15天的时间了&#xff0c;你目前的备考进展如何呢&#xff1f;如果你拿不准是否要去考试&…

gtest 编译、安装和使用

本例以 gtest-1.7.0 为例进行讲解。一、要求&#xff1a;1. 安装 cmake二、编译1. 下载 gtest 源码包&#xff0c;并解压&#xff0c;如&#xff1a;/home/hdc/gtest-1.7.0&#xff1b; 2. 编译 gtest 动态库&#xff0c;进入 gtest-1.7.0 目录&#xff0c;编辑 CMakeLists.tx…

ReentrantReadWriteLock读写锁的使用

类ReentrantLock具有完全互斥排他的效果&#xff0c;即同一时间只有一个线程在执行ReentrantLock.lock()后面的代码。这样虽然保证了线程的安全性&#xff0c;但是效率低下。JDK提供了ReentrantReadWriteLock读写锁&#xff0c;使用它可以加快效率&#xff0c;在某些不需要操作…

idea如何把包变为模块_让我们将包变成模块系统!

idea如何把包变为模块使用构建系统将许多项目分为模块/子项目&#xff08; Maven &#xff0c; Gradle &#xff0c; SBT …&#xff09;&#xff1b; 编写模块化代码通常是一件好事。 将代码分为构建模块主要用于&#xff1a; 隔离代码部分&#xff08;减少耦合&#xff09; …

VS2017无法启动

新安装了VS2017&#xff0c;安装没问题&#xff0c;但是总出现启动时没反应的状况&#xff0c;鼠标双击后转圈&#xff0c;然后就没然后了。。 解决办法&#xff1a; 第一步&#xff1a; 开始-->所有程序-->Microsoft Visual Studio 2017文件夹-->VisualStudio Tool…

gm怎么刷东西 rust_Rust语言:解引用详述,搞不明白这个概念,趁早放弃Rust

Rust是内存安全的&#xff0c;对新手来说&#xff0c;最大的困难是可恶的编译器&#xff0c;在其他语言上面叱咤风云&#xff0c;偏偏被Rust搞到崩溃。所以&#xff0c;大家都戏谑道&#xff0c;Rust是面向编译器编程。和编译器做斗争的过程中&#xff0c;遇到最多的是&#xf…

VS2010中使用gtest简单案例

1、下载googletest代码 https://github.com/google/googletest 2、解压并进入找到msvc文件夹 googletest-master\googletest-master\googletest\msvc 3、打开gtest.sln文件 4、编译gtest和gtest_main工程&#xff0c;生成gtestd.lib和gtest_maind.lib&#xff0c;将这两个静…

记录一次Oracle注入绕waf

这个注入挺特殊的&#xff0c;是ip头注入。我们进行简单的探测: 首先正常发起一次请求&#xff0c;我们发现content-type是76 探测注入我习惯性的一个单引号: 一个单引号我发现长度还是76 我开始尝试单引号&#xff0c;双引号一起: 我失败了长度还是76 一般sql注入输入单引号一…

生成字节码

在这篇文章中&#xff0c;我们将看到如何为我们的语言生成字节码。 到目前为止&#xff0c;我们已经看到了如何构建一种语言来表达我们想要的东西&#xff0c;如何验证该语言&#xff0c;如何为该语言构建编辑器&#xff0c;但实际上我们仍然无法运行代码。 是时候解决这个问题…

Java迭代器contains的问题

功能&#xff1a;ArrayList去除集合中字符串的重复值(字符串的内容相同)&#xff0c;思路&#xff1a;创建新集合方式。 第一种编译运行没问题&#xff0c;第二种写法出错&#xff0c;原因是不可以两次使用it.next()。 错误提示&#xff1a;Exception in thread "main&q…

ad如何镜像器件_使用 Dockerfile 制作镜像

前面几篇文章已经给大家介绍了 Docker 的基本概念&#xff0c;相信大家也会使用 Docker 运行自己想要的容器了。但是只有学会制作镜像&#xff0c;才能将 Docker 应用到我们的项目中去。下面我们就来学习如何使用 Dockerfile 来制作镜像。Dockerfile 是一个文本文件&#xff0c…

centos7.5部署ELk

第1章 环境规划 1.1 ELK介绍 ELK是ElasticSerach、Logstash、Kibana三款产品名称的首字母集合&#xff0c;用于日志的搜集和搜索。 Elasticsearch&#xff1a;是一个开源分布式搜索引擎&#xff0c;提供搜集、分析、存储三大功能&#xff0c;特点是分布式、零配置、自动发…

使用Google Test的一个简单例子

0. 引子 本例是从 gtest-1.5.0 自带的 sample 中的 sample1 改写而来&#xff0c;笔者只添加了一个求 n 的阶层的函数&#xff0c;如下。 void Factorial(int n, int & result ) { result 1; for (int i 1; i < n; i) result * i; } 目的是想测试像这样将返回值放在参…

Java静态方法与非静态方法的泛型

Java中&#xff0c;非静态方法可以使用类的泛型&#xff0c;也可以定义自己的泛型&#xff1b;静态方法由于随着类的加载而加载&#xff0c;不能访问类的泛型&#xff08;因为在创建对象的时候才确定&#xff09;&#xff0c;因此必须定义自己的泛型类型。 详细请参考&#xf…