專利名稱:一種基于linux系統(tǒng)的CPI實時監(jiān)測的方法
技術領域:
本發(fā)明涉及CPU架構,C語言,以及Iinux編程等技術領域,具體地說是一種基于Iinux系統(tǒng)的CPI實時監(jiān)測的方法。
背景技術:
隨著高性能服務 器應用的發(fā)展,越來越多的人們開始注意微架構方面的性能對應用性能的影響。其中CPI是微架構方面的一個重要指標,但是目前幾乎所有的監(jiān)測工具均無法實時監(jiān)測此項內(nèi)容。
發(fā)明內(nèi)容
本發(fā)明的目的是利用了 Iinux內(nèi)核提供的sys_perf_event_open系統(tǒng)調(diào)用實現(xiàn)基于Iinux系統(tǒng)的CPI實時監(jiān)測方法。本發(fā)明的目的是按以下方式實現(xiàn)的,基于Iinux平臺,通過讀取系統(tǒng)內(nèi)每顆CPU中PMU的CPU周期及執(zhí)行指令數(shù)等相關內(nèi)容,實時的計算出系統(tǒng)整體CPI值并輸出,實現(xiàn)步驟如下
1)包裝sys_perf_event_open 系統(tǒng)調(diào)用
static int perf_event_open(struct perf_event_attr *hw_event_uptr,
pid_t pid, int cpu, int group_fd, unsigned long flags)
{
return syscall(—NR_perf_event_open, hw_event_uptr, pid, cpu,group_fd, flags);
}
2)統(tǒng)計系統(tǒng)CPU個數(shù)
int cpu_num = sysconf(_SC_NPR0CESS0RS_0NLN);
3)生成perf_event數(shù)組 static int event_num=2; static int event[2]={\
PERF_COUNT_HW_CPU_CYCLES,
PERF_COUNT_HW_INSTRUCTIONS\
};
4)為每個CPU生成一個group for(i=0;i<cpu_num;i++){
_perf_event_open(i);
ioctl(pperf_fd[i]
, PERF_EVENT_IOC_ENABLE, 0);
}
其中_perf_event_open函數(shù)為包裝的perf_event_open函數(shù),具體為
權利要求
1.一種基于Iinux系統(tǒng)的CPI實時監(jiān)測的方法,其特征在于通過讀取系統(tǒng)內(nèi)每顆CPU中PMU的CPU周期及執(zhí)行指令數(shù)等相關內(nèi)容,實時的計算出系統(tǒng)整體CPI值并輸出,具體實現(xiàn)步驟如下 包裝 sys—perf—event—open 系統(tǒng)調(diào)用static int perf_event_open(struct perf_event_attr 氺hw—event—uptr,pid—t pid, int cpu, int group_fd, unsigned long flags){ return syscall(——NR—perf—event_open, hw_event_uptr, pid, cpu,group—fd,flags); } 統(tǒng)計系統(tǒng)CPU個數(shù)int cpu—num = sysconf(—SC—NPROCESSORS—ONLN); 生成perf—event數(shù)組 static int event—num=2; static int event [2] = {\PERF—COUNT—HW—CPU—CYCLES,PERF—COUNT—HW—INSTRUCTIONS' }; 4)為每個CPU生成一個group for(i=0;i〈cpu—num;i++){—perf—event_open(i); ioctl(pperf_fd[i]
, PERF—EVENT—IOC—ENABLE,0);} 其中—perf—event—open函數(shù)為包裝的perf—event—open函數(shù),具體為 static void _perf_event_open(int cpuid) { int i;struct perf—event_attr pe;memset(&pe,0,sizeof(struct perf_event_attr));pe.type = PERF—TYPE—HARDWARE;pe.size = sizeof (struct perf—event_attr);pe.config = event
;pe.exclude_kernel=l;pe.exclude—hv=l;pe. read—format=PERF—FORMAT—GROUP | PERF—FORMAT—ID;pe.disabled = I; pperf—fd[cpuid]
= perf—event_open (&pe,-1,cpuid, -1,0); if (pperf—fd[cpuid]
>= 0) for (i=l;i〈event—num;i++) {pe.config = event[i]; pe.disabled = 0;pperf_fd[cpuid][i]= perf—event_open(&pe, -1, cpuid,pperf—fd[cpuid]
,0);}return;} 讀取PMU數(shù)值并輸出整體CPI for(i=0;i〈sys—info, cpu—num;i++){read (pperf—fd [i]
,&rf, sizeof (rf));pperf—clean (i);t_c+= rf. cr
· value;t_i+= rf. cr[l]. value;printf(〃%f 〃,(float)rf. cr
. value/ (float)rf. cr[l]. value);}printf (〃%f\n〃,t—c/t—i); 其中pperf—clean為清空對應CPU的PMU計數(shù)器; 具體如下static inline void pperf—clean(cpuid){ int i;for (i=0;i〈event—num;i++) {ioctl (pperf—fd[cpuid][i],PERF—EVENT—IOC—RESET,0);}} 6)清空t—c及t—i的值,等待一秒,并繼續(xù)讀取其值; 到此本系統(tǒng)的主要部分基本完成。
全文摘要
本發(fā)明提供一種基于linux系統(tǒng)的CPI實時監(jiān)測的方法,該方法利用linux提供的sys_perf_event_open系統(tǒng)調(diào)用,通過讀取CPU的performancemanagmentunit(PMU)內(nèi)容,獲取實時的CPU周期及執(zhí)行指令數(shù),進而計算出系統(tǒng)的實時CPI。本發(fā)明克服了以往系統(tǒng)性能監(jiān)測系統(tǒng)在微架構監(jiān)測方面的不足,能做到實時準確的監(jiān)控系統(tǒng)中每一顆CPU,并計算出其CPI數(shù)據(jù)。在高性能服務器領域,本方法可以用來及時準確的判斷系統(tǒng)發(fā)揮的真實性能,以及可以從側(cè)面反映一款應用程序的優(yōu)劣。
文檔編號G06F11/30GK102855171SQ201210281960
公開日2013年1月2日 申請日期2012年8月9日 優(yōu)先權日2012年8月9日
發(fā)明者劉斐然 申請人:浪潮電子信息產(chǎn)業(yè)股份有限公司