首页/新闻资讯/正文详情

如何用 Perfetto 系统追踪 5 步定位卡顿与内存异常:Android 性能排查实战指南

发布时间:2026/9/24 16:06:44 来源:云帆数科 栏目:资讯中心
如何用 Perfetto 系统追踪 5 步定位卡顿与内存异常:Android 性能排查实战指南
如何用 Perfetto 系统追踪 5 步定位卡顿与内存异常Android 性能排查实战指南【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfetto灰度放量到 20% 后第 3 分钟应用的 P99 帧耗时从 18ms 跳到 61ms10 分钟内该页面进程的 RSS 又涨了 120MB。卡顿和内存增长同时出现分不清谁因谁果。我们用一个 Perfetto 追踪会话把两边串起来排查最后收成一条可复用的诊断路径。 三步递进排查从内存增长到锁竞争内存 10 分钟涨了 120MB先在堆侧排除泄漏打开 trace 后先切到 heapprofd 生成的火焰图heapprofd 是 Perfetto 的原生堆采样器按调用栈归属每一笔 malloc度量项选Unreleased malloc sizedump 时刻分配了还没释放的字节数。火焰图里TexturePool.acquire这一层明显最宽但肉眼看不出它是否随时间膨胀——把窗口切回 SQL用聚合查询确认这段 SQL 把未释放的分配按顶层帧聚合用来判断增长集中在哪条代码路径上。SELECT stack_profile_callsite.name AS top_frame, SUM(size) AS unreleased_bytes, SUM(count) AS unreleased_count FROM heap_profile_allocation JOIN stack_profile_callsite USING (callsite_id) WHERE size 0 GROUP BY top_frame ORDER BY unreleased_bytes DESC LIMIT 10;结果里排前三的顶层帧全部在纹理缓存路径且未释放字节数从追踪前 60 秒到后 60 秒只增加了约 4%而同一窗口 RSS 的增量几乎全部来自文件映射区。也就是说这 120MB 里真正漏的部分不足 10MB主体是纹理缓存预热堆侧可以结案。读图提示看最顶层的宽帧——帧宽在时间上保持稳定、只是整体偏宽对应的是稳定缓存而不是持续增长真正要盯的是宽度随采样推进不断变宽的帧。62% 的丢帧是 Buffer Stuffing卡顿不全在算得慢堆侧排除了泄漏嫌疑把镜头切到帧侧。FrameTimeline 是 SurfaceFlinger 里的丢帧检测模块Android 12每帧都会带一个jank_type标注卡顿类型。先用 SQL 看类型分布决定往哪边查这段查询统计目标应用丢帧的类型占比区分帧算不完和帧发太早堆在队列里。SELECT jank_type, COUNT(*) AS frame_count, AVG(dur) / 1e6 AS avg_dur_ms FROM actual_frame_timeline_slice WHERE process.name com.example.im GROUP BY jank_type ORDER BY frame_count DESC;62% 的丢帧是 Buffer Stuffing应用在前一帧还没上屏时就提交了新帧帧在 BufferQueue 里排队导致延迟增加但帧率看着还顺剩下约三分之一是 AppDeadlineMissed帧确实没在 vsync 截止时间内算完。这两类的处理方向完全不同前者要查提帧节奏后者才需要进 CPU 路径。读图提示选中一条红色切片后看详情面板里的jank_type和present_type字段这是该帧卡顿的定性结论红色表示丢帧责任方就是该进程。红帧的主线程被一个后台线程挡了 15ms挑一条 AppDeadlineMissed 红帧放大主线程状态轨道里有一段 15ms 的 Runnable→Running 等待远超正常水平。光看时序不知道它在等谁这一步把采样触发点从定时器换成调度事件本身在sched/sched_switch和sched/sched_waking上各挂一份 linux.perf 采样分别是线程被换出、线程唤醒别的线程的瞬间period: 1表示不抽样、每次事件都抓调用栈并用 tracepoint 过滤只保留目标进程避免全系统每秒两万次调度事件把缓冲区打爆这段配置在调度阻塞和唤醒两个精确时刻抓调用栈而不是按时间随机采样。data_sources { config { name: linux.perf perf_event_config { timebase { period: 1 tracepoint { name: sched/sched_switch filter: prev_comm ~ \*ImMain*\ || next_comm ~ \*ImMain*\ } } callstack_sampling { kernel_frames: true } ring_buffer_pages: 2048 } } }回放 trace 后主线程阻塞点的调用栈显示它卡在ReentrantLock.lock上尝试入队一个延迟任务顺着该线程 Running 切片上的 woken-by 链路点过去唤醒它的是一个只跑了 160us 的后台工作线程。也就是说主线程等的不是那 160us而是锁队列里排在这名线程前面的一串后台线程。读图提示把眼睛落在调用栈轨道的彩色小三角和 woken-by 链接上它们分别标出线程在哪被换出和谁把它唤醒两条调用栈合起来就能锁定锁的持有者。把过滤条件扩到全部后台线程后阻塞窗口内的每个后台线程调用栈都收敛到同一把执行器锁的 acquire/release锁竞争嫌疑坐实后台线程数量多解锁后按入队顺序逐个唤醒优先级更高的主线程反而排在长队后面这就是典型的优先级反转放大效应。完整排查过程可对照 官方调度阻塞案例 复盘。读图提示看左侧多个后台线程的调用栈——如果它们全在同一把锁的获取和释放上反复出现锁队列排队就是主线程阻塞的放大器。⚙️ 生产环境追踪配置环形缓冲区与 tracepoint 怎么开上面三个环节用到的数据源在生产监控里可以合并进一份 TraceConfig。选 256MB 的 RING_BUFFER 是因为帧分析和调度采样都会产生突发写入环形策略保证超限时丢弃最旧数据而保留事发窗口ftrace 只开sched/sched_switch而不挂 perf 高频采样把开销压到可长期开启的水平。这份配置开启调度事件、帧时间线与进程元信息三类数据源是卡顿归因场景的基线参数。buffers: { size_kb: 262144 fill_policy: RING_BUFFER } data_sources { config { name: linux.ftrace ftrace_config { ftrace_events: sched/sched_switch atrace_categories: gfx atrace_categories: view } } } data_sources { config { name: android.surfaceflinger.frametimeline } } data_sources { config { name: linux.process_stats process_stats_config { scan_all_processes_on_start: true } } }分析场景传统手段Perfetto 方案差异点卡顿归因logcat 打点人工拼时间线FrameTimeline 自动标注 jank_type丢帧直接归因到 App / SurfaceFlinger / HAL锁竞争加日志或 gdb 抓现场sched_switch/waking 精确调用栈采样能拿到唤醒方的调用栈定位锁持有者内存泄漏dump 后人工比对快照heapprofd 火焰图按调用栈归属精确到函数级别区分缓存与泄漏读图提示上方 CPU 利用率轨道与下方进程切片按时间对齐利用率尖峰和某条业务切片重合时那条切片就是下一轮优化的对象。 从 trace 到结论5 步诊断决策路径打开 trace看进程 RSS 曲线与 heapprofd 火焰图先排除或坐实内存泄漏查actual_frame_timeline_slice的 jank_type 分布判断丢帧主因在应用侧还是 SurfaceFlinger 侧放大红帧看线程状态轨道的 woken-by 链路确认阻塞主线程的线程用 sched_switch/sched_waking 采样抓阻塞方与唤醒方调用栈锁定锁持有者修复后复测对比 P99 帧耗时前后变化归档 trace 作基线。这条路径依赖内核 tracepoint需要 debug 版系统或 root 权限纯应用内逻辑问题如算法复杂度、业务分支系统层追踪提供的信息有限需要搭配 ART 堆 dump 与 in-app tracing 补充。【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfetto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

PaddleSpeech VariancePredictor 模块深度解析:FastSpeech2 音高与能量预测器的实现原理与实战配置
PaddleSpeech VariancePredictor 模块深度解析:FastSpeech2 音高与能量预测器的实现原理与实战配置

人工智能语音音频 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword… · 2026/9/24 16:06:44

考研经验互助交流分享平台
考研经验互助交流分享平台

考研经验互助交流分享平台选题背景与意义随着高等教育规模的持续扩大以及社会对高层次人才需求的不断增长,研究生教育已成为众多高校毕业生实现个人发展、提升职业竞争力的重要路径。近年来,全国硕士研究生招生考试报名人数屡创新高,2023年报… · 2026/9/24 16:06:37

变频水泵控制柜可以远程改压力吗?远程控制安全要点
变频水泵控制柜可以远程改压力吗?远程控制安全要点

变频水泵恒压供水控制柜可以远程控制,远程分两大类:简单远程(开关量)、物联网远程(手机/电脑看压力、调参数),很多成品变频供水柜预留接口,加模块就能实现。一、两种远程方案 方案1:简易远程(仅启停,不能看… · 2026/9/24 16:06:31

Prisma CLI `prisma local stop` 命令详解:停止本地开发集群
Prisma CLI `prisma local stop` 命令详解:停止本地开发集群

后端数据库GraphQL 【免费下载链接】prisma1 💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated] 项目地址: https://gitcode.com/gh_mirrors/pr/prisma1 点击查看 免费下载 prisma local stop 是 Pr… · 2026/9/24 16:35:04

SAP QM 取消UD 决策
SAP QM 取消UD 决策

SAP QM 取消UD 决策。 SAP提供了相关Notes用于取消UD决策。 C24010PA 这个批次已经做了UD 决策 C24010PA目前库存已经是非限制库存 执行操作 · 2026/9/24 16:35:04

Yii 2 与第三方代码集成实战:在 Yii 中使用外部类库,以及将 Yii 嵌入其他系统
Yii 2 与第三方代码集成实战:在 Yii 中使用外部类库,以及将 Yii 嵌入其他系统

后端Web框架 【免费下载链接】yii2 Yii 2: The Fast, Secure and Professional PHP Framework 项目地址: https://gitcode.com/gh_mirrors/yi/yii2 点击查看 免费下载 本篇技术指南围绕 Yii 2 框架的「第三方代码集成」主题展开,覆盖两大场景&#xff1… · 2026/9/24 16:35:04

隐形戴反了,会伤眼睛吗?/钟祥极博视科普
隐形戴反了,会伤眼睛吗?/钟祥极博视科普

一、先别慌,咱们钟祥街坊把这事捋清楚莫愁大道边上的奶茶店里,常有小年轻揉着眼睛抱怨:“隐形眼镜一戴上去就磨得慌,眼泪哗哗的。” 旁边人一句“是不是戴反了”,往往一语惊醒梦中人。戴反这事,十个初戴者有… · 2026/9/24 16:35:04

Chat2DB 完整上手指南:用自然语言写SQL的多数据库客户端
Chat2DB 完整上手指南:用自然语言写SQL的多数据库客户端

Chat2DB 完整上手指南:用自然语言写SQL的多数据库客户端 【免费下载链接】Chat2DB Chat2DB is a free, cross-platform, local-first database client and SQL workspace for developers, DBAs, analysts, and data teams. Connect to 40 databases, manage data, e… · 2026/9/24 16:34:58

JiuwenSymbiosis视觉感知管线深度解析:从开放词汇检测到像素到基座坐标的三维反投影
JiuwenSymbiosis视觉感知管线深度解析:从开放词汇检测到像素到基座坐标的三维反投影

JiuwenSymbiosis视觉感知管线深度解析:从开放词汇检测到像素到基座坐标的三维反投影 【免费下载链接】jiuwensymbiosis Jiuwen Symbiosis就是一个"能懂人话、看得见物理世界、长了四肢的智能助手"。用户不需要示教,不需要教它怎么抓东西&#… · 2026/9/24 16:34:58

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码