一种基于linux系统的CPI实时监测的方法技术方案

技术编号:8161464 阅读:331 留言:0更新日期:2013-01-07 19:29
本发明专利技术提供一种基于linux系统的CPI实时监测的方法,该方法利用linux提供的sys_perf_event_open系统调用,通过读取CPU的performancemanagmentunit(PMU)内容,获取实时的CPU周期及执行指令数,进而计算出系统的实时CPI。本发明专利技术克服了以往系统性能监测系统在微架构监测方面的不足,能做到实时准确的监控系统中每一颗CPU,并计算出其CPI数据。在高性能服务器领域,本方法可以用来及时准确的判断系统发挥的真实性能,以及可以从侧面反映一款应用程序的优劣。

【技术实现步骤摘要】

本专利技术涉及CPU架构,C语言,以及Iinux编程等
,具体地说是一种基于Iinux系统的CPI实时监测的方法。
技术介绍
随着高性能服务 器应用的发展,越来越多的人们开始注意微架构方面的性能对应用性能的影响。其中CPI是微架构方面的一个重要指标,但是目前几乎所有的监测工具均无法实时监测此项内容。
技术实现思路
本专利技术的目的是利用了 Iinux内核提供的sys_perf_event_open系统调用实现基于Iinux系统的CPI实时监测方法。本专利技术的目的是按以下方式实现的,基于Iinux平台,通过读取系统内每颗CPU中PMU的CPU周期及执行指令数等相关内容,实时的计算出系统整体CPI值并输出,实现步骤如下 1)包装sys_perf_event_open 系统调用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)统计系统CPU个数int cpu_num = sysconf(_SC_NPR0CESS0RS_0NLN); 3)生成perf_event数组 static int event_num=2; static int event={\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, PERF_EVENT_IOC_ENABLE, 0);} 其中_perf_event_open函数为包装的perf_event_open函数,具体为权利要求1.一种基于Iinux系统的CPI实时监测的方法,其特征在于通过读取系统内每颗CPU中PMU的CPU周期及执行指令数等相关内容,实时的计算出系统整体CPI值并输出,具体实现步骤如下 包装 sys—perf—event—open 系统调用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); } 统计系统CPU个数int cpu—num = sysconf(—SC—NPROCESSORS—ONLN); 生成perf—event数组 static int event—num=2; static int event = {\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, PERF—EVENT—IOC—ENABLE,0);} 其中—perf—event—open函数为包装的perf—event—open函数,具体为 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 = perf—event_open (&pe,-1,cpuid, -1,0); if (pperf—fd >= 0) for (i=l;i〈event—num;i++) {pe.config = event; pe.disabled = 0;pperf_fd= perf—event_open(&pe, -1, cpuid,pperf—fd ,0);}return;} 读取PMU数值并输出整体CPI for(i=0;i〈sys—info, cpu—num;i++){read (pperf—fd ,&rf, sizeof (rf));pperf—clean (i);t_c+= rf. cr· value;t_i+= rf. cr. value;printf(〃%f 〃,(float)rf. cr. value/ (float)rf. cr. value);}printf (〃%f\n〃,t—c/t—i); 其中pperf—clean为清空对应CPU的PMU计数器; 具体如下static inline void pperf—clean(cpuid){ int i;for (i=0;i〈event—num;i++) {ioctl (pperf—fd,PERF—EVENT—IOC—RESET,0);}} 6)清空t—c及t—i的值,等待一秒,并继续读取其值; 到此本系统的主要部分基本完成。全文摘要本专利技术提供,该方法利用linux提供的sys_perf_event_open系统调用,通过读取CPU的performancemanagmentunit(PMU)内容,获取实时的CPU周期及执行指令数,进而计算出系统的实时CPI。本专利技术克服了以往系统性能监测系统在微架构监测方面的不足,能做到实时准确的监控系统中每一颗CPU,并计算出其CPI数据。在高性能服务器领域,本方法可以用来及时准确的判断系统发挥的真实性能,以及可以从侧面反映一款应用程序的优劣。文档编号G06F11/30GK102855171SQ201210281960公开日2013年1月2日 申请日期2012年8月9日 优先权日2012年8月9日专利技术者刘斐然 申请人:浪潮电子信息产业股份有限公司本文档来自技高网...

【技术保护点】
一种基于linux系统的CPI实时监测的方法,?其特征在于通过读取系统内每颗CPU中PMU的CPU周期及执行指令数等相关内容,实时的计算出系统整体CPI值并输出,具体实现步骤如下:包装sys_perf_event_open系统调用: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);????????}统计系统CPU个数:int?cpu_num?=?sysconf(_SC_NPROCESSORS_ONLN);生成perf_event数组: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=?0)???????for(i=1;i...

【技术特征摘要】

【专利技术属性】
技术研发人员:刘斐然
申请(专利权)人:浪潮电子信息产业股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1