美文网首页perfetto 官方文档翻译
Perfetto 翻译第五篇-快速入门-基于SQL的分析和基于t

Perfetto 翻译第五篇-快速入门-基于SQL的分析和基于t

作者: David_zhou | 来源:发表于2023-09-25 21:44 被阅读0次

前言:虽然有翻译软件,虽然有chatgpt,毕竟语言隔阂,对这个工具还是一知半解,因此想通过翻译的方式和大家来一起学习下Perfetto这个强大的工具

Perfetto 介绍第一篇
Perfetto 介绍第二篇
Perfetto 介绍第三篇
Perfetto 介绍第四篇

#####################以下分割线#####################

英文原文在这里
本篇入门示范如何使用Trace Processor和Python 的API 来查询trace中的内容以及如何计算基于trace的度量

Trace Processor

Trace Processor是一个基于SQLite的多格式trace导入和查询引擎。它既是一个C++库,也是一个独立的可执行文件:trace_processor_shell(或者只是trace_proccessor)。

安装
# Download prebuilts (Linux and Mac only)
curl -LO https://get.perfetto.dev/trace_processor
chmod +x ./trace_processor

# Start the interactive shell
./trace_processor trace.perfetto-trace

# Start a local trace processor instance to replace wasm module in the UI
./trace_processor trace.perfetto-trace --httpd

在HTTP模式下,trace将加载到trace_processor中,而UI将通过TCP进行连接并发出查询。这可以允许加载任意大小的trace,因为与WASM模块不同,没有内存约束。因此这可以提高UI在SQL查询时的响应速度。
查询Trace Processor docs了解完整的使用方式

查询示范

有关更详尽的示例,请参阅各种数据源文档的SQL部分。

切片

切片是类似堆栈的事件,具有名称并持续一定的时间。


Slices.png

查询示范及输出样例:

> SELECT ts, dur, name FROM slice
ts                   dur                  name
-------------------- -------------------- ---------------------------
     261187017446933               358594 eglSwapBuffersWithDamageKHR
     261187017518340                  357 onMessageReceived
     261187020825163                 9948 queueBuffer
     261187021345235                  642 bufferLoad
     261187121345235                  153 query
     ...
计数器

计数器是有具体数值的事件,数值会随着时间变化。示意图:


Counters.png

查询示范及输出:

> SELECT ts, value FROM counter
ts                   value
-------------------- --------------------
     261187012149954          1454.000000
     261187012399172          4232.000000
     261187012447402         14304.000000
     261187012535839         15490.000000
     261187012590890         17490.000000
     261187012590890         16590.000000
...
调度程序切片

调度器切片指示哪个线程在哪个CPU上、哪个时间被调度。


Scheduler slices.png

查询示范:

> SELECT ts, dur, cpu, utid FROM sched
ts                   dur                  cpu                  utid
-------------------- -------------------- -------------------- --------------------
   261187012170489               267188                    0                  390
   261187012170995               247153                    1                  767
   261187012418183                12812                    2                 2790
   261187012421099               220000                    6                  683
   261187012430995                72396                    7                 2791
...
基于trace的度量

Trace Processor还提供了一个更高级的查询接口,允许运行预处理的查询,这里称为“metrics”。度量通常由领域专家策划,通常是最初添加插入点并输出结构化JSON/Protobuf/文本的人。度量允许获得trace的摘要视图,而无需键入任何SQL或在UI中加载trace。

metrics的模式文件位于/protos/perfetto/metrics目录中。相应的SQL查询位于/src/trace_processor/metrics中。

运行一个metrics

以运行android_cpu度量为例。该指标计算跟踪中每个进程的总CPU时间和总周期(CPU频率*在该频率下运行的时间),并按CPU(核心)数进行细分。

./trace_processor --run-metrics android_cpu trace.perfetto-trace

android_cpu {
  process_info {
    name: "/system/bin/init"
    threads {
      name: "init"
      core {
        id: 1
        metrics {
          mcycles: 1
          runtime_ns: 570365
          min_freq_khz: 1900800
          max_freq_khz: 1900800
          avg_freq_khz: 1902017
        }
      }
      core {
        id: 3
        metrics {
          mcycles: 0
          runtime_ns: 366406
          min_freq_khz: 1900800
          max_freq_khz: 1900800
          avg_freq_khz: 1902908
        }
      }
      ...
    }
    ...
  }
  process_info {
    name: "/system/bin/logd"
    threads {
      name: "logd.writer"
      core {
        id: 0
        metrics {
          mcycles: 8
          runtime_ns: 33842357
          min_freq_khz: 595200
          max_freq_khz: 1900800
          avg_freq_khz: 1891825
        }
      }
      core {
        id: 1
        metrics {
          mcycles: 9
          runtime_ns: 36019300
          min_freq_khz: 1171200
          max_freq_khz: 1900800
          avg_freq_khz: 1887969
        }
      }
      ...
    }
    ...
  }
  ...
}

运行多个metrics

可以使用逗号分隔符对--run metrics、标记多个度量。这将输出一个文本原型,其中包含运行两个度量的组合结果。

$ ./trace_processor --run-metrics android_mem,android_cpu trace.perfetto-trace

android_mem {
  process_metrics {
    process_name: ".dataservices"
    total_counters {
      anon_rss {
        min: 19451904
        max: 19890176
        avg: 19837548.157829277
      }
      file_rss {
        min: 25804800
        max: 25829376
        avg: 25827909.957489081
      }
      swap {
        min: 9289728
        max: 9728000
        avg: 9342355.8421707246
      }
      anon_and_swap {
        min: 29179904
        max: 29179904
        avg: 29179904
      }
    }
    ...
  }
  ...
}
android_cpu {
  process_info {
    name: "/system/bin/init"
    threads {
      name: "init"
      core {
        id: 1
        metrics {
          mcycles: 1
          runtime_ns: 570365
          min_freq_khz: 1900800
          max_freq_khz: 1900800
          avg_freq_khz: 1902017
        }
      }
      ...
    }
    ...
  }
  ...
}
JSON 和二进制文件输出

trace processor还支持二进制protobuf和JSON作为替代输出格式。当离线时,这很有用。
与原始文本输出一样,支持单个和多个度量。

./trace_processor --run-metrics android_mem --metrics-output=binary trace.perfetto-trace
<binary protobuf output>

./trace_processor --run-metrics android_mem,android_cpu --metrics-output=json trace.perfetto-trace
{
  "android_mem": {
    "process_metrics": [
      {
        "process_name": ".dataservices",
        "total_counters": {
          "anon_rss": {
            "min": 19451904.000000,
            "max": 19890176.000000,
            "avg": 19837548.157829
          },
          "file_rss": {
            "min": 25804800.000000,
            "max": 25829376.000000,
            "avg": 25827909.957489
          },
          "swap": {
            "min": 9289728.000000,
            "max": 9728000.000000,
            "avg": 9342355.842171
          },
          "anon_and_swap": {
            "min": 29179904.000000,
            "max": 29179904.000000,
            "avg": 29179904.000000
          }
        },
        ...
      },
      ...
    ]
  }
  "android_cpu": {
    "process_info": [
      {
        "name": "\/system\/bin\/init",
        "threads": [
          {
            "name": "init",
            "core": [
              {
                "id": 1,
                "metrics": {
                  "mcycles": 1,
                  "runtime_ns": 570365,
                  "min_freq_khz": 1900800,
                  "max_freq_khz": 1900800,
                  "avg_freq_khz": 1902017
                }
              },
              ...
            ]
            ...
          }
          ...
        ]
        ...
      },
      ...
    ]
    ...
  }
}

Python API

使用Python可以直接查询trace,而不再需要trace_processor

安装
$ pip install perfetto

注意:perfetto仅支持Python 3.

功能演示

请参阅 Trace Processor (SQL) 的Python API部分,以获取有关所有可用函数的更多详细信息。

查询

from perfetto.trace_processor import TraceProcessor
tp = TraceProcessor(trace='trace.perfetto-trace')

qr_it = tp.query('SELECT name FROM slice')
for row in qr_it:
  print(row.name)

输出

eglSwapBuffersWithDamageKHR
onMessageReceived
queueBuffer
bufferLoad
query
...

使用Pandas 数据帧查询

from perfetto.trace_processor import TraceProcessor
tp = TraceProcessor(trace='trace.perfetto-trace')

qr_it = tp.query('SELECT ts, name FROM slice')
qr_df = qr_it.as_pandas_dataframe()
print(qr_df.to_string())

输出

ts                   name
-------------------- ---------------------------
     261187017446933 eglSwapBuffersWithDamageKHR
     261187017518340 onMessageReceived
     261187020825163 queueBuffer
     261187021345235 bufferLoad
     261187121345235 query
     ...

Metic

from perfetto.trace_processor import TraceProcessor
tp = TraceProcessor(trace='trace.perfetto-trace')

cpu_metrics = tp.metric(['android_cpu'])
print(cpu_metrics)

输出:

metrics {
  android_cpu {
    process_info {
      name: "/system/bin/init"
      threads {
        name: "init"
        core {
          id: 1
          metrics {
            mcycles: 1
            runtime_ns: 570365
            min_freq_khz: 1900800
            max_freq_khz: 1900800
            avg_freq_khz: 1902017
          }
        }
        core {
          id: 3
          metrics {
            mcycles: 0
            runtime_ns: 366406
            min_freq_khz: 1900800
            max_freq_khz: 1900800
            avg_freq_khz: 1902908
          }
        }
        ...
      }
      ...
    }
    ...
  }
}

还可以从以下这些方面来探索Perfetto更多trace分析功能:

#####################以上分割线#####################

后记:
1 本次主要使用百度翻译,虽然被骂,但至少翻译这个工具降低了门槛。
2 英文文档中的长难句真的是又长又难,基于百度的翻译,然后自己再调整下,水平实在有限。
3 技术背景知识不够,有些专有名词不知道怎么翻译,也不知道百度翻译的是否准确,功夫在诗外。
4 万事开头难,中间难不难,还不知道。中间的事后面再说,正确一天翻译一篇。
5 虽然可能会有人不屑,但总要有人去做不起眼的小事。
6 google 厉害,这个perfetto 工具也很厉害。君子善假于物也。
7 工具的使用是最简单的入门,背后还有更多的东西值得学习。
8 水平实在有限,闻过则喜,希望有更多的人反馈,期待更好的建议

相关文章

  • Spark SQL概述

    一、SQL on Hadoop 使用SQL基于Hadoop进行业务处理和分析,常用的框架: H...

  • CDH6.0-HBase集成Phoenix5.0

    Apache Phoenix 为 Apache Hadoop 提供基于 SQL 的 OLTP 和运营分析,使用 A...

  • Day1—Irene

    入门引言 以转录组学为例,上游分析基于linux,包括质控、过滤、比对、定量,下游分析基于R语言,包括差异分析、富...

  • Spark编程快速入门

    本教程基于Spark官网的快速入门教程改编而来,官方文档和中文翻译的传送门见最下方。(注意,实际情况可能因为版本不...

  • 笔记: GCE BigQuery vs AWS Redshift

    用 SQL 分析数据, AWS 有 Redshift 和去年 re:Invent 2016 上发布了基于 Pres...

  • Spark_性能调优及Spark3.0新特性

    1.spark_shuffle_分区数 spark_sql aqe 优化SparkSQL中,基于SQL分析或者D...

  • Java集合(容器)框架 01 - ArrayList源码分析

    说明: 源码分析基于 JDK1.8 ArrayList简介 ArrayList 是基于数组实现的,支持快速随机访问...

  • spring secuity快速入门

    我们使用springmvc web项目基于xml配置文件和注解配置类二种方式来写一个快速入门。 基于配置文件的sp...

  • Microsoft SQL Server软件T-SQL语言程序设

      本文介绍基于Microsoft SQL Server软件,实现数据库T-SQL语言程序设计,以及游标的定义、使...

  • 盲注

    盲注:1.基于布尔的SQL盲注。 2.基于时间的SQL盲注。 3.基于报错的SQL盲注。 布尔SQL盲注:逻辑判断...

网友评论

    本文标题:Perfetto 翻译第五篇-快速入门-基于SQL的分析和基于t

    本文链接:https://www.haomeiwen.com/subject/jexqbdtx.html