国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一文搞定 Perf 和 Gpertools

系統(tǒng) Linux
在Linux下開發(fā)是幸福的,尤其是在發(fā)生問題的時(shí)候。永遠(yuǎn)忘不了在Windows下應(yīng)用發(fā)生問題時(shí)那種無助的感覺。

[[390062]]

本文轉(zhuǎn)載自微信公眾號(hào)「小姐姐味道」,作者小姐姐養(yǎng)的狗。轉(zhuǎn)載本文請(qǐng)聯(lián)系小姐姐味道公眾號(hào)。

在Linux下開發(fā)是幸福的,尤其是在發(fā)生問題的時(shí)候。永遠(yuǎn)忘不了在Windows下應(yīng)用發(fā)生問題時(shí)那種無助的感覺。

Java提供了非常多的工具來應(yīng)對(duì)故障排查、性能分析,比如jstat、jmap、jmc等。但大多數(shù)情況下,資源的瓶頸在操作系統(tǒng)上。如果宿主機(jī)并不能正常工作,那么在之上進(jìn)行各種Java的應(yīng)用分析就會(huì)變得沒有意義。皮之不存毛將焉附,就是這個(gè)道理。

要做性能分析,Linux下有一個(gè)非常好用的工具,叫做perf。幾乎每個(gè)發(fā)行版都有它的安裝包。perf誕生于2009年,是一個(gè)內(nèi)核級(jí)的工具;另外,還有一個(gè)工具叫做gperftools,是google的產(chǎn)品,是一個(gè)應(yīng)用級(jí)別的產(chǎn)品。

雖然它們都有perf字樣,但使用場(chǎng)景和處理的問題也是不一樣的。

1. perf:CPU暴漲問題排查

顧名思義,perf是做性能分析用的。perf支持兩種模式,計(jì)算模式和采樣模式。比如,perf stat使用的是計(jì)算模式,而perf record采用的是采樣模式。拿采樣來說,它的原理是這樣的:每隔一個(gè)固定的時(shí)間,產(chǎn)生一個(gè)中斷,然后統(tǒng)計(jì)對(duì)應(yīng)的pid和函數(shù)。采樣就預(yù)示著與實(shí)際運(yùn)行情況并不能保持一致,但如果一個(gè)函數(shù)運(yùn)行的時(shí)間越長(zhǎng),被時(shí)鐘中斷的機(jī)會(huì)就越大。鑒于perf最終顯示的是統(tǒng)計(jì)值,所以它的測(cè)量結(jié)果是高度可信的。

通過包管理工具可以很容易的獲取perf。比如在centos下,直接通過yum install perf進(jìn)行安裝。perf提供了非常多的命令,我們可以直接輸入perf輸出這些選項(xiàng)。

Perf的功能非常多,常用的有perf list、perf stat、perf top、perf record、perf report等。下面以幾個(gè)常見的例子,來說明它的應(yīng)用場(chǎng)景。

使用下面的腳本,使得某一核CPU使用飆升到100%。

  1. cat /dev/zero > /dev/null 

使用下面腳本,耗光CPU資源。(先取得cpu的核數(shù),然后循環(huán)生成任務(wù))。這段腳本將數(shù)據(jù)輸出到/dev/null,所以只占用CPU資源,沒有占用任何I/O資源。

  1. for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; 
  2.  do dd if=/dev/zero of=/dev/null &  
  3. done 

我們就拿下面的這個(gè)腳本來說明情況。從top的截圖中,可以看到sy和ni的占用,達(dá)到了100%,我的腳本起作用了!(溫馨提示:執(zhí)行完腳本后,如果你想要?dú)⑺肋@些進(jìn)程,除了重啟之外,還可以直接通過ps找到相應(yīng)的進(jìn)程,然后使用kill命令終止)。

接下來使用record指令來錄制CPU的使用情況。從上面的描述可以得知,統(tǒng)計(jì)結(jié)果是采樣結(jié)果。

  1. <># perf record -a -e cycles -o perf.perf -g sleep 10 
  2.  
  3. [ perf record: Woken up 55 times to write data ] 
  4. [ perf record: Captured and wrote 14.282 MB perf.perf (160302 samples) ] 

程序?qū)?huì)運(yùn)行10秒鐘,然后將采樣結(jié)果輸出到perf.perf文件中。通過report命令可以展示統(tǒng)計(jì)結(jié)果。

  1. perf report -i perf.perf  

可以看到大多數(shù)cpu的損耗都是在dd命令上,甚至里面的調(diào)用樹,也能夠清晰的展示。這在調(diào)試一些c++語言寫的程序,或者調(diào)試jvm的一些內(nèi)部行為時(shí),非常的有用,因?yàn)樗梢灾苯痈櫟较到y(tǒng)調(diào)用層面。但有些細(xì)節(jié),如果對(duì)Linux內(nèi)核不是非常了解的話,下手就比較困難。所以通常情況下,我們只能通常粗略的定位到有問題的模塊,然后再深入進(jìn)行調(diào)試。

perf還可以通過指定進(jìn)程號(hào)進(jìn)行性能追蹤,來獲取性能數(shù)據(jù)。

  1. perf top -g -p 2343 

2. 示例代碼

了解到perf的基本用法,我們拿一個(gè)經(jīng)常實(shí)際遇到的例子來說明一下perf的使用。堆外內(nèi)存是通過JNI等類庫(kù)進(jìn)行調(diào)用所產(chǎn)生的內(nèi)存,在實(shí)際排查中定位非常困難。傳統(tǒng)的工具包括JMC,都不能快速有效的找到問題的元兇。黔驢技窮的時(shí)候,一般就到了perf上場(chǎng)的時(shí)候了。

為了演示這個(gè)過程,我特意做了一段非常精致的JAVA代碼。代碼片段較長(zhǎng),可以訪問下面的gist鏈接,下面只說明關(guān)鍵代碼。這段代碼是典型的堆外內(nèi)存泄露問題。

  1. https://gist.github.com/lycying/70ff3897d8516011c7ffc702aa0d03c2 

使用com.sun.net.httpserver.HttpServer自帶的簡(jiǎn)易server,可以非常容的構(gòu)造一個(gè)服務(wù)器,我們可以通過請(qǐng)求去改變一些應(yīng)用行為。

使用下面的JVM參數(shù)啟動(dòng)這段代碼。

  1. java -Xmx1G -Xmn1G \ 
  2.  -XX:+AlwaysPreTouch  \ 
  3.  -XX:MaxMetaspaceSize=10M \ 
  4.  -XX:MaxDirectMemorySize=10M \ 
  5.  -XX:NativeMemoryTracking=detail LeakExample 

程序?qū)⑷藶閯?chuàng)建一個(gè)停頓狀態(tài),具體測(cè)試步驟如下。

  1. 程序運(yùn)行一小段時(shí)間,內(nèi)存使用率迅速達(dá)到60%時(shí),這時(shí)候程序?qū)⒆詣?dòng)掛起
  2. 啟動(dòng)perf進(jìn)行采樣,相當(dāng)于問題發(fā)生中進(jìn)行切入 (perf record -g -p $pid)
  3. 訪問http://localhost:8888 端口,將會(huì)將內(nèi)存閾值提高到85%,內(nèi)存會(huì)迅速達(dá)到這個(gè)狀態(tài)
  4. 停止采樣,將生成perf數(shù)據(jù)
  5. 使用perf report進(jìn)行分析 (perf report -i perf.data )

這將會(huì)得到下面的一張圖。

但我們不能從中得到有用的信息。是方法錯(cuò)了么?是的。采樣內(nèi)存,要使用perf mem record指令,但是這個(gè)指令在大多數(shù)機(jī)器上都不能工作,得到的信息也有限。

perf記錄的是CPU的性能數(shù)據(jù),這里要特別說明一下。只要是使用率上5%的,我一般都會(huì)關(guān)注。一般情況下,占用的cpu時(shí)間片多,證明使用內(nèi)存也比較多。但事情總有例外的時(shí)候,比如頻繁申請(qǐng)1byte的方法塊,和一次性申請(qǐng)1MB的方法塊,并不能同日而語。

所以perf能不能發(fā)現(xiàn)內(nèi)存問題,要看運(yùn)氣。

3. gperftools:找到堆外內(nèi)存的元兇

要找到內(nèi)存問題,要使用google的gperftools,我們主要用到它的 Heap Profiler,功能很強(qiáng)大。https://github.com/gperftools/gperftools

它的啟動(dòng)方式有點(diǎn)特別,安裝成功之后,你只需要輸出兩個(gè)環(huán)境變量即可。

  1. mkdir -p /opt/test  
  2. export LD_PRELOAD=/usr/lib64/libtcmalloc.so  
  3. export HEAPPROFILE=/opt/test/heap 

在同一個(gè)終端,再次啟動(dòng)我們的應(yīng)用程序,可以看到內(nèi)存申請(qǐng)動(dòng)作都被記錄到了 opt 目錄下的 test 目錄。

接下來,我們就可以使用 pprof 命令分析這些文件。

  1. cd /opt/test 
  2. pprof -text *heap  | head -n 200 

使用這個(gè)工具,能夠一眼追蹤到申請(qǐng)內(nèi)存最多的函數(shù)。Java_java_util_zip_Inflater_init 這個(gè)函數(shù)立馬就被發(fā)現(xiàn)了。

這就是我們模擬內(nèi)存泄漏的整個(gè)過程,到此問題就解決了。

GZIPInputStream 使用 Inflater 申請(qǐng)堆外內(nèi)存、Deflater 釋放內(nèi)存,調(diào)用 close() 方法來主動(dòng)釋放。如果忘記關(guān)閉,Inflater 對(duì)象的生命會(huì)延續(xù)到下一次 GC,有一點(diǎn)類似堆內(nèi)的弱引用。在此過程中,堆外內(nèi)存會(huì)一直增長(zhǎng)。

問題發(fā)生在我們的decompress函數(shù)上。它在使用的時(shí)候,忘記關(guān)閉流了。我們可以看一下異常和正常情況的區(qū)別。

這段是忘了關(guān)閉流的函數(shù)。這種情況在編碼中經(jīng)常會(huì)發(fā)生。

  1. public static String decompress(byte[] input) throws Exception { 
  2.         ByteArrayOutputStream out = new ByteArrayOutputStream(); 
  3.         copy(new GZIPInputStream(new ByteArrayInputStream(input)), out); 
  4.         return new String(out.toByteArray()); 
  5.     } 

下面是修改后正常的函數(shù)。

  1. public static String decompress(byte[] input) throws Exception { 
  2.         ByteArrayOutputStream out = new ByteArrayOutputStream(); 
  3.         GZIPInputStream gzip = new GZIPInputStream(new ByteArrayInputStream(input)); 
  4.         try { 
  5.             copy(gzip, out); 
  6.             return new String(out.toByteArray()); 
  7.         }finally { 
  8.             try{ gzip.close(); }catch (Exception ex){} 
  9.             try{ out.close(); }catch (Exception ex){} 
  10.         } 
  11.     } 

4. 題外話

使用pprof,還可以輸出圖形化的分析報(bào)告,需要安裝圖形生成工具graphviz,可以說是非常nice了。

另外不得不提的一點(diǎn)是,perf和gperftools對(duì)性能的影響,雖然不是特別大,但也盡量不要在線上環(huán)境使用它們。據(jù)我實(shí)際使用的經(jīng)驗(yàn)判斷,這個(gè)性能損耗率大概在30%左右。如果你的問題可以復(fù)現(xiàn),通過常規(guī)手法又無法解決的情況下,可以使用這些工具去分析。比如你的應(yīng)用實(shí)例有5個(gè),完全可以分20%的流量到專用的機(jī)器上,把profile打開,相信你會(huì)很快定位到問題。

作者簡(jiǎn)介:小姐姐味道 (xjjdog),一個(gè)不允許程序員走彎路的公眾號(hào)。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個(gè)人微信xjjdog0,歡迎添加好友,進(jìn)一步交流。

責(zé)任編輯:武曉燕 來源: 小姐姐味道
相關(guān)推薦

2019-09-23 10:51:14

JavaJava虛擬機(jī)Linux

2024-01-09 08:24:47

JMM核心線程

2021-10-25 16:01:01

Linux設(shè)備樹字符串

2021-08-13 05:50:01

ContainerdDockerKubernetes

2020-10-29 08:55:04

微服務(wù)

2021-10-06 20:23:08

Linux共享內(nèi)存

2020-03-03 17:47:07

UDP TCP面試題

2022-08-17 18:25:37

Java分布式搜索引擎

2025-08-08 01:11:00

React組件通信

2021-08-31 07:02:20

Diff算法DOM

2025-04-07 08:20:00

ORMPython代碼

2021-04-02 06:17:10

大數(shù)加減乘除數(shù)據(jù)結(jié)構(gòu)算法

2021-08-31 07:02:34

數(shù)據(jù)響應(yīng)Vue偵測(cè)數(shù)據(jù)變化

2021-04-19 17:32:34

Java內(nèi)存模型

2022-04-15 08:03:41

SaaS應(yīng)用管理市場(chǎng)

2022-06-10 09:04:24

Python讀取文件代碼

2024-01-29 09:04:15

Wi-Fi數(shù)據(jù)設(shè)備

2023-10-30 18:08:50

2021-08-31 06:37:35

Java 語言 Java 基礎(chǔ)

2023-08-01 08:27:15

Java I/ONIO
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

成人国产精品日本在线| yiren22综合网成人| 欧美日韩成人| 国产精品久久久久久久天堂 | 亚洲在线观看视频网站| 免费久久久久久久久| 97不卡在线视频| 日韩av系列| 奇米影视亚洲狠狠色| 欧美自拍一区| 日本精品视频网站| 国产一区二区精品福利地址| 久久天天躁狠狠躁老女人| 欧美激情另类| 欧美精品videosex牲欧美| 欧美军同video69gay| 亚洲欧美色图片| 欧美日韩亚洲视频一区| 免费在线黄色网址| 欧美日韩精品中文字幕一区二区| 成人在线视频电影| 4444亚洲人成无码网在线观看| 欧美性色黄大片手机版| 日韩一区二区三区四区| 日本高清不卡aⅴ免费网站| 欧美性猛交xxxx乱大交| 91黄色免费观看| 色系列之999| 欧美洲成人男女午夜视频| 色噜噜久久综合伊人一本| 精品国产乱码久久久久久丨区2区| 成人福利视频网| 97精品国产97久久久久久春色| 伊人久久久久久久久久| 亚洲福利视频专区| 亚洲国产精品人久久电影| 亚洲风情亚aⅴ在线发布| 日韩av综合网站| 欧美最猛性xxxxx(亚洲精品)| 久久久久久91| 日韩免费高清视频| 日韩女优毛片在线| 欧美三片在线视频观看 | 欧美在线不卡区| 久久青草欧美一区二区三区| 岛国一区二区| 久草精品视频| 性欧美1819sex性高清| 99热这里有精品| 在线精品国产亚洲| 在线高清一区| av男人天堂一区| 亚洲综合久久久| 亚洲韩国精品一区| 欧洲av一区二区嗯嗯嗯啊| 精品久久久久久亚洲精品 | 在线观看18视频网站| 成人xxxx视频| 欧美性一区二区三区| 国产精品一区二区久久精品 | 久久一区亚洲| 成人激情开心网| 久久亚洲精精品中文字幕| 欧美亚洲韩国| 国产欧亚日韩视频| 欧美精品123区| 国产成人aaa| 国产精品一国产精品| 在线中文资源天堂| 丰满人妻一区二区三区53号| 91高清视频在线免费观看| 色呦呦日韩精品| 欧美aⅴ一区二区三区视频| 综合久草视频| 香蕉视频免费在线| 国产卡一卡二在线| 日本免费在线精品| 日韩欧美国产wwwww| 久久精品欧美日韩精品| 伊人久久亚洲影院| 久久国产精品免费一区二区三区| 九色在线免费| 国产一二三在线视频| 国产精品美女免费视频| 日韩欧美一区在线观看| 日本一区二区三级电影在线观看| 影音先锋在线一区| 国产日本亚洲| 欧美成人hd| the porn av| 欧美日韩喷水| 日本成人激情视频| 精品伊人久久97| 精品福利在线看| 成人精品视频一区二区三区| 欧美fxxxxxx另类| 国产亚洲观看| 99在线播放| 性生活免费在线观看| 蜜桃成人在线| 日本伊人精品一区二区三区介绍| 亚洲精品一区二区三区精华液 | 日本在线看片免费人成视1000| 欧美一区二区中文字幕| 91免费版黄色| 欧美激情视频在线| 亚洲成人激情图| 欧美性色19p| 国产欧美日韩另类一区| 日韩av二区在线播放| 精品一区二区三区的国产在线观看| 九色porny丨首页入口在线| 黄网站app在线观看大全免费视频| 黄色特一级视频| 国产精品二区三区四区| 午夜精品国产精品大乳美女| 亚洲国产美女久久久久| 日韩欧美在线观看| 中文字幕在线不卡| 国产aⅴ精品一区二区三区色成熟| 极品尤物久久久av免费看| xxxxxhd亚洲人hd| 蜜桃麻豆av在线| 91精彩视频在线播放| 日韩伦理片在线观看| 91精品91久久久中77777老牛| 精品无人区一区二区三区| 国产精品男女猛烈高潮激情| 欧美成人精品三级在线观看| 亚洲精品久久久久中文字幕欢迎你| 色先锋资源久久综合| 亚洲欧洲综合另类在线| 91日韩一区二区三区| 久久99久久久欧美国产| 中文精品视频| 欧美激情第二页| 日韩在线观看一区 | 在线视频一区观看| 99精彩视频| 国产精品视频久久久| 久久亚洲精品一区二区| 亚洲女同性videos| 精品久久人人做人人爽| 欧美日本精品一区二区三区| 精品福利在线看| 亚洲一区二区在线观看视频| 亚洲欧洲一区二区在线播放| 久久精品亚洲乱码伦伦中文 | 91九色国产在线播放| 毛片在线播放a| 网友自拍视频在线| 欧美色综合一区二区三区| 日本高清视频网站www| jizzjizzjizz亚洲| 日韩精品你懂的| 亚洲 欧美 日韩 国产综合 在线| 佐佐木明希av| 精品国产一区二区三区在线| 在线看视频不卡| 潘金莲一级淫片aaaaa免费看| 亚洲国产一区二区在线| 先锋影音网一区| 日本黄色a视频| wwwjizzjizzcom| 欧美在线观看视频免费| 日韩不卡视频一区二区| 天堂8在线天堂资源bt| 日本xxxxxxxxxx75| 日韩欧美一区二| 国产精品亚洲二区在线观看| 国产超碰在线播放| 黄色成人免费观看| 一级特黄视频| 免费在线视频一级不卡| 午夜激情视频在线| 51精品在线| 国产美女久久| 韩国三级成人在线| 欧洲亚洲一区二区三区| 日韩国产一区| 亚洲视频精品| 奇米影视在线99精品| 国产伦精品一区二区三区在线观看| 国产在线精品一区二区夜色| 成人激情黄色小说| 国产精品免费av| 偷拍日韩校园综合在线| 欧美日韩卡一卡二| 欧美变态tickling挠脚心| 亚洲欧美中文日韩在线v日本| 中文字幕在线视频日韩| 欧美大码xxxx| 国产精品第七影院| 国产不卡一区二区在线观看| 欧美日韩另类综合| 中文字幕无码精品亚洲资源网久久| 天堂一区在线观看| 黑人与亚洲人色ⅹvideos| 先锋成人av| 午夜免费欧美电影|