日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hprofile教程

發布時間:2024/1/23 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hprofile教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

hprofile教程

@(JAVA)[java]

大部分內容參考http://www.linuxidc.com/Linux/2012-04/58178.htm

J2SE中提供了一個簡單的命令行工具來對java程序的cpu和heap進行 profiling,叫做HPROF。HPROF實際上是JVM中的一個native的庫,它會在JVM啟動的時候通過命令行參數來動態加載,并成為 JVM進程的一部分。

要使用hprof,可以通過在運行java程序時指定-agentlib或者-Xrunhprof參數來使用,它會將cpu、heap等想著信息保存到一份文件中(默認情況是當前目錄的java.hprof.txt。

其實,HPROF產生的profiling數據可以是二進制的,也可以是文本格式的。這些日志可以用來跟蹤和分析 java進程的性能問題和瓶頸,解決內存使用上不優的地方或者程序實現上的不優之處。二進制格式的日志還可以被JVM中的HAT工具來進行瀏覽和分析,用 以觀察java進程的heap中各種類型和數據的情況。

一、HPROF的參數

通過以下命令執行hporf

java -agentlib:hprof[=options] ToBeProfiledClass

或者

java -Xrunhprof[:options] ToBeProfiledClass

HPROF 完整參數列表:

java -agentlib:hprof=helpHPROF: Heap and CPU Profiling Agent (JVM TI Demonstration Code)hprof usage: java -agentlib:hprof=[help]|[=, ...]Option Name and Value Description Default --------------------- ----------- ------- heap=dump|sites|all heap profiling all cpu=samples|times|old CPU usage off monitor=y|n monitor contention n format=a|b text(txt) or binary output a file= write data to file java.hprof[.txt] net=: send data over a socket off depth= stack trace depth 4 interval= sample interval in ms 10 cutoff= output cutoff point 0.0001 lineno=y|n line number in traces? y thread=y|n thread in traces? n doe=y|n dump on exit? y msa=y|n Solaris micro state accounting n force=y|n force output to y verbose=y|n print messages about dumps yObsolete Options ---------------- gc_okay=y|nExamples --------- Get sample cpu information every 20 millisec, with a stack depth of 3:java -agentlib:hprof=cpu=samples,interval=20,depth=3 classname- Get heap usage information based on the allocation sites:java -agentlib:hprof=heap=sites classname

默認情況下,java進程profiling的信息(sites和dump)都會被 寫入到一個叫做java.hprof.txt的文件中。大多數情況下,該文件中都會對每個trace,threads,objects包含一個ID,每一 個ID代表一個不同的觀察對象。通常,traces會從300000開始。

默認,force=y,會將所有��信息全部輸出到output文件中,所以如果含有 多個JVMs都采用的HRPOF enable的方式運行,最好將force=n,這樣能夠將單獨的JVM的profiling信息輸出到不同的指定文件。

interval選項只在 cpu=samples的情況下生效,表示每隔多少毫秒對java進程的cpu使用情況進行一次采集。

msa選項僅僅在Solaris系統下才有效, 表示會使用Solaris下的Micro State Accounting功能

二、hprof的使用方式

1、在eclipse中使用hporfile

2、命令行運行hprof

三、實際例子

注意,進行hprof分析時,會將整個JVM中的情況進行分析,不只是當前的類。

我們可以自己寫一個java應用程序,但是例子 里將使用一個J2SE中已有的java應用程序,javac。

或者使用java -agentlib:hprof=heap=sites Hello.java命令
Heap Allocation Profiles(heap=sites)

以下是對一個java代碼文件運行java編譯 器javac的heap allocation profile日志的一部分:
Command used: javac -J-agentlib:hprof=heap=sites Hello.java
從日志中可以看到程序在運行的每一個部分都消耗了多少內存的heap profile數據。以上日志可以看出,整個程序的heap中有44.73%的被分配給了java.util.zip.ZipEntry對象。同時可以觀 察到,live data的數量跟所有allocated的總數是匹配atch的,這就說明GC可能在HPROF遍歷整個heap搜集信息的很短的時間之前已經做過一次內 存回收了。通常情況下,live data的數量是會稍微少于所有allocated的總數的。

Heap Dump (heap=dump)

該選項用來對java進程的heap進行進行完 全的dump:
Command used: javac -J-agentlib:hprof=heap=dump Hello.java
這樣會產生一個非常大的輸出文件,但是可以用任 何編輯器進行打開和搜索。但是,更好的觀察和分析辦法是通過HAT來進行分析和觀察。所有用heap=sites選項中獲取的信息這里也都可以獲取到。另 外還加上一些特別的細節數據。如對每個對象的內存分配以及其引用的其他所有的對象。
該選項會使用很多的內存,因為它會將所有對象的 內存分配情況全部記錄下來,同時也可能會影響到應用程序本身的性能,因為數據的產生會影響對象分配和資源回收。

CPU Usage Sampling Profiles (cpu=samples)

HPROF可以用來搜集java進程中各個threads的cpu使用情況:
HPROF會對java進程中所有的threads進行周期性的stack traces采集。以上count一列就表示在采集中有多少次的stack trace被HPROF發現,并且是active的(而不是指一個method被執行了多少次)。這些stack traces包括cpu的使用,哪些是cpu消耗熱點。
那么以上日志中可以看出什么信息呢?第一,統計數據的樣本數據是很少的,只有126次的采樣,如 果是比較大的程序編譯,那么應該能夠產生更有代表性的數據。第二,該數據跟以上對heap=sites的采集數據比較匹配,ZipFile耗費了比較多的 cpu時間和調用次數。在以上采集中,可以發現,跟ZipFile相關的的性能在javac中都會消耗的比較高,該ZipFile的stack trace如下:

CPU Usage Times Profile (cpu=times)

HPROF可以通過對java應用程序的各個方 法中注入code的方式來搜集各個method的執行情況。對每個methods的執行情況進行跟蹤,count以及時間消耗的搜集。這種技術叫做 Byte Code Injection。所以這種采集方式的運行比cpu=samples要慢很多,以下是采集數據日志:
這里的count代表著該方法被真正執行了多少次,并且方法thread消耗了多少精確的cpu 時間。

四、在Hadoop中使用hprof

在JobConf中,有幾個配置選項是可以用來控制task profiling行為的。比如對一個job,想要開啟對其tasks的profiling功能,并設置profiling相應的HPROF參數,可以按如下方式:

conf.setProfileEnabled(true); conf.setProfileParams("-agentlib:hprof=cpu=samples,heap=sites,depth=6," + "force=n,thread=y,verbose=n,file=%s"); conf.setProfileTaskRange(true, "0-2");

第一行表示打開profiling task的功能,該功能默認情況下是關閉的。調用該接口相當于設置配置選項 mapred.task.profile=true,可以利用這種方式在hadoop job提交命令行上動態指定。

第二行是通過conf接口來設置對tasks進行HPROF 的profiling的采集參數,采用profiling enable的方式運行的tasks,會采用每個task一個獨立的JVM的運行方式運行(即使enable了job的jvm reuse功能)。HPROF相關的采集參數設置,可以見其他資料。該選項也可以通過設置 mapred.task.profile.params 選項來指定。

第三行表示對job的哪些tasks需要進行profiling采集,第一true參數表示采集的是map tasks的性能數據,false的話表示采集reduce的性能數據,第二個參數表示只采集編號為0,1,2的tasks的數據,(默認為0-2)。如果想要采集除2,3,5編號的tasks,可以設置該參數為: 0-1,4,6-

Example

還是拿wordcount來舉例,提交job命令如下:

bin/hadoop jar hadoop-examples-0.20.2-luoli.jar wordcount /-D mapred.reduce.tasks=10 /-D keep.failed.task.files=fales /-D mapred.task.profile=true /-D mapred.task.profile.params="-agentlib:hprof=cpu=samples,heap=sites,depth=6,force=n,thread=y,verbose=n,file=%s" /$input /$output

這樣,當job運行時,就會對前三個task進行profiling的采集,采集信息包括cpu的采樣信息,內存分配的信息數據,stack trace 6層的堆棧信息。這里需要注意的是,由于前三個tasks被進行了HPROF的性能采樣,所以這幾個tasks的執行效率會受到一定的影響,profiling的信息越詳細,性能影響就越大。如下圖,前三個map就明顯比其他的map運行的要慢很多。

不過這種運行方式通常都不是線上運行方式,而是用來進行優化調試,所以關系不大。

而當job運行完成后,這三個tasks對應的profiling日志也會會傳到提交機器上,供用戶分析判斷。如下圖:

與此同時,tasks在tasktracker上也將這些profiling日志信息記錄到了一個profile.out的日志文件中,該文件通常位于tasktracker機器上的上HADOOPHOME/logs/userlogs/{attempt_id}下,和該task的stderr,stdout,syslog保存在同一個目錄下

該文件中的內容,還可以通過taskdetails.jsp的頁面查看到。

有了這些信息,相信對于任何一位hadoop應用程序的開發者來說,就擁有了足夠的定位job瓶頸的信息了。MR的應用程序開發同學,請優化您的job吧~~

總結

以上是生活随笔為你收集整理的hprofile教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。