使用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.pswp.cn/news/370615.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370615.shtml
英文地址,請注明出處:http://en.pswp.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 標記時顯示…