计算机系统基础第四篇-7性能分析和优化

在性能剖析阶段,需要借助于现有的profiling工具,如perf等。但是性能优化没有固定的套路,要根据实际情况决定。这里主要介绍perf工具的使用,看看性能的瓶颈在哪里。perf是一款Linux性能分析工具,它不但可以分析制定应用程序的性能问题(per thread),也可以用来分析内核的性能问题。

  1. perf top命令
    perf top输入后,监控所有进程性能,主要有4列:
    第一列:符号引发的性能事件的比例,指占用的cpu周期比例。
    第二列:符号所在的DSO(Dynamic Shared Object),可以是应用程序、内核、动态链接库、模块。
    第三列:DSO的类型。[.]表示此符号属于用户态的ELF文件,包括可执行文件与动态链接库;[k]表述此符号属于内核或模块。
    第四列:符号名。有些符号不能解析为函数名,只能用地址表示。
    举个例子,新建个文件,main.cpp
#include                                                                     
using namespace std;
int fillData(int *a, int len)
{
    for (int i = 0;i < len;i++) {
        a[i] = (i+1)/3;
    }   
}

int calc(int input, int len) 
{
    int res = 0;
    for (int i = 0;i < len;i++) {
        res += input;
    }   
    return res;
}

int main()
{
    for (int j = 0;j<50;j++) {
        for (int i = 0;i <30000;i++) {
           int* result = new int[i*10]; 
           fillData(result, i*10);
           calc(result[0], i); 
           delete []result;
        }
    }   
    return 0;
}

编译后运行:

g++ main.cpp -g -o testPerm
./testPerm 

新开一个终端,输入:

perf top

结果为:
计算机系统基础第四篇-7性能分析和优化_第1张图片

perf top常用选项有:
-e :指明要分析的性能事件。
-p :Profile events on existing Process ID (comma sperated list). 仅分析目标进程及其创建的线程。
-k :Path to vmlinux. Required for annotation functionality. 带符号表的内核映像所在的路径。
-K:不显示属于内核或模块的符号。
-U:不显示属于用户态程序的符号。
-d :界面的刷新周期,默认为2s,因为perf top默认每2s从mmap的内存区域读取一次性能数据。
-g:得到函数的调用关系图。

比如想指定进程并看看函数调用关系:

perf top -g -p 17063

计算机系统基础第四篇-7性能分析和优化_第2张图片

2 perf record 和perf report命令
监控指定pid进程的性能,输入:

 perf record -a -g -p 17063

运行一段时间后,输入:

erf report -g --tui

结果为:
计算机系统基础第四篇-7性能分析和优化_第3张图片
通过方向键移动,打开加号后可以看程序运行时间都花在哪里了。

你可能感兴趣的:(计算机系统基础第四篇-7性能分析和优化)