这是我试图获取资源使用情况的简单方法,特别是在程序执行过程中发生的总上下文切换。
#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;
}发布于 2014-02-18 08:33:17
Systemtap为配置/调试用户空间以及内核代码提供了很好的工具。
查找上下文开关的系统调用脚本( cpu.stp )
在ARM中,由于u探针(https://blueprints.launchpad.net/linux-linaro/+spec/arm-uprobes)的存在,用户空间分析还不可用。但是X86,它工作得很好。
发布于 2014-02-22 14:13:07
你们已经共享了最好的资源,比如perf和systemtap,但是如果有人只是不想看那么深,那么sysstat包就会附带RHEL6或内核2.6.23,然后有一个叫做pidstat的东西。与-w一起使用pidstat,它将为您提供自愿和非自愿上下文切换的总数。
https://stackoverflow.com/questions/21847442
复制相似问题