1. 程式人生 > >Docker中使用FlameGraph分析JVM應用效能

Docker中使用FlameGraph分析JVM應用效能

開源專案推薦

Pepper Metrics是我與同事開發的一個開源工具(https://github.com/zrbcool/pepper-metrics),其通過收集jedis/mybatis/httpservlet/dubbo/motan的執行效能統計,並暴露成prometheus等主流時序資料庫相容資料,通過grafana展示趨勢。其外掛化的架構也非常方便使用者擴充套件並整合其他開源元件。
請大家給個star,同時歡迎大家成為開發者提交PR一起完善專案。

前言

前面的文章,我們講述瞭如何通過perf的方式對java程式進行效能剖析,並生成FlameGraph火焰圖,但是實際生產中,很多企業會將java部署在docker容器當中,這時對docker內執行的java程序進行剖析便成為一件很麻煩的事情。

執行步驟

安裝相關依賴

yum install -y git cmake gcc-c++ gcc perf

下載專案

git clone https://github.com/zrbcool/docker-flame-graphs.git

指定JAVA_HOME環境變數

export JAVA_HOME=/root/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH

編譯專案

cd docker-flame-graphs/
cmake . && make

找到你要分析的docker程序

docker ps | grep xxx

找到這個容器的程序Pid

docker inspect --format '{{.State.Pid}}' [CONTAINER_ID]

修改腳本當中的JAVA_HOME保證與容器內部的JAVA_HOME一致

vi bin/create-java-perf-map.sh
export JAVA_HOME=/app/3rd/jdk/default

去掉腳本當中被註釋的命令:

vi bin/docker-perf-top
#刪掉下面程式碼前面的註釋
sudo perf top -p $host_pid

在docker-flame-graphs目錄下,執行:

docker cp $(pwd) [CONTAINER_ID]:/docker-flame-graphs

然後需要確認你的JVM引數增加了-XX:+PreserveFramePointer,如果沒有,需要增加並重啟服務
現在所有的準備工作已經完成,讓你的JVM程序執行一段時間完成JIT的預熱
然後我們開始分析效能:

cd bin
./docker-perf-top [CONTAINER_ID] [JAVA_ID]
./docker-perf-java-flames [CONTAINER_ID] [JAVA_ID]

docker-perf-top效果

docker-perf-java-flames

svg影象可以下鑽等操作,請開啟連結檢視點我

參考

https://github.com/jvm-profiling-tools/perf-map-agent/issues/50  
https://blog.alicegoldfuss.com/making-flamegraphs-with-containerized-java/  
https://github.com/mboussaa/docker-flame-graphs  
http://www.batey.info/docker-jvm-flamegraphs.html  
https://github.com/chbatey/perf-map-agent  
https://blog.alicegoldfuss.com/making-flamegraphs-with-containerized-java/  
https://github.com/jvm-profiling-tools/perf-map-agent  
https://medium.com/netflix-techblog/java-in-flames-e763b3d32166  

作者其他文章

https://github.com/zrbcool/blog-public

微信訂閱號

相關推薦

Docker使用FlameGraph分析JVM應用效能

開源專案推薦 Pepper Metrics是我與同事開發的一個開源工具(https://github.com/zrbcool/pepper-metrics),其通過收集jedis/mybatis/httpservlet/dubbo/motan的執行效能統計,並暴露成prometheus等主流時序資料庫相容資料

Docker 完整部署 Web 應用

  ??   作者簡介:外號夫子,長於長江之上「梨花島」,總喜歡一個江湖的傳說,如果你偶然記起關於「桃花島」黃藥師的傳說,記得划船來找我。個人部落格:fuzhii.com。其他博文《換個timeline看知乎》,《用機器學習的方法鑑別紅樓夢作者》。   本文舉例的 Web 應用為 『top-topic

【Spark篇】---Spark資源調度源碼分析應用

部分 app post 類名 inf master 執行過程 efault spark 一、前述 Spark中資源調度是一個非常核心的模塊,尤其對於我們提交參數來說,需要具體到某些配置,所以提交配置的參數於源碼一一對應,掌握此節對於Spark在任務執行過程中的資源分配會更上

Docker 部署 ASP.NET CORE 應用

post netcore 工作 ros core 指定 們的 本地 body 有了 Docker 之後, 部署起來卻這間非常方便,環境不用搭了, 直接創建一個 microsoft/aspnetcore 的容器, 在本地開發好後, 把內容直接部署到容器中。 下面的命令是把本

分析TVS管數字移動電路的設計與應用

    針對靜電放電和電快速瞬變脈衝群(ESD/EFT)等危險浪湧電壓會給數字行動電話帶來宕機、損壞等致命危害的問題,便於電路設計人員加深對TVS管的認識,設計出高可靠性的保護電路,立深鑫電子通過分析TVS管的特性和主要引數及其工作原理,得出了TVS管是一種十分有效地保護器件,但在應用時應當針對

jmeter介面效能測試(4)----提取json的資料並應用到斷言中

介面資訊如下: 執行介面後在檢視結果樹種檢視響應資料,檢視方式選擇:JSON Path Tester 我們要在json中提取如下的資料: 檢視json體的路徑關係,在JSON path Expression中輸入路徑,關注是否能得到想要的數值。如:我們想要獲取上圖中的n

瞭解JavaScript的Memoization以提高效能,再看React的應用

英文: Understanding Memoization in JavaScript to Improve Performance 中文: 瞭解JavaScript中的Memoization以提高效能--react的應用(歡迎star) 我們渴望提高應用程式的效能,Memoization是JavaScr

MLOps+DevOps,解決機器學習在應用效能生產運維的困境

比起建立機器學習模型來說,模型部署需要更先進的IT技能。如果大資料專家和開發者們沒能跟上節奏,未來堪憂。 在開發機器學習AI演算法和投入生產時,企業面臨更高挑戰。機器學習開發的過程是實驗性和探索性的過程,而部署則需要安全且易於管理的一致結果。 開發階段的目標是優

Docker部署ELK日誌分析系統

Docker中部署ELK環境 一直想嘗試部署一個ELK日誌系統,所以今晚就用Mac搭建一下,這裡記錄一下具體的搭建過程。 在上一節中已經學會來安裝Docker以及部署web應用,這次就不介紹來,直接在Docker中部署ELK日誌分析系統. 1.介紹 ELK是三個開源工具的縮寫

使用JMC(Java Mission Control )監控docker的java應用

JMC:Java Mission Control dockerfile如下: FROM openjdk:10.0.2 ADD log-search-0.0.1-SNAPSHOT.jar /applica

將Spring boot應用打包成映象放到docker執行

學習docker,需要把專案打包成映象,所以第一步首先得把專案打成war包,這樣才能丟上去。 打包成war 這一步在傳統java web專案中看起來非常簡單一步,但是Spring boot卻有小許不同。 增加SpringBootServletIni

Docker容器執行Spring Boot應用

Spring Boot簡化了Spring應用的開發過程,遵循約定優先配置的原則提供了各類開箱即用(out-of-the-box)的框架配置。另一方面,Spring Boot還具備將程式碼直接構建為可執行jar包的能力,這個jar包是一個可以獨立執行的部署單元。基於以上特性,現在普

Docker利用Tomcat快速部署web應用

在學習了docker的基本操作之後,我們就可以嘗試在我們的container中部署一些基本的應用了。 這篇文章我們就來說一下怎麼在docker中快速部署一個web應用。 首先肯定是要機器中安裝了docker,如果沒安裝就是用yum install -y

如果在docker部署tomcat,並且部署java應用程式

1、先說如何在docker中部署tomcat     第一步:root使用者登入在系統根目錄下建立資料夾tomcat7,命令如:mkdir tomcat7,並且切換到該目錄下:cd tomcat7;     第二步:建立Dockerfile,命令如:touch Docker

Docker部署Springboot應用

Docker這項容器技術已經是十分的火熱了,讀者要是不瞭解docker的話可以吧docker先理解為虛擬機器。 我們的Springboot最終是要部署在Linux上的,docker作為Linux輕量級的實現。docker也是可以用來部署Springboot應用

效能測試】C\S架構的應用效能測試模型分析

1. CS/CSS系統架構的基本概念1.1系統架構定義雖然B/S結構、J2EE架構愈來愈成為流行模式,但基於傳統的C/S結構的應用程式還廣泛地應用於各種行業。尤其是金融行業中的商業銀行櫃面-核心帳務 系統等。一方面由於傳統商業銀行一般都有大量的字元終端等需要複用的裝置,一方面

IOLI crackme分析——從應用學習使用radare2

Crackme0x00 - writeup 我現在開始看radare2book了,現在剛看1/3,有些無聊,因為之前也看過一些radare2的例項講解,所以現在先試著做一下里面的crackme練習。 先執行一下craceme0x00這個檔案,看來是要把密碼找出來。 [email prot

Docker監控Java應用程式的5個方法

http://geek.csdn.net/news/detail/218595 譯者注:Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實現虛擬化。通常情況下,監控的主要目的在於:減少宕機時

JVMGroovy指令碼並行執行效能優化

       當JVM中執行的Groovy指令碼存在大量併發時,如果按照預設的策略,每次執行都會重新編譯指令碼,呼叫類載入器進行類載入。不斷重新編譯指令碼會增加JVM記憶體中的CodeCache和Pe

深入分析JVM執行緒的建立和執行原理 (future)

在JVM中除了應用執行緒,還有其他的一些執行緒用於支援JVM的執行,這些執行緒可以被劃分為以下幾類: VM Thread:負責JVM在安全點內的各種操作,這些操作(諸如自動記憶體管理、取消偏向鎖、執行緒dump、執行緒掛起等等)在執行過程中需要JVM處於這樣一個狀態——堆的內容不會被改變,這種狀態在