一種基于Linux系統(tǒng)的性能采集分析的方法、裝置及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種基于Linux系統(tǒng)的性能采集分析的方法、裝置及系統(tǒng)。
【背景技術(shù)】
[0002]內(nèi)存泄漏也稱作“存儲滲漏”,用動(dòng)態(tài)存儲分配函數(shù)動(dòng)態(tài)開辟的空間,在使用完畢后未釋放,結(jié)果導(dǎo)致一直占據(jù)該內(nèi)存單元。直到程序結(jié)束。(其實(shí)說白了就是該內(nèi)存空間使用完畢之后未回收)即所謂內(nèi)存泄漏。內(nèi)存泄漏形象的比喻是“操作系統(tǒng)可提供給所有進(jìn)程的存儲空間正在被某個(gè)進(jìn)程榨干”,最終結(jié)果是程序運(yùn)行時(shí)間越長,占用存儲空間越來越多,最終用盡全部存儲空間,整個(gè)系統(tǒng)崩潰。所以“內(nèi)存泄漏”是從操作系統(tǒng)的角度來看的。這里的存儲空間并不是指物理內(nèi)存,而是指虛擬內(nèi)存大小。
[0003]對于內(nèi)存泄露需要通過性能采集,評估軟件運(yùn)行時(shí)系統(tǒng)的整體性能,定位到CPU性能熱點(diǎn),具體定位到是哪段代碼、哪個(gè)函數(shù)耗時(shí)較大,目前性能剖析的采集具體是通過google-PerfTools來進(jìn)行收集和分析的,就是通過采樣的方式,給程序中cpu的使用情況進(jìn)行“畫像”,通過它所輸出的結(jié)果,可以對程序中各個(gè)函數(shù)(得到函數(shù)之間的調(diào)用關(guān)系)耗時(shí)情況一目了然。在對程序做性能優(yōu)化的時(shí)候,先把最耗時(shí)的若干個(gè)操作優(yōu)化好,程序的整體性能提升十分明顯,也是做性能優(yōu)化的一個(gè)最為基本的原則一先優(yōu)化最耗時(shí)的。
[0004]然而,目前常規(guī)的通過google-PerfTools來進(jìn)行性能收集,在去重編譯時(shí),在性能收集之前需要進(jìn)行環(huán)境變量的設(shè)置,從而導(dǎo)致了性能收集和分析操作繁瑣的技術(shù)問題。
【發(fā)明內(nèi)容】
[0005]本發(fā)明實(shí)施例提供的一種基于Linux系統(tǒng)的性能采集分析的方法、裝置及系統(tǒng),解決了目前常規(guī)的通過google-PerfTools來進(jìn)行性能收集,在去重編譯時(shí),在性能收集之前需要進(jìn)行環(huán)境變量的設(shè)置,而導(dǎo)致的性能收集和分析操作繁瑣的技術(shù)問題。
[0006]本發(fā)明實(shí)施例提供的一種基于Linux系統(tǒng)的性能采集分析的方法,包括:
[0007]確定選擇的目標(biāo)主機(jī)待性能分析的待注入的進(jìn)程;
[0008]根據(jù)待注入的所述進(jìn)程找到對應(yīng)的目標(biāo)進(jìn)程的dlopen函數(shù)入口地址;
[0009]通過在所述目標(biāo)進(jìn)程中附上的ptrace函數(shù),結(jié)合所述dlopen函數(shù)入口地址將用于動(dòng)態(tài)性能分析的prof iler.so文件加載進(jìn)所述目標(biāo)進(jìn)程;
[0010]通過google-PerfTools調(diào)用所述prof iler.SO文件對所述目標(biāo)進(jìn)程進(jìn)行性能采集,并獲取對應(yīng)的性能分析結(jié)果。
[0011]可選地,確定選擇的目標(biāo)主機(jī)待性能分析的待注入的進(jìn)程具體包括:
[0012]確定選擇的目標(biāo)主機(jī)的IP地址,并進(jìn)行連接;
[0013]確定目標(biāo)主機(jī)進(jìn)行對應(yīng)的待性能分析的待注入的所述進(jìn)程的注入。
[0014]可選地,根據(jù)待注入的所述進(jìn)程找到對應(yīng)的目標(biāo)進(jìn)程的dlopen函數(shù)入口地址具體包括:
[0015]通過運(yùn)行任意程序調(diào)用I ibc.so文件;
[0016]所述任意程序運(yùn)行時(shí)的agent進(jìn)程通過調(diào)用dlsym函數(shù)獲取dlopen函數(shù)運(yùn)行時(shí)的第一絕對地址;
[00? 7]在所述agent進(jìn)程內(nèi)加載所述I ibc.so文件,以確定第一起始地址;
[0018]通過所述第一起始地址和所述第一絕對地址確定所述dlopen函數(shù)在所述I ibc.so文件中的偏移量;
[0019]根據(jù)待注入的所述進(jìn)程通過所述libc.so文件確定加載在動(dòng)態(tài)庫中的注入的所述進(jìn)程對應(yīng)的起始地址;
[0020]根據(jù)所述起始地址與所述偏移量相加得到絕對地址,所述絕對地址為所述目標(biāo)地址的所述d I op en函數(shù)入口地址;
[0021]注入的所述進(jìn)程調(diào)用所述ptrace函數(shù)加載到所述目標(biāo)進(jìn)程。
[0022]可選地,通過在所述目標(biāo)進(jìn)程中附上的P trace函數(shù),結(jié)合所述dlopen函數(shù)入口地址將用于動(dòng)態(tài)性能分析的prof i Ier.so文件加載進(jìn)所述目標(biāo)進(jìn)程具體包括:
[0023]通過傳遞所述dlopen函數(shù)入口地址和所述prof iler.so文件的名稱到寄存器;
[0024]通過所述ptrace函數(shù)調(diào)用dlopen函數(shù)在目標(biāo)進(jìn)程中加載用于動(dòng)態(tài)性能分析的所述 profiler.so 文件。
[0025]可選地,通過google-PerfTools調(diào)用所述prof iler.so文件對所述目標(biāo)進(jìn)程進(jìn)行性能采集,并獲取對應(yīng)的性能分析結(jié)果具體包括:
[0026]通過在所述prof iler.so文件中加入一個(gè)新函數(shù),并對所述新函數(shù)注冊兩個(gè)用于讓所述目標(biāo)進(jìn)程接收性能分析啟停的信號;
[0027]通過google-PerfTools調(diào)用所述prof iler.so文件對所述目標(biāo)進(jìn)程,并進(jìn)行預(yù)置采集時(shí)長的性能采集;
[0028]根據(jù)預(yù)先選擇的性能分析類型進(jìn)行對應(yīng)的性能分析結(jié)果展示,所述性能分析類型包括cpu性能分析和/或heap性能分析和/或內(nèi)存泄露檢查。
[0029]本發(fā)明實(shí)施例提供的一種基于Linux系統(tǒng)的性能采集分析的裝置,包括:
[0030]確定單元,用于確定選擇的目標(biāo)主機(jī)待性能分析的待注入的進(jìn)程;
[0031 ]目標(biāo)進(jìn)程定位單元,用于根據(jù)待注入的所述進(jìn)程找到對應(yīng)的目標(biāo)進(jìn)程的dlopen函數(shù)入口地址;
[0032]性能分析文件加載單元,用于通過在所述目標(biāo)進(jìn)程中附上的ptrace函數(shù),結(jié)合所述dlopen函數(shù)入口地址將用于動(dòng)態(tài)性能分析的prof i Ier.so文件加載進(jìn)所述目標(biāo)進(jìn)程;
[0033]性能采集分析單元,用于通過google-PerfTools調(diào)用所述profiler.so文件對所述目標(biāo)進(jìn)程進(jìn)行性能采集,并獲取對應(yīng)的性能分析結(jié)果。
[0034]可選地,確定單元具體包括:
[0035]第一確定子單元,用于確定選擇的目標(biāo)主機(jī)的IP地址,并進(jìn)行連接;
[0036]第二確定子單元,用于確定目標(biāo)主機(jī)進(jìn)行對應(yīng)的待性能分析的待注入的所述進(jìn)程的注入。
[0037]可選地,目標(biāo)進(jìn)程定位單元具體包括:
[0038]調(diào)用子單元,用于通過運(yùn)行任意程序調(diào)用Iibc.so文件;
[0039]第一絕對地址獲取子單元,用于所述任意程序運(yùn)行時(shí)的agent進(jìn)程通過調(diào)用dlsym函數(shù)獲取dlopen函數(shù)運(yùn)行時(shí)的第一絕對地址;
[0040]第一起始地址確定子單元,用于在所述agent進(jìn)程內(nèi)加載所述I ibc.so文件,以確定第一起始地址;
[0041 ]偏移量確定子單元,用于通過所述第一起始地址和所述第一絕對地址確定所述dlopen函數(shù)在所述I ibc.so文件中的偏移量;
[0042]起始地址確定子單元,用于根據(jù)待注入的所述進(jìn)程通過所述libc.so文件確定加載在動(dòng)態(tài)庫中的注入的所述進(jìn)程對應(yīng)的起始地址;
[0043]絕對地址計(jì)算單元,用于根據(jù)所述起始地址與所述偏移量相加得到絕對地址,所述絕對地址為所述目標(biāo)地址的所述dlopen函數(shù)入口地址;
[0044]ptrace函數(shù)加載子單元,用于注入的所述進(jìn)程調(diào)用所述ptrace函數(shù)加載到所述目標(biāo)進(jìn)程。
[0045]可選地,性能分析文件加載單元具體包括:
[0046]傳遞子單元,用于通過傳遞所述dlopen函數(shù)入口地址和所述prof iler.so文件的名稱到寄存器;
[0047]profiler.so文件加載子單元,用于通過所述ptrace函數(shù)調(diào)用dlopen函數(shù)在目標(biāo)進(jìn)程中加載用于動(dòng)態(tài)性能分析的所述profiler, so文件。
[0048]可選地,性能采集分析單元具體包括:
[0049]信號注冊子單元,用于通過在所述prof iler.so文件中加入一個(gè)新函數(shù),并對所述新函數(shù)注冊兩個(gè)用于讓所述目標(biāo)進(jìn)程接收性能分析啟停的信號;
[0050]性能采集子單元,用于通過800816-?6忖1'0018調(diào)用所述口1'0;1^161'.80文件對所述目標(biāo)進(jìn)程,并進(jìn)行預(yù)置采集時(shí)長的性能采集;
[0051]性能分析子單元,用于根據(jù)預(yù)先選擇的性能分析類型進(jìn)行對應(yīng)的性能分析結(jié)果展示,所述性能分析類型包括cpu性能分析和/或heap性能分析和/或內(nèi)存泄露檢查。
[0052]本發(fā)明實(shí)施例提供的一種基于Linux系統(tǒng)的性能采集分析的系統(tǒng),其特征在于,包括:
[0053]后臺agent、TcpProxy,以及本實(shí)施例中提及的任意一種所述的基于Linux系統(tǒng)的性能采集分析的裝置;
[0054]所述基于Linux系統(tǒng)的性能采集分析的裝置通過所述TcpProxy與所述后臺agent連接;
[0055]所述后臺agent通過獲取到來自于所述基于Linux系統(tǒng)的性能采集分析的裝置的指令對目標(biāo)主機(jī)進(jìn)行注入目標(biāo)進(jìn)行后的性能的采集,并反饋給所述基于Linux系統(tǒng)的性能采集分析的裝置。
[0056]從以上技術(shù)方案可以看出,本發(fā)明實(shí)施例具有以下優(yōu)點(diǎn):
[0057]本發(fā)明實(shí)施例提供的一種基于Linux系統(tǒng)的性能采集分析的方法、裝置及系統(tǒng),其中,通過動(dòng)態(tài)注入進(jìn)行性能采集的方法包括:確定選擇的目標(biāo)主機(jī)待性能分析的待注入的進(jìn)程;根據(jù)待注入的進(jìn)程找到對應(yīng)的目標(biāo)進(jìn)程的dlopen函數(shù)入口地址;通過在目標(biāo)進(jìn)程中附上的ptrace函數(shù),結(jié)合dlopen函數(shù)入口地址將用于動(dòng)態(tài)性能分析的prof iler.so文件加載進(jìn)目標(biāo)進(jìn)程;通過google-PerfTools調(diào)用prof iler.so文件對目標(biāo)進(jìn)程進(jìn)行性能采集,并獲取對應(yīng)的性能分析結(jié)果。本實(shí)施例中,通過根據(jù)待注入的進(jìn)程找到對應(yīng)的目標(biāo)進(jìn)程的dlopen函數(shù)入口地址,然后通過在目標(biāo)進(jìn)程中附上的ptrace函數(shù),結(jié)合dlopen函數(shù)入口地址將用于動(dòng)態(tài)性能分析的prof iler.so文件加載進(jìn)目標(biāo)進(jìn)程,最后通過google-Perf Too I s調(diào)用profiler, so文件對目標(biāo)進(jìn)程進(jìn)行性能采集,實(shí)現(xiàn)了基于Linux系統(tǒng)的性能采集分析,解決了目前常規(guī)的通過google-PerfTools來進(jìn)行性能收集,在去重編譯時(shí),在性能收集之前需要進(jìn)行環(huán)境變量的設(shè)置,而導(dǎo)致的性能收集和分析操作繁瑣的技術(shù)問題。