在C/C++;应用
这是我试图获取资源使用情况的简单方法,特别是在程序执行过程中发生的全部上下文切换在C/C++;应用,c,linux,performance,C,Linux,Performance,这是我试图获取资源使用情况的简单方法,特别是在程序执行过程中发生的全部上下文切换 #include<stdio.h> #include <sys/resource.h> int appgetrusage(struct rusage *); int appgetdiffrusage(struct rusage *, struct rusage *); int main() { struct rusage begin, end; appgetrusage
#include<stdio.h>
#include <sys/resource.h>
int appgetrusage(struct rusage *);
int appgetdiffrusage(struct rusage *, struct rusage *);
int main() {
struct rusage begin, end;
appgetrusage(&begin);
/*
* core of the program goes here
* where lot of system threads are spawned and joined
*
*/
appgetrusage(&end);
appgetdiffrusage(&begin, &end);
return 0;
}
int appgetrusage(struct rusage *usage){
int who = RUSAGE_SELF;
struct timeval start, end;
getrusage(RUSAGE_SELF, usage);
return 1;
}
int appgetdiffrusage(struct rusage *oldr, struct rusage *newr){
printf("\n");
printf("user time (ms): %llu\n",1000 * ((newr->ru_utime).tv_sec - (oldr->ru_utime).tv_sec) +
((newr->ru_utime).tv_usec - (oldr->ru_utime).tv_usec) / 1000);
printf("system time (ms): %ld\n", 1000 * ((newr->ru_stime).tv_sec - (oldr->ru_stime).tv_sec) +
((newr->ru_stime).tv_usec - (oldr->ru_stime).tv_usec) / 1000);
printf("voluntary context switches : %ld\n", newr->ru_nvcsw - oldr->ru_nvcsw);
printf("involuntary context switches : %ld\n", newr->ru_nivcsw - oldr->ru_nivcsw);
return 1;
}
#包括
#包括
int appgetrusage(结构rusage*);
int-AppGetDiffuse(struct-rusage*,struct-rusage*);
int main(){
结构图像开始、结束;
appgetrusage(&begin);
/*
*程序的核心在这里
*大量系统线程生成和加入的地方
*
*/
appgetrusage(&end);
AppGetDiffuse(开始和结束(&E));
返回0;
}
int appgetrusage(结构rusage*用法){
int who=RUSAGE_SELF;
结构timeval开始、结束;
getrusage(RUSAGE_SELF,usage);
返回1;
}
int-AppGetDiffusage(结构rusage*oldr,结构rusage*newr){
printf(“\n”);
printf(“用户时间(毫秒):%llu\n”,1000*((新用户->使用时间).tv_秒-(旧用户->使用时间).tv_秒)+
((newr->ru_-utime.tv_-usec-(oldr->ru-utime.tv_-usec)/1000);
printf(“系统时间(毫秒):%ld\n”,1000*((新时间->定时).tv\u秒-(旧时间->定时).tv\u秒)+
((newr->ru_-stime.tv_-usec-(oldr->ru-stime.tv_-usec)/1000);
printf(“自愿上下文切换:%ld\n”,newr->ru\u nvcsw-oldr->ru\u nvcsw);
printf(“非自愿上下文切换:%ld\n”,newr->ru\u nivcsw-oldr->ru\u nivcsw);
返回1;
}
>perf stat ./my_test 2
Thread 139828421826304:
Thread 139828411336448:
^[[A./my_test: Terminated
Performance counter stats for './my_test 2':
74333.536760 task-clock # 1.999 CPUs utilized
627 context-switches # 0.008 K/sec
26 cpu-migrations # 0.000 K/sec
282 page-faults # 0.004 K/sec
182727508914 cycles # 2.458 GHz [50.00%]
<not supported> stalled-cycles-frontend
<not supported> stalled-cycles-backend
121168605770 instructions # 0.66 insns per cycle [75.00%]
30262379463 branches # 407.116 M/sec [74.99%]
1635031 branch-misses # 0.01% of all branches [75.01%]
37.181359478 seconds time elapsed
>性能统计/my_测试2
线程139828421826304:
螺纹139828411336448:
^[[A./my_测试:终止
“/my_test 2”的性能计数器统计信息:
74333.536760任务时钟#使用了1.999个CPU
627上下文开关#0.008 K/sec
26 cpu迁移#0.000 K/sec
282页错误#0.004 K/秒
182727508914个周期#2.458 GHz[50.00%]
停止循环前端
暂停周期后端
121168605770指令#每周期0.66 INSN[75.00%]
30262379463分支机构#407.116米/秒[74.99%]
1635031分支机构未命中率#占所有分支机构的0.01%[75.01%]
37.181359478秒经过的时间
有人能提出一个替代方案吗
使用perf():
像这样:
>perf stat ./my_test 2
Thread 139828421826304:
Thread 139828411336448:
^[[A./my_test: Terminated
Performance counter stats for './my_test 2':
74333.536760 task-clock # 1.999 CPUs utilized
627 context-switches # 0.008 K/sec
26 cpu-migrations # 0.000 K/sec
282 page-faults # 0.004 K/sec
182727508914 cycles # 2.458 GHz [50.00%]
<not supported> stalled-cycles-frontend
<not supported> stalled-cycles-backend
121168605770 instructions # 0.66 insns per cycle [75.00%]
30262379463 branches # 407.116 M/sec [74.99%]
1635031 branch-misses # 0.01% of all branches [75.01%]
37.181359478 seconds time elapsed
>性能统计/my_测试2
线程139828421826304:
螺纹139828411336448:
^[[A./my_测试:终止
“/my_test 2”的性能计数器统计信息:
74333.536760任务时钟#使用了1.999个CPU
627上下文开关#0.008 K/sec
26 cpu迁移#0.000 K/sec
282页错误#0.004 K/秒
182727508914个周期#2.458 GHz[50.00%]
停止循环前端
暂停周期后端
121168605770指令#每周期0.66 INSN[75.00%]
30262379463分支机构#407.116米/秒[74.99%]
1635031分支机构未命中率#占所有分支机构的0.01%[75.01%]
37.181359478秒经过的时间
Systemtap为分析/调试用户空间和内核代码提供了极好的工具
用于查找上下文开关的systemtap脚本
在ARM中,由于uprobes(),用户空间评测还不可用。但是X86,它工作得很好。Systemtap为评测/调试用户空间和内核代码提供了极好的工具 用于查找上下文开关的systemtap脚本
在ARM中,由于uprobes()的原因,用户空间分析还不可用.但是X86,它工作得很好。你们已经共享了最好的资源,比如perf和systemtap,但是如果有人不想深入研究那么多,那么RHEL6或内核2.6.23附带的sysstat包以及更高版本都有一个名为pidstat的东西。将pidstat与
-w
一起使用,它将为您提供自愿的以及非自愿的上下文切换。你们已经共享了最好的资源,比如perf和systemtap,但是如果有人不想深入研究那么多,那么RHEL6或内核2.6.23附带的sysstat包以及后来的一个名为pidstat的包。将pidstat与-w
一起使用,它也会提供自愿的总数l作为非自愿的上下文切换。为什么您关心上下文切换?对您来说,测量实时和CPU时间不够吗?几个上下文切换会降低系统的性能。例如,非自愿的上下文切换数量越多,总是不好的。这意味着基础系统或库中存在严重错误当然,上下文切换取决于时间,但最重要的是时间……上下文切换也取决于系统的其他部分(不仅仅是应用程序…)…我同意!上下文切换取决于整个系统。因为我有一个应用程序性能下降的问题。我想知道原因:-)你认为我计算上下文切换差异的方法如何?这对研究资源使用率更高的问题有帮助吗:-)你为什么关心上下文切换ches?测量实时和CPU时间还不够吗?几个上下文切换会降低系统的性能。例如,非自愿的上下文切换数量过多总是不好的。这意味着基础系统或库中当然存在严重错误,但重要的是最终的时间……并且继续ext开关还依赖于系统的其余部分(不仅仅是应用程序…)。我同意!上下文开关依赖于整个系统。因为我有一个应用程序性能下降的问题。我对k感兴趣