西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁編程開發(fā)java → Spring 性能監(jiān)控器排查出項(xiàng)目中性能瓶頸

Spring 性能監(jiān)控器排查出項(xiàng)目中性能瓶頸

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:西西整理時(shí)間:2013/7/7 23:39:52字體大小:A-A+

作者:西西點(diǎn)擊:144次評(píng)論:0次標(biāo)簽: Spring

手機(jī)QQ2017 for Androidv6.6.9 官方最新版
  • 類型:社交聊天大。37.8M語言:中文 評(píng)分:8.0
  • 標(biāo)簽:
立即下載

spring,真是一個(gè)好東西;性能,真是個(gè)讓人頭疼又不得不面對(duì)的問題。如何排查出項(xiàng)目中性能瓶頸?如何迅速定位系統(tǒng)的慢查詢?在這我就不說spring自帶的性能監(jiān)控器了,實(shí)在是有些簡陋。下面就說說我自己寫的這個(gè)性能監(jiān)控器。先看看效果:

2013-07-07 19:19:50,440 WARN [main] [aop.PerformanceInterceptor]
|-144 ms; [HelloService.hellpAop]
|+---10 ms; [AnotherService.childMehhod]
|+---21 ms; [AnotherService.childMehhod3]
|+---+---8 ms; [HelloService.parentMehtod]
|+---12 ms; [AnotherService.childMehhod2] 

其實(shí),利用spring AOP,任何人都可以寫一個(gè)定制的監(jiān)控,但大體思路是一樣的,就是在被調(diào)用方法的開始之前,記錄一下開始時(shí)間,在調(diào)用方法結(jié)束之后,記錄結(jié)束時(shí)間,然后,在調(diào)用棧退出前,將日志打印出來。光說不練假把式,下面一步一步構(gòu)建一個(gè)性能監(jiān)控器。

step1.構(gòu)造攔截器。

直接上代碼,攔截器核心代碼:

public Object invoke(MethodInvocation invocation) throws Throwable {
try {
String name = extractLogName(invocation);
//記錄開始時(shí)間
start(name);
return invocation.proceed();
} finally {
//記錄方法結(jié)束時(shí)間
stop();
}
}

因?yàn)樽罱K要打印出來,因此,打印的名稱必須在記錄時(shí)間時(shí)把被調(diào)用方法的名稱也記錄下來。方法extractLogName就是干這個(gè)的。

step2.構(gòu)造數(shù)據(jù)結(jié)構(gòu)

首先,我們需要一個(gè)線程變量,存儲(chǔ)AOP攔截的每個(gè)方法的開始時(shí)間及結(jié)束時(shí)間。就用threadLocal變量了,本人還沒想到更好的方法。其次,調(diào)用過程其實(shí)是在一個(gè)方法棧(Stack)中旅行了一遍,被調(diào)用的方法總是后進(jìn)先出。每進(jìn)一個(gè)方法,都要記錄一個(gè)開始時(shí)間,每當(dāng)退出一個(gè)方法,都要記錄這個(gè)方法運(yùn)行的結(jié)束時(shí)間。最終,我們將得到一個(gè)類似樹形的結(jié)構(gòu)。我們需要定義這個(gè)結(jié)構(gòu),以便我們在退出方法棧時(shí)能夠?qū)⒚恳粋(gè)方法所耗費(fèi)的時(shí)間都打印出來。

/**
* 保存監(jiān)控信息變量
* @author donlianli@126.com
*/
private static class StackData {
/**
* 記錄根根節(jié)點(diǎn)
*/
public StackEntry root;
/**
* 當(dāng)前正在調(diào)用方法節(jié)點(diǎn)
*/
public StackEntry currentEntry;
/**
* 堆棧樹高度
*/
public int level;
}
/**
* aop方法性能統(tǒng)計(jì)實(shí)體
* @author donlianli@126.com
*/
private static class StackEntry {
public String logName ;
public long beginTime;
public long endTime;
/**
* 節(jié)點(diǎn)所處高度
*/
public int level;
/**
* 調(diào)用的子方法
*/
public List<StackEntry> child;
/**
* 上級(jí)節(jié)點(diǎn)
*/
public StackEntry parent ;
public StackEntry(String logName, long currentTimeMillis) {
this.logName = logName;
this.beginTime = currentTimeMillis;
this.child = new ArrayList<StackEntry>(3);
}
}

好了,結(jié)構(gòu)和攔截器都寫好了。只需兩步,大工基本就告成了,在攔截器中,在調(diào)用方法的前面及后面,記錄一個(gè)StackEntry對(duì)象就可以了。start和stop的代碼如下: StackData定義了根節(jié)點(diǎn)的結(jié)構(gòu),StackEntry存儲(chǔ)每個(gè)方法的開始結(jié)束時(shí)間,另外在StackData和StackEntry加入level字段,方便后面打印日志。StackData和StackEntry都是作為一個(gè)內(nèi)部類引入的,因?yàn)檫@兩個(gè)類為了性能,都沒有提供一些封裝方法,不宜暴露出去(出去多丟人啊)。

public static void start(String logName) {
StackData data = dataHolder.get();
StackEntry currentEntry = new StackEntry(logName, System.currentTimeMillis());
if (data == null) {
data = new StackData();
data.root = currentEntry;
data.level = 1;
dataHolder.set(data);
} else {
StackEntry parent = data.currentEntry;
currentEntry.parent=parent;
parent.child.add(currentEntry);
}
data.currentEntry = currentEntry;
currentEntry.level=data.level;
data.level++;
}
public static void stop() {
StackData data = dataHolder.get();
StackEntry self = data.currentEntry;
self.endTime = System.currentTimeMillis();
data.currentEntry = self.parent;
data.level--;
printStack(data);
}
/**
* 此處還可以進(jìn)行改進(jìn),可以將超時(shí)的數(shù)據(jù)放入一個(gè)有界隊(duì)列
* 里,在另一個(gè)線程進(jìn)行打印。
* @param data
*/
private static void printStack(StackData data) {
if(logger.isWarnEnabled()){
StringBuilder sb = new StringBuilder("\r\n");
StackEntry root = data.root;
appendNode(root,sb);
logger.warn(sb.toString());
}
}
private static void appendNode(StackEntry entry, StringBuilder sb) {
long totalTime = entry.endTime-entry.beginTime ;
if(entry.level ==1){
sb.append("|-");
}
sb.append(totalTime);
sb.append(" ms; [");
sb.append(entry.logName);
sb.append("]");
for(StackEntry cnode : entry.child){
sb.append("\r\n|");
for(int i=0,l=entry.level;i<l;i++){
sb.append("+---");
}
appendNode(cnode,sb);
}
}

1、我們只想找出慢查詢,而不想把所有的方法的運(yùn)行時(shí)間都打印出來等等,還有需求?

2、希望有一個(gè)開關(guān),平常不需要監(jiān)控,在出現(xiàn)問題的時(shí)候,才把這個(gè)監(jiān)控打開。

好吧,程序員都是被這些需求給搞死的。

在攔截器中增加一個(gè)開關(guān)switchOn和一個(gè)閾值threshold,當(dāng)switchOn==true的時(shí)候,才進(jìn)行監(jiān)控,否則不監(jiān)控。在監(jiān)控時(shí),如果整個(gè)方法的運(yùn)行時(shí)間小于threshold,不打印日志,因?yàn)榇蛴∪罩緯?huì)IO,會(huì)給方法增加額外的開銷。改進(jìn)后代碼如下:

  /** 
 * 性能監(jiān)控開關(guān) 
 * 可以在運(yùn)行時(shí)動(dòng)態(tài)設(shè)置開關(guān) 
 */ 
private volatile boolean switchOn = true;  
/** 
 * 方法執(zhí)行閾值 
 */ 
private volatile int threshold = 100;  
public Object invoke(MethodInvocation invocation) throws Throwable {  
    if(switchOn){  
        String name = extractLogName(invocation);  
        try {    
                start(name);    
            return invocation.proceed();    
        } finally {    
                stop(threshold);    
        }    
    }  
    else {  
         return invocation.proceed();    
    }  
}  

? 打印日志閾值:

/**
* @param threshold 打印日志的閾值
*/
public static void stop(int threshold) {
StackData data = dataHolder.get();
StackEntry self = data.currentEntry;
self.endTime = System.currentTimeMillis();
data.currentEntry = self.parent;
data.level--;
if(data.root == self && (self.endTime -self.beginTime) > threshold){
printStack(data);
}
}

但這個(gè)監(jiān)控器是運(yùn)行在spring AOP上面的,并且,監(jiān)控的方法必須都是通過interface調(diào)用的。所以,如果你要使用這個(gè)方法,還要確保你是使用的面向接口的編程。不過,如果你的項(xiàng)目沒有使用面向接口,可以利用eclipse自帶的工具,將公用方法Extract成interface。到此,這個(gè)性能監(jiān)控器幾乎算完美了。

spring怎么配置?攔截器怎么配置?你不會(huì)連這個(gè)都不會(huì)吧,那你搜索一下吧。

    寂寞交友
    (73)寂寞交友
    寂寞交友由西西為大家整理一系列火熱的社交應(yīng)用,因?yàn)榧拍挥,隨著時(shí)代的發(fā)展,人們越來越無法滿足現(xiàn)有的交際圈子,對(duì)于擇偶標(biāo)準(zhǔn)的提高,催生出一系列單身男女的情感問題,壓抑的情緒需要得到一定的釋放,如果你想找尋屬于自己的緣分,就趕快下載吧。交友軟件排行微信企鵝之子的基數(shù)之巨大,寂寞的時(shí)候搖一搖,絲男也會(huì)有春天不過企鵝之子也有個(gè)弊病,依托于的用戶資源,環(huán)肥燕瘦難以保證。來往來往是拼爹的,背靠大樹好乘涼。...更多>>
    • 手機(jī)QQ2017 for Androidv6.6.9 官方

      02-14 / 37.8M

      推薦理由:全新的手機(jī)QQ2017版正式發(fā)布。qq2017新版本在保留原有功能基礎(chǔ)上,加入2套趣味表情,并對(duì)UI進(jìn)行簡化設(shè)計(jì),去
    • 陌陌安卓版7.5.1 官方正式版

      01-13 / 55.7M

      推薦理由:陌陌安卓版是類似于微信的一款基于真實(shí)地理位置的交友工具你可以通過陌陌認(rèn)識(shí)周圍的陌生人或者朋友,免費(fèi)發(fā)
    • 陌陌電腦版v0.2.1 官方最新版

      07-22 / 47.9M

      推薦理由:大家都知道陌陌吧,現(xiàn)在西西軟件園給大家提供一款電腦版本的陌陌哦。即使你沒有智能手機(jī),也能玩陌陌~您可以
    • 來往電腦版v6.1.0 官方版

      10-12 / 21.8M

      推薦理由:來往推出來也有一段時(shí)間了,西西一直在默默關(guān)注這款社交軟件的發(fā)展,從推廣的力度來看,來往這款軟件毋庸置
    • 來往安卓版6.6.5 官方最新版

      07-19 / 24.6M

      推薦理由:使用來往應(yīng)用端輕松對(duì)好友分組,輕松與自己的小圈子分享有趣的時(shí)刻。在來往,不用擔(dān)心你的媽媽會(huì)看到你與朋
    • 點(diǎn)點(diǎn)蟲(閱后即焚)6.8.2官網(wǎng)安卓版

      01-23 / 23.3M

      推薦理由:點(diǎn)點(diǎn)蟲app是一款閱后即焚聊天應(yīng)用,最大限度的保障了用戶的個(gè)人隱私,你可以在此發(fā)瀉心中的不滿及各類情緒,
    生活分享
    (13)生活分享
    生活分享系列是由西西為大家整理,當(dāng)前的各類軟件都是服務(wù)于我們的生活,只是著重點(diǎn)不同,有聊天有美食有娛樂有旅行,西西特地為大家準(zhǔn)備了一些日常生活中常用的小工具,相信能在平時(shí)的日常生活中用到,讓我們能更好的品味生活。生活小妙招巧用牙膏若有小面積皮膚損傷或燒傷燙傷,抹上少許牙膏,可立即止血止痛,也可防止感染,療效頗佳。巧除紗窗油膩可將洗衣粉吸煙剩下的煙頭一起放在水里,待溶解后,拿來擦玻璃窗紗窗,效果均不...更多>>
    • 手機(jī)QQ2017 for Androidv6.6.9 官方

      02-14 / 37.8M

      推薦理由:全新的手機(jī)QQ2017版正式發(fā)布。qq2017新版本在保留原有功能基礎(chǔ)上,加入2套趣味表情,并對(duì)UI進(jìn)行簡化設(shè)計(jì),去
    • 網(wǎng)易云音樂電腦版V2.1.2.168028 官

      01-01 / 30.7M

      推薦理由:網(wǎng)易云音樂手機(jī)版上線半年之際,PC版也要和大家見面啦!網(wǎng)易云音樂是一款專注于發(fā)現(xiàn)與分享的音樂產(chǎn)品,網(wǎng)易云
    • 網(wǎng)易云音樂3.8.1 安卓版

      01-29 / 22.4M

      推薦理由:華少【中國好聲音主持人】——只有在網(wǎng)易云音樂,我的身份才是音樂DJ,與你聊聊我心中的好聲音。王東【著名
    • 知乎日?qǐng)?bào)電腦版v2.5.2 官方pc版

      06-15 / 5.0M

      推薦理由:知乎日?qǐng)?bào)是知乎每日精選出一些全網(wǎng)最值得看的內(nèi)容整合產(chǎn)物,知乎日?qǐng)?bào)以獨(dú)有的方式為你提供最高質(zhì)、最深度、
    • 知乎日?qǐng)?bào)v2.6.2 安卓版

      01-22 / 11.4M

      推薦理由:知乎最近貌似越來越活躍了,先是出了個(gè)知乎客戶端現(xiàn)在又來個(gè)知乎日?qǐng)?bào),大概是想吸引更多的用戶吧。用最熱的
    • 網(wǎng)易公開課安卓版4.5.0 官方最新版

      02-07 / 17.3M

      推薦理由:網(wǎng)易公開課安卓版,全球知名院校的高級(jí)教授公開課,免費(fèi)觀看,最大最全的課程平臺(tái),國內(nèi)外頂尖學(xué)府的海量名
    2015最受歡迎APP
    (27)2015最受歡迎APP
    中國最受歡迎榜單發(fā)布,西西第一時(shí)間為用戶推出最受歡迎排行榜專區(qū)下載,在這里你可以下載到中國最受歡迎的,在整個(gè)市場,實(shí)際上仍舊是占領(lǐng)主導(dǎo)地位。中國最受歡迎榜單前分別是微信手機(jī)淘寶搜狗輸入法瀏覽器支付寶錢包瀏覽器愛奇藝今日頭條百度地圖酷狗音樂大眾點(diǎn)評(píng)滴滴出行等等。整個(gè)市場可以分成三大類第一類是移動(dòng)社交移動(dòng)出行手機(jī)地圖移動(dòng)購物等領(lǐng)域已經(jīng)是大局已定。微信移動(dòng)社交,以及快的滴滴手機(jī)地圖手機(jī)淘寶移動(dòng)商城等領(lǐng)域...更多>>
    • 微信2016 Android 版v6.3.31.920谷

      11-21 / 38.8M

      推薦理由:基于Android平臺(tái)的騰訊微信服務(wù),帶給您全新的移動(dòng)即時(shí)通信體驗(yàn)。您可以使用微信軟件快速地發(fā)送消息,即時(shí)拍
    • 手機(jī)QQ2017 for Androidv6.6.9 官方

      02-14 / 37.8M

      推薦理由:全新的手機(jī)QQ2017版正式發(fā)布。qq2017新版本在保留原有功能基礎(chǔ)上,加入2套趣味表情,并對(duì)UI進(jìn)行簡化設(shè)計(jì),去
    • 搜狗手機(jī)輸入法 For Android8.7 官

      12-21 / 20.8M

      推薦理由:Android智能手機(jī)在國內(nèi)已經(jīng)正在被越來越多的人所接受。作為智能平臺(tái)第三方輸入法必不可少,搜狗手機(jī)輸入法持
    • UC瀏覽器安卓手機(jī)版V11.3.8.909 官

      02-08 / 18.0M

      推薦理由:UC瀏覽器是一款全球領(lǐng)先的智能手機(jī)瀏覽器,擁有獨(dú)創(chuàng)的U3內(nèi)核和云端技術(shù),完美地支持HTML5應(yīng)用,具有智能、極
    • 淘寶網(wǎng)客戶端 Android版v6.4.2 官方

      01-26 / 63.8M

      推薦理由:淘寶Android手機(jī)客戶端是淘寶網(wǎng)官方推出的提供給用戶使用的手機(jī)購物軟件,為用戶提供快捷方便的手機(jī)購物新體
    • 支付寶錢包V10.0.3.021302 安卓版

      02-13 / 52.4M

      推薦理由:支付寶錢包是支付寶針對(duì)手機(jī)推出的客戶端軟件,用戶可通過它用手機(jī)登陸支付寶。只要在您的手機(jī)上安裝了支付
    00后最常用的app
    (29)00后最常用的app
    西西軟件園為用戶帶來后手機(jī)必備軟件大全,最常用的手機(jī)下載,一次性搞定這些熱門的社交軟件和游戲,讓你的生活更加精彩,下面看下部分軟件介紹社交軟件手機(jī),手機(jī)移動(dòng)版提供多媒體溝通服務(wù),方便用戶在移動(dòng)設(shè)備上通過語音圖片視頻等方式輕松交流。致力于更完美的移動(dòng)社交娛樂與生活體驗(yàn)樂在溝通年,聊天歡樂億人微信,微信,數(shù)億人使用,能通過手機(jī)網(wǎng)絡(luò)給好友發(fā)送語音文字消息表情圖片和視頻,還可分享照片到朋友圈。通過搖一搖查...更多>>
    qq2016
    (11)qq2016
    每年年初騰訊都會(huì)發(fā)布當(dāng)年最新版的,正是騰訊官方發(fā)布的正式版。雖然從版開始就不再以年號(hào)明明而是以版本,不過用戶還是習(xí)慣的年號(hào)版本。最新版的因?yàn)閯倓偘l(fā)布肯定是有一些細(xì)節(jié)上的問題的,不過大家可以體驗(yàn)到新版的功能特性也是很不錯(cuò)的,如果你喜歡折騰可以來西西下載版,這里西西給大家提供了最新的電腦版下載及手機(jī)版下載。...更多>>
    • qq2016體驗(yàn)版8.6.18733 官方最新版

      08-18 / 56.0M

      推薦理由:QQ2014正式版5.1去廣告版1.破解登陸限制2.破解會(huì)員體驗(yàn)限制3.破解寬度限制4.去除了多余廣告5.去QQ安全中心破
    • 手機(jī)QQ2017 for Androidv6.6.9 官方

      02-14 / 37.8M

      推薦理由:全新的手機(jī)QQ2017版正式發(fā)布。qq2017新版本在保留原有功能基礎(chǔ)上,加入2套趣味表情,并對(duì)UI進(jìn)行簡化設(shè)計(jì),去
    • QQ輕聊版for windowsv7.9(14305) 官

      12-02 / 46.5M

      推薦理由:QQ輕聊版for windows是騰訊為pc端客戶推出的一款精簡版qq,用過手機(jī)qq輕聊版的用戶對(duì)輕聊版應(yīng)該都有個(gè)大概的
    • QQ20178.9.20026 官方最新版

      02-08 / 60.2M

      推薦理由:qq2017最新版官方下載,QQ2017全新設(shè)計(jì)回歸本源設(shè)計(jì),讓您的目光停留在您所關(guān)注的內(nèi)容上,大大提升了溝通的
    • QQ2016輕聊版3.5.0 官網(wǎng)安卓版

      06-28 / 10.5M

      推薦理由:QQ2014輕聊版是騰訊公司專為低性能手機(jī)打造的精簡版QQ。保留核心聊天功能,超小安裝包,省內(nèi)存,聊天更暢快
    • 騰訊qq2015正式版7.7.16077 官方最

      02-14 / 52.4M

      推薦理由:騰訊這次又爽約了,說好的QQ2014呢,好吧,今晚,終于迎來了傳說中的QQ2014,騰訊推送了一個(gè)QQ5.0的首個(gè)體驗(yàn)

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)