1.用 perf report 分析四个for进程

在Ubuntu的 home/用户名 写文件,另外/user是系统文件,需要root权限。
创建名为 test 的文件夹 :mkdir test(删除文件/文件夹:rm)
创建名为 fourfork.c 的文件用于测试 : vi fourfork.c

#include <stdio.h>

void test_little(void)
{
  int i,j;

  for(i = 0; i < 30000000; i++) 
    j=i; 
}

void test_mdedium(void)
{
  int i,j;

  for(i = 0; i < 60000000; i++) 
    j=i; 
}

void test_high(void)
{
  int i,j;

  for(i = 0; i < 90000000; i++) 
    j=i; 
}

void test_hi(void)
{
  int i,j;

  for(i = 0; i < 120000000; i++) 
    j=i; 
}

int main(void)
{
  int i, pid, result;

  for(i = 0; i<2; i++) {
    result = fork();
    /*fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。*/
    if(result>0)
      printf("i=%d parent parent=%d current=%d child=%d\n", i, getppid(), getpid(), result);
    else
      printf("i=%d child parent=%d current=%d\n", i, getppid(), getpid());

    if(i==0)
    {
      test_little();
      sleep(1);
    } else {
      test_mdedium();
      sleep(1);
    }
  }
/*等待子进程退出。NULL的意思是退出状态不关注。如果要获取退出状态应该写成wait(&status);*/
  pid = wait(NULL);
  test_high();
  printf("pid=%d wait=%d\n", getpid(), pid);
  sleep(1);
  pid = wait(NULL);
  test_hi();
  printf("pid=%d wait=%d\n", getpid(), pid);
  return 0;
}

编译fork.c文件gcc fourfork.c -o fourfork -g -O0

.c只是简单的文本文件
.o是编译之后的二进制文件:gcc -c test.c -o test.o
不带后缀的是可执行文件(相当于.exe):
gcc test.c -o test(直接编译)
gcc test.o -o test(从二进制编译成可执行)

gcc选项:
-O0是关闭优化
-o 指定录取保存数据的文件名
-g 使能函数调用图功能
gcc其他其他:
-e record指定PMU事件
–filter event事件过滤器
-a 录取所有CPU的事件
-p 录取指定pid进程的事件
-C 录取指定CPU的事件

在当前目录生成perf.data文件:
sudo perf record -a -g ./fourfork
perf report分析:
如果想看所有的进程:sudo perf report --call-graph none(我的机器上不好使,perf report可以)

说明:swapper 时钟
它只在系统初始化时创建 init 进程,之后,它就成了一个最低优先级的空闲任
务。也就是说,当 CPU 上没有其他任务运行时,就会执行 swapper 。所以,你可以称它为“空闲任务”。事件都耗费在了 do_idle 上,也就是在执行空闲任务。

说明:self,children含义
Self 是最后一列的符号(可以理解为函数)本身所占比例;
Children 是这个符号调用的其他符号(可以理解为子函数,包括直接和间接调用)占用
的比例之和。

如果只看fourfork的:sudo perf report --call-graph none -c fourfork

-i 导入的数据文件名称,如果没有则默认为perf.data
-g 生成函数调用关系图,此时内核要打开CONFIG_KALLSYMS;用户空间库或者执行文件需要带符号信息(not stripped),编译选项需要加上-g。
-sort 从更高层面显示分类统计信息,比如: pid, comm, dso, symbol, parent, cpu,socket, srcline, weight, local_weight.

下载,更新,移除软件包命令
想更新perf,提示:E: 无法定位软件包 perf,尝试解决方法如下,源更新了,update了,但依然无法定位perf
Ubuntu出现无法定位软件包,更换源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值