Perfetto工具使用简介

简介

Perfetto工具是Android下一代全新的统一的trace收集和分析框架,可以抓取平台和app的trace信息,是用来取代systrace的,但systrace由于历史原因也还会一直存在,并且Perfetto抓取的trace文件也可以同样转换成systrace视图,如果习惯用systrace的,可以用Perfetto UI的"Open with legacy UI"转换成systrace视图来看,Perfetto的几个主要特点如下所示:

  • 可以在线抓取长时间的trace,可以长达一个小时,另外抓取的文件size也可以达到GB级别,这样就可以在后台开启,让它一直抓取trace了,特别适用于那种复现概率很低,又比较严重的性能问题。
  • 抓取到trace文件之后,它的格式是protobuf或者json,需要用到Perfetto的一个C++库,这个库可以基于protobuf或者json提供出来一个SQL语言操作的接口,这个C++库可以基于命令行,也可以集成到其他工具中,后面会有相关介绍。
  • Perfetto具有很好的可扩展性,它除了提供标准的tracepoints之外,例如CPU调度信息,内存信息等,还可以通过atrace HAL层扩展,在Android P当中,Google新增加了一个atrace HAL层,atrace进程可以调用这个HAL的接口来获取当前的扩展信息,相关代码可见Google 提交,这样如果需要扩展tracepoints的话,就可以按照graphic的示例添加即可。
  • 提供全新的Perfetto UI网站,可以在上面通过选取开关的方式,自动生成抓取trace的命令,同时可以打开trace文件,自动把protobuf或者json转变成UI,另外还集成了几种预定义的trace分析统计工具,详情可见它的 Metrics and auditors 选项。
    Perfetto本身是一个框架,关于它的架构和模块的详细介绍,有兴趣的可以参考它的doc网站,它的源码可以参考Android Source Tree的 /external/perfetto 目录,里面有很多的tools和脚本,可以拿来直接使用,本文只对这个工具做简单的使用介绍。

Trace收集流程

在讲具体的收集流程之前,可以先看一下它的整体框架图,它的进程结构,其中有几个重要的进程需要说明一下:


Perfetto整体框架图
  • traced:
    The unprivileged trace daemon that owns the log buffers and maintains a registry of Producers and Consumers connected.
  • traced_probes:
    The privileged daemon that has access to the Kernel tracefs (typically mounted under /sys/kernel/debug/tracing). It drives Ftrace and writes its protobuf-translated contents into traced.
  • perfetto:
    A command line utility client that drive the trace and save back the results (either to a file or to Android’s Dropbox)
    为了能更好的了解这几个进程的用途,这里就没有使用中文来翻译了,免得更加不好理解,perfetto是一个命令行工具,在shell环境下执行,同时在手机端也有两个进程:traced和traced_probes,这两个进程运行在手机端,如果只是使用这个工具的话,只要懂得perfetto命令行工具的用法就可以了,如果还想深入了解Perfetto的话,可以直接看它的源码,对于它的理解在它的doc网站上其实还有另一种视图:
Perfetto的另一种视图

暂时还没有去研究它的源码,所以还无法将上面的两种视图一一对应起来,这里列出另一种视图,只是想让大家增加对这个工具的更深一步了解,上面说了除了标准的tracepoints之外,Perfetto还可以提供很好的可扩展性,这里我们先看一下标准的tracepoints有哪些,如下图所示,相对于以前的systrace来说,我们发现Perfetto还是可以提供一些其他的功能的,例如它可以直接抓取event log了,还有Virtual memory events等等。


标准的tracepoints

在Pixel和Pixel2机型上面,traced和traced_probes这两个进程是默认开启的,但是在其他机型上面,可能需要执行如下命令才会开启这两个进程,开启这两个进程之后,才能正常抓取trace信息,开启的方式也很方便,只要设置一个属性就可了。

adb shell setprop persist.traced.enable 1

执行上面的命令后,如果看到如下类似的Log,那么就说明开启成功了,也可以直接ps看有没有这两个进程。

$ adb logcat -s perfetto
perfetto: service.cc:45 Started traced, listening on /dev/socket/traced_producer /dev/socket/traced_consumer
perfetto: probes.cc:25 Starting /system/bin/traced_probes service
perfetto: probes_producer.cc:32 Connected to the service

开启了守护进程之后,就可以执行perfetto命令行工具了,这个命令行的工具的使用方式,具体参数的含义就不一一介绍了,直接看comment就好。

1902:/ # perfetto
perfetto_cmd.cc:89
Usage: perfetto
  --background     -b     : Exits immediately and continues tracing in background
  --config         -c     : /path/to/trace/config/file or - for stdin
  --out            -o     : /path/to/out/trace/file
  --dropbox        -d TAG : Upload trace into DropBox using tag TAG (default: perfetto)
  --no-guardrails  -n     : Ignore guardrails triggered when using --dropbox (for testing).
  --help           -h

statsd-specific flags:
  --alert-id           : ID of the alert that triggered this trace.
  --config-id          : ID of the triggering config.
  --config-uid         : UID of app which registered the config.

其中 --out是用来指定trace输出文件,--config 是用来指定配置的,也就是像抓多长时间,间隔多久把内存数据写回文件,抓取哪些tracepoints等等,这个config文件内容,我们可以自己手动编写,也可以用Perfetto UI网站生成,另外在Perfetto里面默认集成了一个test配置,你可以使用如下命令抓取一个使用test config的trace文件。

$ adb shell perfetto --config :test --out /data/misc/perfetto-traces/trace //使用内置的test配置,然后输出到/data/misc/perfetto-traces/trace

抓取完后,把/data/misc/perfetto-traces/trace文件内容pull出来,然后使用Perfetto UI网站打开即可,如下所示:


UI模式

自定义Config

目前最方便的配置文件生成方式是使用ui.perfetto.devPerfetto UI来帮助生成,点开Perfetto UI的"Record new trace"之后,你会看到有很多的配置界面,如以下几个图所示:

RecordingMode配置界面

CPU配置页面

Android apps和Service配置页面

选择好你想要的tracepoints之后,点击Start recording,就会生成如下命令内容,将这个命令内容拷贝出来直接在终端就可以执行,完成之后就把/data/misc/perfetto-traces/trace 这个文件拷贝出来,用上面的ui.perfetto.dev分析就可以了。

adb shell perfetto \
  -c - --txt \
  -o /data/misc/perfetto-traces/trace \
<<EOF

buffers: {
    size_kb: 8960
    fill_policy: DISCARD
}
buffers: {
    size_kb: 1280
    fill_policy: DISCARD
}
data_sources: {
    config {
        name: "linux.process_stats"
        target_buffer: 1
        process_stats_config {
            scan_all_processes_on_start: true
        }
    }
}
data_sources: {
    config {
        name: "android.log"
        android_log_config {
        }
    }
}
data_sources: {
    config {
        name: "linux.ftrace"
        ftrace_config {
            ftrace_events: "sched/sched_switch"
            ftrace_events: "power/suspend_resume"
            ftrace_events: "sched/sched_wakeup"
            ftrace_events: "sched/sched_wakeup_new"
            ftrace_events: "sched/sched_process_exit"
            ftrace_events: "sched/sched_process_free"
            ftrace_events: "task/task_newtask"
            ftrace_events: "task/task_rename"
        }
    }
}
duration_ms: 10000

EOF
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,322评论 5 465
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,288评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,227评论 0 327
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,015评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,936评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,534评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,995评论 3 389
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,616评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,907评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,923评论 2 315
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,741评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,525评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,016评论 3 301
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,141评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,453评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,054评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,249评论 2 339

推荐阅读更多精彩内容