perfetto学习-ubuntu配置

13 阅读2分钟

perfetto

github.com/google/perf…

配置traced.service和traced_probes.service

sudo nano /etc/systemd/system/traced.service

[Unit]
Description=Perfetto Core Daemon (traced)
Documentation=https://perfetto.dev
After=network.target
Before=traced_probes.service

[Service]
Type=simple
ExecStart=/usr/local/bin/traced
ExecStartPre=/bin/mkdir -p /run/perfetto
ExecStartPre=/bin/chmod 755 /run/perfetto
Environment=PERFETTO_PRODUCER_SOCK_NAME=/run/perfetto/perfetto-producer
Environment=PERFETTO_CONSUMER_SOCK_NAME=/run/perfetto/perfetto-consumer
Restart=always
RestartSec=3
sudo nano /etc/systemd/system/traced_probes.service

[Unit]
Description=Perfetto Probes Daemon (traced-probes)
Documentation=https://perfetto.dev
Requires=traced.service
After=traced.service
PartOf=traced.service

[Service]
Type=simple
ExecStart=/usr/local/bin/traced_probes
#ExecStartPre=/bin/chmod 666 /run/perfetto/perfetto-producer 2>/dev/null || true
#ExecStartPre=/bin/chmod 666 /run/perfetto/perfetto-consumer 2>/dev/null || true
Environment=PERFETTO_PRODUCER_SOCK_NAME=/run/perfetto/perfetto-producer
Environment=PERFETTO_CONSUMER_SOCK_NAME=/run/perfetto/perfetto-consumer
Restart=always

更新 tmpfiles 配置

sudo nano /etc/tmpfiles.d/perfetto.conf
# 类型 路径                权限 用户 组   年龄 参数
d /run/perfetto 0755 root root - -
# 设置 producer socket 权限为 666
z /run/perfetto/perfetto-producer 0666 root root -
# 设置 consumer socket 权限为 666(可选)
z /run/perfetto/perfetto-consumer 0666 root root -

# 应用配置
sudo systemd-tmpfiles --create /etc/tmpfiles.d/perfetto.conf

继续配置traced服务

sudo systemctl daemon-reload
sudo systemctl stop traced traced_probes
sudo systemctl enable traced traced_probes
# 启动 traced
sudo systemctl start traced
# 检查 socket 是否创建
ls -la /run/perfetto/
# 确保 consumer socket 权限正确
sudo chmod 666 /run/perfetto/perfetto-consumer
# 启动 traced_probes
sudo systemctl start traced_probes
# 检查状态
sudo systemctl status traced_probes --no-pager

记录systrace

perfetto --txt -c ./config.pbtxt -o ./traces/learn_trace.perfetto-trace

// config.pbtxt
buffers: {
    size_kb: 32768
    fill_policy: RING_BUFFER
}
buffers: {
    size_kb: 8192
    fill_policy: RING_BUFFER
}

duration_ms: 300000

# ---- ftrace: 内核级事件 ----
data_sources: {
    config {
        name: "linux.ftrace"
        target_buffer: 0
        ftrace_config {
            ftrace_events: "sched/sched_switch"
            ftrace_events: "sched/sched_wakeup"
            ftrace_events: "sched/sched_wakeup_new"
            ftrace_events: "sched/sched_process_exit"
            ftrace_events: "sched/sched_process_free"
            ftrace_events: "sched/sched_process_exec" 
            ftrace_events: "power/cpu_frequency"
            ftrace_events: "power/cpu_idle"
            ftrace_events: "power/suspend_resume"
            ftrace_events: "task/task_newtask"
            ftrace_events: "task/task_rename"
            ftrace_events: "irq/irq_handler_entry"
            ftrace_events: "irq/irq_handler_exit"
            ftrace_events: "irq/softirq_entry"
            ftrace_events: "irq/softirq_exit"
            ftrace_events: "workqueue/workqueue_execute_start"
            ftrace_events: "workqueue/workqueue_execute_end"
            ftrace_events: "block/block_rq_issue"
            ftrace_events: "block/block_rq_complete"
            ftrace_events: "writeback/writeback_pages_written"
            ftrace_events: "writeback/wbc_writepage"
            drain_period_ms: 250
        }
    }
}

# ---- track_event: 应用自定义插桩事件 ----
data_sources: {
    config {
        name: "track_event"
        target_buffer: 1
    }
}

# ---- 进程信息: 让 trace 里显示进程/线程名 ----
data_sources: {
    config {
        name: "linux.process_stats"
        target_buffer: 0
        process_stats_config {
            scan_all_processes_on_start: true
            proc_stats_poll_ms: 10
        }
    }
}

自定义trace验证1

编译perfetto的sdk,用于sqlite,效果如下

image.png

自定义trace验证2

skia本身集成perfetto的sdk,编译skia,验证viewer,效果如下

out/Debug/viewer -b vk --trace perfetto --match blurrects --perfettoOutputDir ~/skia/systrace/

image.png