ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android Studio Profiler(CPU : System Trace)

2022-06-02 01:33:01  阅读:314  来源: 互联网

标签:... NAMED Trace CPU System Profiler 线程 选中 EVENT


Android Studio 中 System Trace(系统跟踪)功能(注:为命令行工具systrace的GUI版本),是用于记录一段时间内的设备活动,用于提升App的性能。

不同于函数跟踪(如 Java Method 或 C/C++ Function Trace),System Trace 跟踪的是系统级的内容,如CPU各核心调度,SurfaceFlinger、VSync(垂直同步)、BufferQueue。

通过收集系统事件和App逻辑中插入的自定义事件的组合数据,在排查性能问题时 (例如UI卡顿或功耗过高)就会显得十分有用。

 

实时显示App及各线程上的CPU占用

 

自定义Trace System Calls设置

点击下拉菜单中的“Edit Configurations...”,查看Trace System Calls的设置

 

创建自定义的Trace System Calls

 

使用自定义的Trace System Calls来Record

 

录制一段System Trace Recording

 

点击保存按钮,可将当前记录数据保存到名为:cpu-perfetto-20220530T102357.trace的文件中

 

右上角工具栏说明:

:扩大CPU Usage轴上的选中范围

:缩小CPU Usage轴上的选中范围

:选择整个CPU Usage轴

当选中某个线程或event时,会出现“Clear thread/event selection”的点击按钮

 

Display和CPU cores

SurfaceFlinger:每个灰块表示OnMessageReceived的执行时长

VSYNC(垂直同步):0,1之间的切换

BufferQueue:0,1之间的切换

 

小米10共有8个CPU核心,Frequency(频率)分别如下:

CPU核心 Frequency(频率)
CPU0 1.8 GHz
CPU1
CPU2
CPU3
CPU4 2.4 GHz
CPU5
CPU6
CPU7 2.8 GHz

 

CPU核的轴线上各个色块表示不同进程的线程的执行时长和序列。除了当前Profile进程的线程外,还有其他进程的线程,如下:

其他进程 线程
/system/bin/traced_probes traced_probes
/system/bin/surfaceflinger surfaceflinger
/system/bin/surfaceflinger app
/vendor/bin/hw/vendor.qti.hardware.display.composer-server HwBinder:854_2
/system/bin/audioserver FastMixer

自定义事件

在App中使用Trace API来插入自定义事件进行埋点来形成的CallStack来详细跟进线程逻辑的执行过程。

 

UE自定义事件宏

/** UnrealEngine\Engine\Source\Runtime\Core\Public\HAL\PlatformMisc.h **/
#define SCOPED_NAMED_EVENT(Name, Color)\
    FScopedNamedEventStatic ANONYMOUS_VARIABLE(NamedEvent_##Name##_)(Color, NAMED_EVENT_STR(#Name));\
    TRACE_CPUPROFILER_EVENT_SCOPE(Name);

#define SCOPED_NAMED_EVENT_FSTRING(Text, Color)\
    FScopedNamedEvent ANONYMOUS_VARIABLE(NamedEvent_)(Color, *Text);\
    TRACE_CPUPROFILER_EVENT_SCOPE_TEXT(*Text);

#define SCOPED_NAMED_EVENT_TCHAR(Text, Color)\
    FScopedNamedEvent ANONYMOUS_VARIABLE(NamedEvent_)(Color, Text);\
    TRACE_CPUPROFILER_EVENT_SCOPE_TEXT(Text);

#define SCOPED_NAMED_EVENT_TEXT(Text, Color)\
    FScopedNamedEventStatic ANONYMOUS_VARIABLE(NamedEvent_)(Color, NAMED_EVENT_STR(Text));\
    TRACE_CPUPROFILER_EVENT_SCOPE_STR(Text);

#define SCOPED_NAMED_EVENT_F(Format, Color, ...)\
    FScopedNamedEvent ANONYMOUS_VARIABLE(NamedEvent_)(Color, *FString::Printf(Format, __VA_ARGS__));\
    TRACE_CPUPROFILER_EVENT_SCOPE_TEXT(*FString::Printf(Format, __VA_ARGS__));

 

UE中插入的自定义事件

/** UnrealEngine\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp **/
void FEngineLoop::Tick() 
{
    // ... ...
    #if ENABLE_NAMED_EVENTS
    TCHAR IndexedFrameString[32] = { 0 };
    const TCHAR* FrameString = nullptr;
    if (UE_TRACE_CHANNELEXPR_IS_ENABLED(CpuChannel))
    {
        FrameString = TEXT("FEngineLoop");
    }
    else
    {
#if PLATFORM_LIMIT_PROFILER_UNIQUE_NAMED_EVENTS
        FrameString = TEXT("FEngineLoop");
#else
        FCString::Snprintf(IndexedFrameString, 32, TEXT("Frame %d"), CurrentFrameCounter);
        FrameString = IndexedFrameString;
#endif
    }
    SCOPED_NAMED_EVENT_TCHAR(FrameString, FColor::Red);
#endif
    // ... ...
}

/** UnrealEngine\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp **/
static inline void BeginFrameRenderThread(FRHICommandListImmediate& RHICmdList, uint64 CurrentFrameCounter)
{
    // ... ...
    FString FrameString = FString::Printf(TEXT("Frame %d"), CurrentFrameCounter);
#if ENABLE_NAMED_EVENTS
#if PLATFORM_LIMIT_PROFILER_UNIQUE_NAMED_EVENTS
    FPlatformMisc::BeginNamedEvent(FColor::Yellow, TEXT("Frame"));
#else
    FPlatformMisc::BeginNamedEvent(FColor::Yellow, *FrameString);
#endif
#endif // ENABLE_NAMED_EVENTS
    // ... ...
}

/** UnrealEngine\Engine\Source\Runtime\Core\Private\GenericPlatform\GenericPlatformProcess.cpp **/
bool FPThreadEvent::Wait(uint32 WaitTime, const bool bIgnoreThreadIdleStats /*= false*/)
{
    // ... ...
    SCOPED_NAMED_EVENT(EventWait, FColor::Red);
    // ... ...
}

/** UnrealEngine\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp **/
class FTaskGraphImplementation : public FTaskGraphInterface
{
    virtual void WaitUntilTasksComplete(const FGraphEventArray& Tasks, ENamedThreads::Type CurrentThreadIfKnown = ENamedThreads::AnyThread) final override
    {
        // ... ...
        SCOPED_NAMED_EVENT(WaitUntilTasksComplete, FColor::Red);
        // ... ...
    }
};
    
/** UnrealEngine\Engine\Source\Runtime\Engine\Private\LevelTick.cpp **/
void UWorld::Tick( ELevelTick TickType, float DeltaSeconds )
{
    // ... ...
    SCOPED_NAMED_EVENT(UWorld_Tick, FColor::Orange);
    // ... ...
}
    
/** UnrealEngine\Engine\Source\Runtime\Slate\Private\Framework\Application\SlateApplication.cpp **/
void FSlateApplication::DrawWindows()
{
    SCOPED_NAMED_EVENT_TEXT("Slate::DrawWindows", FColor::Magenta);
    PrivateDrawWindows();
}

/** UnrealEngine\Engine\Source\Runtime\RHI\Private\RHICommandList.cpp **/
class FExecuteRHIThreadTask
{
    void DoTask(ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent)
    {
        // ... ...
        SCOPED_NAMED_EVENT(RHIThreadExecute, FColor::Red);
        // ... ...
    }
};

 

线程上的CPU状态和自定义事件CallStack

 

注1:最上面的轴线上,灰色块为线程的Sleep状态,黄色块为线程的Waiting状态,绿色块为线程的Running状态

注2:下方则为线程内部自定义事件CallStack

 

RenderThread

 

RHIThread

 

选中线程

选中线程的选中区域的Summary

 

选中线程的选中区域的Top Down

 

选中线程的选中区域的Flame Chart

注:Flame Chart即火焰图,会对同名的栈帧进行合并显示

 

选中线程的选中区域的Bottom Up

 

选中线程的Events

 

All threads

所有线程的选中区域的Summary

 

所有线程的选中区域的Top Down

 

所有线程的选中区域的Flame Chart

注:Flame Chart即火焰图,会对同名的栈帧进行合并显示

 

所有线程的选中区域的Bottom Up

 

参考

Android Studio 中 System Trace 的新增功能

Android SystemTrace实战

 

标签:...,NAMED,Trace,CPU,System,Profiler,线程,选中,EVENT
来源: https://www.cnblogs.com/kekec/p/16318648.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有