Trace 文件太大打不开怎么办?使用 trace_processor

在线文档地址:Trace 文件太大打不开怎么办?使用 trace_processor

https://wayawbott0.f.mioffice.cn/docx/doxk4h0INjiMfIk6INxmqbCi63b

一、提出问题

你是否遇到过一个 trace 文件有好几百 MB,甚至有 1 G 多 ?

无论用下面哪一个网址都****打不开这个巨大的 trace 文件。

https://ui.perfetto.dev/

https://perfetto.pt.xiaomi.com/

https://10.221.136.106/

二、解决问题

1、复现问题

在浏览器打开上面任意网址,就以 https://ui.perfetto.dev/ 网址来实验

打开网址后,把那个巨大的 trace 文件拖拽到打开的页面中。

等待加载完成后,会看到一个 oops 弹窗:

Oops! Your WASM trace processor ran out of memory

The in-memory representation of the trace is too big for the browser memory limits (typically 2GB per tab).

You can work around this problem by using the trace_processor native binary as an accelerator for the UI as follows:

curl -LO https://get.perfetto.dev/trace_processor

chmod +x ./trace_processor

trace_processor —httpd /path/to/trace.pftrace

Reload the UI, it will prompt to use the HTTP+RPC interface

For details see https://perfetto.dev/docs/quickstart/trace-analysis#get-trace-processor

2、准备 trace_processor 环境

1)、按照上面弹窗提示,先下载 trace_processor 文件

如何下载?

上面弹窗已经给出了命令。使用命令:

sudo curl -LO https://get.perfetto.dev/trace_processor

注意:

1、执行命令后,trace_processor 文件会下载到当前目录中。

2、如果刚才打开的网址是 https://10.221.136.106/,然后把 big big trace 文件拖拽进去的,那上面弹窗中提示的下载命令就是 curl -LO http://10.221.136.106:9000/trace_processor。那对应的下载命令就是:

JSON

复制

sudo curl -LO http**://10.221.136.106:9000/trace_processor**

Q1、我这已经有了 trace_processor 文件,还需要重新下载吗?

A:需要。最好每次都下载最新的 trace_processor 文件。避免使用旧的 trace_processor 文件打开 trace 时失败,查不到原因。

Q2、执行上面下载的这行命令后,提示失败报错,说没有 curl

A:那就安装 curl。提示缺少什么,就安装什么。使用命令:

JSON

复制

sudo apt install curl

2)、给 trace_processor 文件赋予可执行权限

如何赋予权限?

上面弹窗已经给出了命令。使用命令:

JSON

复制

sudo chmod +x ./trace_processor

或者偷懒,全部开放权限。使用命令:

JSON

复制

sudo chmod 777 ./trace_processor

3、执行 trace_processor 文件

执行 trace_processor 文件,打开远程服务,加载本地那个巨大的 trace 文件。

如何执行?

上面弹窗已经给出了命令。使用命令:

JSON

复制

./trace_processor —httpd /path/to/trace.pftrace

上面命令中 /path/to/trace.pftrace 是本地那个巨大的 trace 文件的 完整路径

1)、如何加载本地 trace 文件

上面命令其实是加载本地 trace 文件到远程服务端,命令行能看到加载进度:

Loading trace: xxx MB

2)、如何知道加载完成

当你看到 Terminal 中有这些信息时(最后两行 HTTP 信息),就表示 trace 文件加载完成了

3)、打开执行的 trace 页面

接下来要怎么办呢?

看上面 Terminal 中的提示内容:

[HTTP] Starting RPC server on localhost:9001

[HTTP] This server can be used by reloading https://ui.perfetto.dev and clicking on YES on the “Trace Processor native acceleration” dialog or through the Python API (see https://perfetto.dev/docs/analysis/trace-processor#python-api).

上面弹窗中提示:可以使用 https://ui.perfetto.dev 地址访问服务…

那就在浏览器中再次打开 https://ui.perfetto.dev 网址。

看浏览器弹窗提示:

选择第一个按钮:【Open **https://xxxxxx**】

又来个弹窗:

还是选择第一个按钮:【YES,use loaded trace

完成了,trace 文件已经打开

三、注意事项

问题1:当你正在分析已经打开的 trace 时,你有没有发现 Terminal 中的提示?

看截图:个人推测,Terminal 作为 Client 端,正在执行 trace_processor 文件提供的 websocket 远程服务。

所以,浏览器才能获取服务端加载的 trace 文件。

问题2:此时,如果你在 Terminal 中按下 Ctrl + C 会有什么效果呢?

客户端断开连接,Terminal 退出执行。

问题3:网页端还能继续查看 trace 吗?

网页 Websocket 长链接断开。Websocket closed。

所以,当你还需要使用网页端加载的 trace 时,知道要保持 Terminal 长链接了吧

四、Use shell tool

http://minio.898311.xyz:8900/blogfile/17472961510018.zip

#!/bin/bash
 
 
# 
# Usage:
# Terminal>:chmod +x ./run_trace_processor.sh
# Terminal>:./run_trace_processor.sh /your/trace/full/path/filename.suffix
# 
# when terminal print "[HTTP] Starting RPC server on ..."
# you can open address of "https://ui.perfetto.dev" on browser
# 
# 
# 当前脚本文件存在的意义:
# 如果一个 trace 文件有 1G+,在浏览器网页 https://ui.perfetto.dev 中无法加载出来。
# 那此时,就可以使用这个脚本程序来处理了。
# 
# 
# Function:
# 1、获取命令行传入的 trace 文件路径。
# 2、如果当前目录下存在旧的 ./trace_processor 文件,则先删除。
# 3、如果没有安装 curl 库,则先安装。
# 4、下载最新的 ./trace_processor 文件。
# 5、给 ./trace_processor 文件赋予 可执行 权限。
# 6、启动 ./trace_processor 服务。
# 7、在浏览器打开网址 https://ui.perfetto.dev。
# 
# 
# 
 
 
# 判断某个 lib 是否已经安装
isLibInstall() {
    whichPath=$(which $1)
    return $(expr length "$whichPath")
}
 
# 检查 & 删除某个文件
deleteFileIfExists() {
    filePath=$1
    # 如果 TRACE_PROCESSOR 文件存在
    isDeleteSuccess=0
    if test -e $filePath
    then
        echo "Tip:尝试删除当前目录下旧的 $filePath 文件"
        # 执行这一行代码,注意安全!!!
        rm -rf $filePath
 
        # 如果 TRACE_PROCESSOR 文件存在
        if test -e $filePath
        then
            echo "Tip:$filePath 文件删除失败,请自己手动删除!"
        else
            echo "Tip:$filePath 文件删除成功!"
            isDeleteSuccess=1
        fi
    else
        echo "Tip:$filePath 旧文件不存在,无需删除!"
    fi
    unset filePath
    return $isDeleteSuccess
}
 
# 获取文件内容大小
getFileSize() {
    fileSizeInt=0
    filePath=$1
    # 检查文件是否存在
    if [ -e "$filePath" ]; then
        # 获取文件大小
        fileSizeInt=$(stat -c%s "$filePath")
    fi
    echo "Tip:$filePath 文件大小:${fileSizeInt} bytes"
    unset filePath
    return $fileSizeInt 
}
 
 
 
 
 
# 程序从此处开始执行
# ---------------------------------------------------------
# 接收命令行传入的 trace 文件路径
readonly TRACE_PATH=$1
# 当前目录下的 trace_processor 文件
readonly TRACE_PROCESSOR_PATH="./trace_processor"
 
# 判断:trace 文件名是否为空
if [ ! $TRACE_PATH ]
then
    echo "Tip:未获取到 Trace 文件名称!"
    echo "Tip:你是否在执行 ./run_trace_processor.sh 时传递了参数?"
    echo "Tip:Usage:./run_trace_processor.sh /your/trace/full/path/filename.suffix"
    exit 0
fi
 
 
if [ ! -e $TRACE_PATH ]
then
    echo "Tip:Trace 文件 ${TRACE_PATH} 不存在!"
    exit 0
fi
 
echo "Tip:获取到 Trace 文件路径: ${TRACE_PATH}"
echo "Tip:${TRACE_PATH} 是不是 Trace 文件,我不清楚,请你自己保证!"
 
#chmod +x ./trace_processor
 
# 如果 $TRACE_PROCESSOR_PATH 文件存在,则删除
deleteFileIfExists $TRACE_PROCESSOR_PATH
# echo "Tip:delete code: $?"
 
isLibInstall curl
if [ $? -gt 0 ]
then
    echo "Tip:curl 库已经安装"
else
    echo "Tip:curl 库没有安装"
    echo "Tip:尝试安装 curl,需要 sudo 管理员权限。"
    sudo apt install curl
fi
 
 
echo "Tip:尝试下载最新的 trace_processor 文件"
echo "Tip:执行下载命令:curl -LO https://get.perfetto.dev/trace_processor"
curl -LO https://get.perfetto.dev/trace_processor
 
# 简单暂停几秒,等待文件下载完成
echo "Tip:等待 1 秒,等待 $TRACE_PROCESSOR_PATH 文件下载完成"
sleep 1s
 
 
# 如果 $TRACE_PROCESSOR_PATH 文件存在,检查文件是否存在
getFileSize $TRACE_PROCESSOR_PATH
# getFileSize 方法是通过 return 返回的,数值会被截断[0, 255]
fileSizeInt=$?
# 判断文件大小是否不为0
if [ $fileSizeInt -le 0 ]; then
    echo "Tip:$TRACE_PROCESSOR_PATH 文件为空。请重新执行,或者手动下载该文件!"
    exit 0
fi
unset fileSizeInt
 
 
echo "Tip:给 ./trace_processor 文件赋予可执行权限。"
chmod +x ./trace_processor
 
isLibInstall xclip
if [ $? -gt 0 ]
then
    echo "Tip:https://ui.perfetto.dev" | xclip -selection clipboard
    echo "Tip:已经复制 https://ui.perfetto.dev 到剪切板"
else
    echo "Tip:xclip 没有安装,没有复制 https://ui.perfetto.dev 到剪切板"
fi
    
    
echo "Tip:开始连接 httpd 服务 ..."
echo "Tip:当你看到命令行出现类似:...[HTTP] Starting RPC server on localhost... 内容时"
echo "Tip:你可以在浏览器打开网址:https://ui.perfetto.dev,开始加载 & 分析 Trace 文件了"
echo "Tip:更多使用说明,见 https://wayawbott0.f.mioffice.cn/docx/doxk4h0INjiMfIk6INxmqbCi63b"
./trace_processor --httpd $TRACE_PATH
echo "Tip:程序结束!"

嫌弃上文描述的步骤好复杂?那就直接用下面脚本文件一步搞定

run_trace_processor.sh 脚本程序用法:

Run shell

Terminal>:chmod +x ./run_trace_processor.sh

Terminal>:./run_trace_processor.sh /your/trace/full/path/filename.suffix

Open url

Take care msg in terminal

when terminal print “[HTTP] Starting RPC server on …”

you can open address of “https://ui.perfetto.dev” on browser