性能工具perf

perf record/report

pert record

对于下面的一段代码进行分析

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

int func1()
{
    int val = 0;
    for(int i=0;i<100000000;i++)
    {
        val = val * i;
    }
    return val;
}

int func2()
{
    int val = 0;
    for (int i=0;i<50;i++)
    {
        val = val * func1();
        usleep(100);
        printf("test print %d \n",i);
    }
    return val;
}

int main()
{
    func2();
}
perf report 采样
sudo perf record -F 99 -a -g ./demo1

# -F 99 
表示采样的频率 

# -a
录取所有CPU的事件

# -g
使能函数调用图功能

其他选项
-o 指定录取保存数据的文件名
-g 使能函数调用图功能
-C 录取指定CPU的事件

perf report
# 生成报告的预览
perf report

可以看到在图中,main,func1,func2函数占了很高的比例。


性能工具perf_第1张图片
image.png
# 产生比较详细的报告 
sudo perf report -n --stdio
  • 分析某一个已经启动的进程
sudo perf record -F 99 -p 4989 -g 

# -p 
指明进程的pid
  • 分析一个守护进程
    在实际中,我要分析的进程是一个守护进程,所有,没有办法直接的使用第一种方式去分析。所有,只能-p pid的方式去分析。
  • 画火焰图
git clone --depth 1 https://github.com/brendangregg/FlameGraph.git

# 到处out.perf 文件
sudo perf script > out.perf

# 折叠调用栈
FlameGraph/stackcollapse-perf.pl out.perf > out.folded

# 生成火焰图
$ FlameGraph/flamegraph.pl out.folded > out.svg
性能工具perf_第2张图片
image.png
分析nginx的work进程
  • 修改nginx的配置
/etc/nginx$ sudo vim nginx.conf
user www-data;
worker_processes 1;   #修改
pid /run/nginx.pid;


#master_process off;
#daemon off;

events {
        worker_connections 768;
        # multi_accept on;
}
/etc/init.d/nginx stop
/etc/init.d/nginx start
image.png
# 压测一下
ab -n 10000 -c 10 http://127.0.0.1/
  • perf 分析nginx work的进程,生成火焰图


    性能工具perf_第3张图片

参考:

https://blog.csdn.net/zhangskd/article/details/37902159

https://nanxiao.me/perf-note-4-profile-application/

https://www.cnblogs.com/arnoldlu/p/6241297.html

性能工具perf_第4张图片
image.png

nginx 单进程 https://blog.csdn.net/eastlhu/article/details/52182368


  • perf 分析
    http://senlinzhan.github.io/2018/03/18/perf/
  • 一个不错的git rep
    https://github.com/lidaohang/quick_location

你可能感兴趣的:(性能工具perf)