深入探究Perfetto

一、Perfetto概述

Perfetto是一款基于Linux平台下开发的系统跟踪工具,旨在提供类似Android Studio的profiler工具的功能,但更轻量级和可定制。Perfetto提供了低开销的内核探测器,将跟踪数据缓存到内存中,并通过插件式的API,让开发者可以更灵活地进行配置和使用。

下面是一个使用Perfetto进行内存分析的示例:

trace_config {
  buffers {
    size_kb: 102400
  }
  duration_ms: 30000
  buffer_size_trigger: { threshold_kb: 1024 left_percent: 20 }
  triggers {
    perfetto_config {
      name: "global"
      duration_ms: 5000
    }
    perfetto_config {
      name: "my_process"
      duration_ms: 1000
      filter: "upid == $my_upid"
    }
  }
}

data_sources {
  config {
    name: "linux.ftrace"
    target_buffer: "kernel"
    ftrace_config {
      ftrace_events: "sched_switch,sched_wakeup"
      include_overhead: true
      buffer_size_kb: 2048
      drain_period_ms: 5000
    }
  }
  config {
    name: "linux.process_stats"
    target_buffer: "user"
    process_stats_config {
      scan_all_processes_on_start: true
      scan_interval_ms: 1000
    }
  }
  config {
    name: "android.heapprofd"
    target_buffer: "user"
    heapprofd_config {
      sampling_interval_bytes: 4096
      continuous_dump_config {
        dump_interval_ms: 100
        dump_phase_ms: 100
      }
    }
  }
}

二、Perfetto插件系统

Perfetto提供了一套插件API,使开发者可以利用Perfetto的核心功能在自己的代码中进行定制。插件可以包括数据源、后处理器、实时监测器和可视化插件。下面是一个使用Perfetto数据源插件的示例:

int MyDataSource::Setup(DataSourceConfig config) {
  if (config.name() != "my_data_source") {
    PERFETTO_ELOG("MyDataSource received wrong name");
    return 0;
  }
  PERFETTO_ILOG("MyDataSource setup");

  // Start the async work.
  async_task_.reset(new base::TaskRunnerThread("my_data_source"));
  async_task_->PostTask([this, options = config.my_data_source_config() {
    SetupWorkerThread(options);
  }]);
  return 1;
}

三、Perfetto的性能优化

Perfetto通过多种方式进行性能优化,例如采用Ring Buffer、避免频繁分配内存和避免加锁等。下面是一个避免加锁操作的示例:

struct TlsMetadata {
  uint64_t start_ts = 0;
  uint64_t end_ts = 0;
};

void SampleProfiler::Record(uintptr_t tid, uint64_t ts) {
  static thread_local std::unordered_map tls_metadata_;
  TlsMetadata& tls_md = tls_metadata_[perfetto::base::GetTid()];

  // Try to expedite the common case.
  if (PERFETTO_UNLIKELY(ts < tls_md.end_ts)) {
    tls_md.end_ts = ts + 1;
    return;
  }

  std::lock_guard lock(metadata_mutex_);
  if (metadata_.size() >= kMaxMetadataSize)
    return;

  metadata_.push_back(Metadata{tid, std::array(), ts});
  tls_md.start_ts = tls_md.end_ts = ts;
}

四、Perfetto在实际应用中的使用场景

Perfetto可以被用于诊断各种性能瓶颈,例如内存泄漏、UI卡顿和高CPU使用率等。下面是一个使用Perfetto诊断因UI更新频繁而导致的卡顿问题的示例:

chrome://tracing

async function trackFrames() {
  const {trace} = await perfettoTrace();
  const frames = perfetto_frames(trace);
  const frametimes = frames.map(f => f.duration * 1000);
  updateUI(frametimes);
}

五、结束语

通过本文的介绍,我们可以看出Perfetto在系统跟踪方面具有强大的能力和广泛的应用场景。Perfetto的轻量级和灵活性可以让开发者在优化性能方面具有更多的操作空间。因此,在性能调优过程中,我们可以考虑使用Perfetto来帮助我们更好地解决问题。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/259253.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-15 16:28
下一篇 2024-12-15 16:28

相关推荐

  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • 深入了解scala-maven-plugin

    一、简介 Scala-maven-plugin 是一个创造和管理 Scala 项目的maven插件,它可以自动生成基本项目结构、依赖配置、Scala文件等。使用它可以使我们专注于代…

    编程 2025-04-25
  • 深入了解LaTeX的脚注(latexfootnote)

    一、基本介绍 LaTeX作为一种排版软件,具有各种各样的功能,其中脚注(footnote)是一个十分重要的功能之一。在LaTeX中,脚注是用命令latexfootnote来实现的。…

    编程 2025-04-25
  • 深入剖析MapStruct未生成实现类问题

    一、MapStruct简介 MapStruct是一个Java bean映射器,它通过注解和代码生成来在Java bean之间转换成本类代码,实现类型安全,简单而不失灵活。 作为一个…

    编程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一个程序就是一个模块,而一个模块可以引入另一个模块,这样就形成了包。包就是有多个模块组成的一个大模块,也可以看做是一个文件夹。包可以有效地组织代码和数据…

    编程 2025-04-25
  • 深入探讨冯诺依曼原理

    一、原理概述 冯诺依曼原理,又称“存储程序控制原理”,是指计算机的程序和数据都存储在同一个存储器中,并且通过一个统一的总线来传输数据。这个原理的提出,是计算机科学发展中的重大进展,…

    编程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r为前缀的字符串。r字符串中的反斜杠(\)不会被转义,而是被当作普通字符处理,这使得r字符串可以非常方便…

    编程 2025-04-25

发表回复

登录后才能评论