前言:虽然有翻译软件,虽然有chatgpt,毕竟语言隔阂,对这个工具还是一知半解,因此想通过翻译的方式和大家来一起学习下Perfetto这个强大的工具
#####################以下分割线#####################
英文原文在这里
Perfetto SQL-常用查询
此页面是执行特定分析时常见查询的参考指南。
计算切片的 CPU 时间
如果收集包含调度信息(即来自 ftrace)和用户空间切片(即来自 atrace)的跟踪,则可以计算出每个用户空间切片在 CPU 上运行所花费的实际时间:这通常称为切片的“CPU 时间”。
首先,设置视图以简化后续查询:
DROP VIEW IF EXISTS slice_with_utid;
CREATE VIEW slice_with_utid AS
SELECT
ts,
dur,
slice.name as slice_name,
slice.id as slice_id, utid,
thread.name as thread_name
FROM slice
JOIN thread_track ON thread_track.id = slice.track_id
JOIN thread USING (utid);
DROP TABLE IF EXISTS slice_thread_state_breakdown;
CREATE VIRTUAL TABLE slice_thread_state_breakdown
USING SPAN_LEFT_JOIN(
slice_with_utid PARTITIONED utid,
thread_state PARTITIONED utid
);
然后,要计算跟踪中所有切片的 CPU 时间,请执行以下操作:
SELECT slice_id, slice_name, SUM(dur) AS cpu_time
FROM slice_thread_state_breakdown
WHERE state = 'Running'
GROUP BY slice_id;
您还可以计算特定切片的 CPU 时间:
SELECT slice_name, SUM(dur) AS cpu_time
FROM slice_thread_state_breakdown
WHERE slice_id = <your slice id> AND state = 'Running';
这些查询可以简单修改以计算其他类似的指标。例如,要获取“runnable”和“uninterruptible sleep”所花费的时间:
SELECT
slice_id,
slice_name,
SUM(CASE state = 'R' THEN dur ELSE 0 END) AS runnable_time,
SUM(CASE state = 'D' THEN dur ELSE 0 END) AS uninterruptible_time
FROM slice_thread_state_breakdown
GROUP BY slice_id;
通过唤醒线程计算调度时间
给定的线程可能会导致其他线程唤醒,即有任务给到了其他线程。对于给定的线程,通过它唤醒的线程运行的时间可以很好的了解到,此线程正在生成多少任务。
若要计算此值,可以使用以下查询:
SELECT
SUM((
SELECT dur FROM sched
WHERE
sched.ts > wakee_runnable.ts AND
wakee_runnable.utid = wakee_runnable.utid
ORDER BY ts
LIMIT 1
)) AS scheduled_dur
FROM thread AS waker
JOIN thread_state AS wakee_runnable ON waker.utid = wakee_runnable.waker_utid
WHERE waker.name = <your waker thread name here>
要同时对跟踪中的所有线程执行此操作,请执行以下操作:
SELECT
waker_process.name AS process_name,
waker.name AS thread_name,
SUM((
SELECT dur FROM sched
WHERE
sched.ts > wakee_runnable.ts AND
sched.utid = wakee_runnable.utid
ORDER BY ts
LIMIT 1
)) AS scheduled_dur
FROM thread AS waker
JOIN process AS waker_process USING (upid)
JOIN thread_state AS wakee_runnable ON waker.utid = wakee_runnable.waker_utid
WHERE waker.utid != 0
GROUP BY 1, 2
ORDER BY 3 desc
#####################以上分割线#####################
后记:
1 本次主要使用百度翻译,虽然被骂,但至少翻译这个工具降低了门槛。
2 英文文档中的长难句真的是又长又难,基于百度的翻译,然后自己再调整下,水平实在有限。
3 技术背景知识不够,有些专有名词不知道怎么翻译,也不知道百度翻译的是否准确,功夫在诗外。
4 万事开头难,中间难不难,还不知道。中间的事后面再说,正确一天翻译一篇。
5 虽然可能会有人不屑,但总要有人去做不起眼的小事。
6 google 厉害,这个perfetto 工具也很厉害。君子善假于物也。
7 工具的使用是最简单的入门,背后还有更多的东西值得学习。
8 水平实在有限,闻过则喜,希望有更多的人反馈,期待更好的建议
网友评论