基于 Service 的模型

Perfetto Stack

服务

trace Service 是一个长期存在的实体(Linux/Android 上的系统守护进程,Chrome 中的服务),具有以下职责:

生产者

生产者是一个不受信任的实体,提供为 Trace 做出贡献的能力。在多进程模型中,生产者几乎总是对应于 Trace Service 的客户端进程。它通告其使用一个或多个数据源为 Trace 做出贡献的能力。每个生产者具有确切地:

生产者与消费者完全解耦(技术上和概念上)。生产者对以下一无所知:

NOTE: 在极少数情况下,一个进程可以托管多个生产者,因此有多个共享内存缓冲区。对于捆绑第三方库的进程可能是这种情况,而这些库又包括 Perfetto 客户端库。具体示例:在未来某个时候,Chrome 可能会为一个 Producer 用于主项目中的 Trace,一个用于 V8,一个用于 Skia(对于每个子进程)。

消费者

消费者是一个受信任的实体(Linux/Android 上的命令行客户端,Chrome 中浏览器进程的接口),它(非独占地)控制 Trace Service 并回读(破坏性地)Trace 缓冲区。消费者有能力:

数据源

数据源是生产者公开的提供某些 Trace 数据的能力。数据源几乎总是定义自己的模式(一个 protobuf),由以下组成:

(示例)

不同的生产者可能会公开相同的数据源。一个具体的示例是使用 Tracing SDK 中的 Track Event 的进程的情况。它在每个参与的进程中公开相同的 track_event 数据源。

IPC 通道

在多进程场景中,每个生产者和每个消费者使用 IPC 通道与 Service 交互。IPC 仅用于非快速路径交互,主要是握手,例如启用/禁用 Trace(消费者)、(取消)注册和启动/停止数据源(生产者)。IPC 通常不用于传输 Trace 的 protobuf。Perfetto 提供了一个 POSIX 友好的 IPC 实现,基于 UNIX socket 上的 protobuf(参见 Socket 协议)。

不强制要求该 IPC 实现。Perfetto 允许嵌入器:

共享内存缓冲区

生产者使用称为 ProtoZero 的特殊库,以 protobuf 编码的二进制 blob 的形式,将 Trace 数据直接写入其共享内存缓冲区。共享内存缓冲区:

每个块:

有关此缓冲区的二进制格式的更多详细信息,请参见 shared_memory_abi.h 中的注释。