跳转至

benchmarkAnalysis

perf CPU性能分析工具

下载 apt install linux-tools-common

直接使用

sudo perf stat ./target/debug/vega

备注:如果显示Workload failed: Permission denied,需要检查权限问题,使用chmod -R 777 target_file即可,前面sudo必须要有 输出结果 ```bash{.line-numbers} "/root" get lock for scheduler scheduler get job_id complete! result: [[], [0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7, 8]]

Performance counter stats for './target/debug/vega':

        391.03 msec task-clock                #    0.213 CPUs utilized          
           942      context-switches          #    2.409 K/sec                  
            13      cpu-migrations            #   33.246 /sec                   
           748      page-faults               #    1.913 K/sec                  
   630,725,775      cycles                    #    1.613 GHz                      (47.29%)
             0      stalled-cycles-frontend                                       (51.38%)
             0      stalled-cycles-backend    #    0.00% backend cycles idle      (54.35%)
             0      instructions              #    0.00  insn per cycle           (54.94%)
             0      branches                  #    0.000 /sec                     (50.76%)
             0      branch-misses             #    0.00% of all branches          (48.07%)

   1.834332719 seconds time elapsed

   0.127230000 seconds user
   0.269728000 seconds sys
可以发现使用了1.834的time elapsed但是task-clock仅仅使用了391.03ms,CPU利用率只有0.213,证明大部分时间被占用的任务并不是CPU使用密集型的,而是IO密集型的。
## 火焰图分析使用
``` bash
git clone https://github.com/brendangregg/FlameGraph
cd FlameGraph
sudo perf record --call-graph=dwarf mytest  #将这里的mytest替换成目标程序位置,或者注释掉这行,将在vega目录下产生的perf.data文件拷贝到当前目录下
sudo perf script | ./stackcollapse-perf.pl > out.perf-folded
./flamegraph.pl out.perf-folded > perf.svg

火焰图分析

火焰图的纵轴代表了函数调用栈,横轴代表了占用CPU资源的比例,跨度越大代表占用的CPU资源越多,从火焰图中我们可以更直观的看到程序中CPU资源的占用情况以及函数的调用关系。


测试内容 数据参数及规模 运行结果 运行环境 备注
pi N=100,000,000,num_slices=2 result: 3.14178564 196.554028501s yzx ubuntu release 使用新版iterator()试图减少拷贝次数
pi N=100,000,000,num_slices=2 result: 3.14138532 118.899680573s yzx ubuntu release 使用新版iterator()试图减少拷贝次数
pi N=100,000,000,num_slices=2 result: 3.14136944 123.480603307s yzx ubuntu release 使用新版iterator()试图减少拷贝次数
pi N=100,000,000,num_slices=2 result: 3.14156692 150.976415653s yzx ubuntu release 原版iterator()产生两次拷贝
pi N=100,000,000,num_slices=2 result: 3.14170632 119.148737699s yzx ubuntu release 原版iterator()产生两次拷贝
pi N=100,000,000,num_slices=2 result: 3.14166852 114.434112669s yzx ubuntu release 原版iterator()产生两次拷贝
pi N=100,000,num_slices=2 result: 3.13 39.911636275s yzx ubuntu release 原版iterator()产生两次拷贝
wordcount 100MB 用时52.2066s yzx ubuntu pyspark 使用timeit进行计时
wordcount 100MB 用时52.4881s yzx ubuntu pyspark 使用timeit进行计时
wordcount 100MB 用时26.5643s yzx ubuntu pyspark 使用timeit进行计时,连续运行,使用缓存
wordcount 100MB 用时30.7437s yzx ubuntu vega release 使用perf进行分析
wordcount 100MB 用时10.7568s yzx ubuntu vega release 使用内置计时器
wordcount 100MB 用时9.72145s yzx ubuntu vega release 使用内置计时器
wordcount 100MB 用时8.69915s yzx ubuntu vega release 使用内置计时器