色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙開發實戰:【性能調優組件】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-03-13 15:12 ? 次閱讀

簡介

性能調優組件包含系統和應用調優框架,旨在為開發者提供一套性能調優平臺,可以用來分析內存、性能等問題。

該組件整體分為PC端和設備端兩部分,PC端最終作為deveco studio的插件進行發布,內部主要包括分為UI繪制、設備管理、進程管理、插件管理、數據導入、數據存儲、 數據分析、Session管理、配置管理等模塊;設備端主要包括命令行工具、服務進程、插件集合、應用程序組件等模塊。設備端提供了插件擴展能力,對外提供了插件接口,基于該擴展能力可以按需定義自己的能力,并集成到框架中來,目前基于插件能力已經完成了實時內存插件,trace插件。下文會重點對設備端提供的插件能力進行介紹。

架構圖

說明

下面針對設備端對外提供的插件擴展能力進行接口和使用說明。

接口說明

下面是設備端插件模塊對外提供的接口:

  • PluginModuleCallbacks為插件模塊對外提供的回調接口,插件管理模塊通過該回調接口列表與每一個插件模塊進行交互,每一個新增插件都需要實現該接口列表中的函數。

表 1 PluginModuleCallbacks接口列表

[]()

[]()[]()接口名[]()[]()類型[]()[]()描述
[]()[]()PluginModuleCallbacks::onPluginSessionStart[]()[]()int (PluginSessionStartCallback)(const uint8_tconfigData, uint32_t configSize);[]()[]()- 功能:
[]()[]()插件會話開始接口,開始插件會話時會被調用,用來下發插件配置
  • 輸入參數
    []()[]()configData:配置信息內存塊起始地址
    []()[]()configSize:配置信息內存塊字節數
  • 返回值:
    []()[]()0:成功
    []()[]()-1:失敗 |
    | []()[]()PluginModuleCallbacks::onPluginReportResult | []()[]()int (PluginReportResultCallback)(uint8_t bufferData, uint32_t bufferSize); | []()[]()- 功能:
    []()[]()插件結果上報接口類型,當任務下發后,框架采集任務會周期性調用此接口請求回填數據
  • 輸入參數:
    []()[]()bufferData: 存放結果的內存緩沖區起始地址
    []()[]()bufferSize: 存放結果的內存緩沖區的字節數
  • 返回值:
    []()[]()大于0:已經填充的內存字節數
    []()[]()等于0:沒有填充任何內容
    []()[]()小于0:失敗 |
    | []()[]()PluginModuleCallbacks::onPluginSessionStop | []()[]()int (*PluginSessionStopCallback)(); | []()[]()- 功能:
    []()[]()采集會話結束接口
  • 返回值:
    []()[]()0:成功
    []()[]()-1:失敗 |
    | []()[]()PluginModuleCallbacks::onRegisterWriterStruct | []()[]()int (RegisterWriterStructCallback)(WriterStruct writer); | []()[]()- 功能:
    []()[]()采集框架注冊寫數據接口,當插件管理模塊向插件注冊此接口,插件可以主動調用write句柄,進行寫入數據
  • 輸入參數:
    []()[]()writer 寫者指針
  • 返回值:
    []()[]()0:成功
    []()[]()-1:失敗 |
  • WriterStruct是上面onRegisterWriterStruct接口中的參數,主要實現寫數據接口,將插件中采集的數據通過該接口進行寫入。

表 2 WriterStruct接口列表

[]()

[]()[]()接口名[]()[]()類型[]()[]()描述
[]()[]()WriterStruct::write[]()[]()long (WriteFuncPtr)(WriterStructwriter, const void* data, size_t size);[]()[]()- 功能:
[]()[]()寫接口,將插件中采集的數據通過writer進行寫入
  • 輸入參數:
    []()[]()writer:寫者指針
    []()[]()data:數據緩沖區首字節指針
    []()[]()size: 數據緩沖區的字節數
  • 返回值:
    []()[]()0:成功
    []()[]()-1:失敗 |
    | []()[]()WriterStruct::flush | []()[]()bool (FlushFuncPtr)(WriterStruct writer); | []()[]()- 功能:
    []()[]()觸發數據上傳接口
  • 輸入參數:
    []()[]()writer:寫者指針
  • 返回值:
    []()[]()true:成功
    []()[]()false:失敗 |
  • 下面是插件模塊對外提供的總入口,主要包括表1中的插件模塊回調函數以及插件名稱、插件模塊需要申請的內存大小。

表 3 PluginModuleStruct接口列表

[]()

[]()[]()接口名[]()[]()類型[]()[]()描述
[]()[]()PluginModuleStruct::callbacks[]()[]()PluginModuleCallbacks*[]()[]()功能:定義插件回調函數列表
[]()[]()PluginModuleStruct::name[]()[]()C style string[]()[]()功能:定義插件名稱
[]()[]()PluginModuleStruct::resultBufferSizeHint[]()[]()uint32_t[]()[]()功能:用于提示插件管理模塊調用數據上報接口時使用的內存緩沖區字節數

使用說明

下面介紹在設備端基于性能調優框架提供的插件能力,新增一個插件涉及到的關鍵開發步驟:

  1. 編寫proto數據定義文件_plugin_data.proto_,定義數據源格式,數據源格式決定了插件上報哪些數據:
    message PluginData {
        int32 pid = 1;
        string name = 2;
        uint64 count1 = 3;
        uint64 count2 = 4;
        uint64 count3 = 5;
        ......
    }
    
  2. 編寫數據源配置文件_plugin_config.proto_,采集的行為可以根據配置進行變化,可以設置數據源上報間隔等信息:
    message PluginConfig {
        int32 pid = 1;
        bool report_interval = 2;
        int report_counter_id_1 = 3;
        int report_counter_id_2 = 4;
        ......
    }
    
  3. 定義PluginModuleCallbacks實現插件回調接口;定義PluginModuleStruct類型的g_pluginModule全局變量,注冊插件信息。
    static PluginModuleCallbacks callbacks = {
        PluginSessionStart,
        PluginReportResult,
        PluginSessionStop,
    };
    PluginModuleStruct g_pluginModule = {&callbacks, "test-plugin", MAX_BUFFER_SIZE};
    
  4. 通過PluginSessionStart(名字可以自己定義)實現插件回調接口列表的onPluginSessionStart接口,主要處理插件的開始流程。
    int PluginSessionStart(const uint8_t* configData, uint32_t configSize)
    {
        ......
        return 0;
    }
    
  5. 通過PluginReportResult(名字可以自己定義)實現插件回調接口列表的onPluginReportResult接口,將插件內部采集的信息通過該接口進行上報:
    int PluginReportResult(uint8_t* bufferData, uint32_t bufferSize)
    {
        ......
        return 0;
    }
    
  6. 通過PluginSessionStop(名字可以自己定義)實現插件回調接口列表的onPluginSessionStop接口,主要進行插件停止后的操作流程。
    int PluginSessionStop()
    {
        ......
        return 0;
    }
    
  7. 編寫proto gn構建腳本, 生成protobuf源文件,protobuf源文件編譯生成目標文件:
    action("plugin_cpp_gen") {
      script = "${OHOS_PROFILER_DIR}/build/protoc.sh"  //依賴的編譯工具鏈
      sources = [   //定義的插件相關的proto文件,比如插件配置文件、插件數據對應的proto文件
        "plugin_data.proto",
        "plugin_config.proto",
      ]
      outputs = [    //通過protoc編譯生成的結果文件
        "plugin_data.pb.h",
        "plugin_data.pb.cc",
        "plugin_config.pb.h",
        "plugin_config.pb.cc",
      ]
      args = [
        "--cpp_out",
        "$proto_rel_out_dir",
        "--proto_path",
        rebase_path(".", root_build_dir),
      ]
      deps = [
        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protoc(${host_toolchain})",
      ]
    }
    ohos_source_set("plug_cpp") {   //將定義的proto文件生成cpp文件
      deps = [
        ":plugin_cpp_gen",
      ]
      public_deps = [
        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf",
        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite",
      ]
      include_dirs = [ "$proto_out_dir" ]
      sources = [   //目標plug_cpp中包括的源文件
        "plugin_data.pb.h",
        "plugin_data.pb.cc",
        "plugin_config.pb.h",
        "plugin_config.pb.cc",
      ]
    }
    
  8. 編寫插件GN構建腳本:
    ohos_shared_library("***plugin") {
      output_name = "***plugin"
      sources = [
        "src/***plugin.cpp",  //插件中的源文件
      ]
      include_dirs = [
        "../api/include",
        "${OHOS_PROFILER_DIR}/device/base/include",
      ]
      deps = [
        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protobuf_lite",
        "${OHOS_PROFILER_3RDPARTY_PROTOBUF_DIR}:protoc_lib",
        "${OHOS_PROFILER_DIR}/protos/types/plugins/**:plug_cpp",  //上面ohos_source_set中生成的plug_cpp
      ]
      install_enable = true
      subsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}"
    }
    

調測驗證:

插件動態庫生成后,可以自己編寫測試代碼,通過dlopen加載動態庫,并調用上面代碼中實現的插件模塊回調函數進行驗證。

int main(int argc, char** argv)
{
    void* handle;
    PluginModuleStruct* memplugin;
    handle = dlopen("./libplugin.z.so", RTLD_LAZY);   //動態打開上面生成的插件動態庫
    if (handle == nullptr) {
        HILOGD("dlopen err:%s.", dlerror());
        return 0;
    }
     memplugin = (PluginModuleStruct*)dlsym(handle, "g_pluginModule");  //獲取開發步驟3中定義的g_pluginModule全局變量
     //check memplugin- >callbacks   // 通過該指針調用上面開發步驟3中定義的回調函數
     return 0;

hiprofiler_cmd 使用說明

參數說明

執行hiprofiler_cmd 為調優業務的離線命令行抓取工具,具體使用方法及命令行參數介紹如下。

可以使用-h或者--help參數查看命令的使用描述信息:

hiprofiler_cmd -h
help :
  --getport        -q     : get grpc address
  --time           -t     : trace time
  --out            -o     : output file name
  --help           -h     : make some help
  --list           -l     : plugin list
  --start          -s     : start dependent process
  --kill           -k     : kill dependent process
  --config         -c     : start trace by config file

其余參數使用說明如下:

  • -q或者--getport選項,用于查詢服務的端口信息;
  • -t或者--time選項,用于指定抓取時間,單位是秒;
  • -o或者--out選項,用于指定輸出的離線數據文件名;
  • -h或者--help選項,用于輸出幫助信息;
  • -l或者--list選項,用于查詢插件列表;
  • -s或者--start選項,用于啟動依賴的進程;
  • -k或者--kill選項,用于關閉依賴的進程;
  • -c或者--config選項,用于指定配置文件;

命令展示

基礎配置參數

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 50 
  -s 
  -k 
<

命令參數說明:

  • request_id:本次請求的id
  • pages:存儲trace數據的buffer大小(4 * pages kb)
  • result_file:結果輸出的文件路徑,與-o參數對應
  • sample_duration:抓取時長(ms),與-t參數對應

ftrace抓取場景示例

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 50 
  -s 
  -k 
<

命令參數說明:

  • sample_interval:輪循模式下,插件上報數據的間隔時間(ms)
  • trace_period_ms:ftrace插件讀取內核緩沖區數據的間隔時間(ms)
  • hitrace_time:hitrace命令行抓取時間,與hiprofiler_cmd下發的-t配置聯動

內存信息抓取場景示例

內核內存信息

使用如下命令:

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 50 
  -s 
  -k 
<
虛擬內存統計

使用如下命令:

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 50 
  -s 
  -k 
<
進程內存使用跟蹤

如配置抓取的進程名是com.ohos.mms

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 50 
  -s 
  -k 
<

配置參數說明:

  • pid/process_name:設置抓取的進程ID或者進程名
  • max_stack_depth:抓取的棧的深度
  • smb_pages:native_daemon和native_hook進程之間存儲數據的共享內存大小(4KB的倍數)
  • filter_size:只抓取大于該size的malloc數據(free不受影響)

bytrace/hitrace場景示例

運行如下命令:

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 30 
  -s 
<

hiperf場景示例

運行如下命令:

hiprofiler_cmd 
  -c - 
  -o /data/local/tmp/hiprofiler_data.htrace 
  -t 50 
  -s 
  -k 
<

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲
    +關注

    關注

    13

    文章

    4347

    瀏覽量

    86059
  • 內存
    +關注

    關注

    8

    文章

    3048

    瀏覽量

    74209
  • 鴻蒙
    +關注

    關注

    57

    文章

    2390

    瀏覽量

    42968
收藏 人收藏

    評論

    相關推薦

    鴻蒙原生頁面高性能解決方案上線OpenHarmony社區 助力打造高性能原生應用

    性能鴻蒙原生應用。 Nodepool:優化頁面滑動流暢性Nodepool旨在解決應用頁面滑動卡頓問題。開發中,相似頁面因業務和代碼差異,組件復用性差,引發卡頓、丟幀,影響用戶體驗。N
    發表于 01-02 18:00

    鴻蒙Flutter實戰:14-現有Flutter 項目支持鴻蒙 II

    分別安裝官方的3.22版本,以及鴻蒙社區的 3.22.0 版本 3.搭建 Flutter鴻蒙開發環境 參考文章《鴻蒙Flutter實戰:0
    發表于 12-26 14:59

    MCF8316A調指南

    電子發燒友網站提供《MCF8316A調指南.pdf》資料免費下載
    發表于 11-20 17:21 ?0次下載
    MCF8316A<b class='flag-5'>調</b><b class='flag-5'>優</b>指南

    MCT8315A調指南

    電子發燒友網站提供《MCT8315A調指南.pdf》資料免費下載
    發表于 11-12 14:14 ?1次下載
    MCT8315A<b class='flag-5'>調</b><b class='flag-5'>優</b>指南

    鴻蒙Flutter實戰:08-如何調試代碼

    # 鴻蒙Flutter實戰:如何調試代碼 ## 1.環境搭建 參考文章[鴻蒙Flutter實戰:01-搭建開發環境](https://g
    發表于 10-23 16:29

    鴻蒙Flutter實戰:07混合開發

    # 鴻蒙Flutter實戰:混合開發 鴻蒙Flutter混合開發主要有兩種形式。 ## 1.基于har 將flutter module
    發表于 10-23 16:00

    MMC DLL調

    電子發燒友網站提供《MMC DLL調.pdf》資料免費下載
    發表于 10-11 11:48 ?0次下載
    MMC DLL<b class='flag-5'>調</b><b class='flag-5'>優</b>

    MMC SW調算法

    電子發燒友網站提供《MMC SW調算法.pdf》資料免費下載
    發表于 09-20 11:14 ?0次下載
    MMC SW<b class='flag-5'>調</b><b class='flag-5'>優</b>算法

    HarmonyOS實戰開發-Flex布局性能提升使用指導

    長度分配設置為最常用場景的布局結果,使子組件主軸長度總和等于Flex容器主軸長度。 最后 如果大家覺得這篇內容對學習鴻蒙開發有幫助,我想邀請大家幫我三個小忙: 點贊,轉發,有你們的 『點贊和評論
    發表于 05-10 14:26

    HarmonyOS實戰開發-深度探索與打造個性化自定義組件

    今天分享一下 什么是自定義組件?及其自定義組件實戰。 做過前端或者android開發的都知道自定義組件
    發表于 05-08 16:30

    HarmonyOS實戰開發-如何使用全局狀態保留能力彈窗來實現評論組件

    開發有幫助,我想邀請大家幫我三個小忙: 點贊,轉發,有你們的 『點贊和評論』,才是我創造的動力。 關注小編,同時可以期待后續文章ing?,不定期分享原創知識。 更多鴻蒙最新技術知識點,請關注作者博客:鴻蒙
    發表于 05-07 15:06

    深度解析JVM調實踐應用

    Tomcat自身的調是針對conf/server.xml中的幾個參數的調設置。首先是對這幾個參數的含義要有深刻而清楚的理解。
    的頭像 發表于 04-01 10:24 ?503次閱讀
    深度解析JVM<b class='flag-5'>調</b><b class='flag-5'>優</b>實踐應用

    鴻蒙開發實戰:【藍牙組件

    藍牙服務組件為設備提供接入與使用Bluetooth的相關接口,包括BLE設備gatt相關的操作,以及BLE廣播、掃描等功能。
    的頭像 發表于 03-13 17:27 ?853次閱讀

    鴻蒙實戰開發Camera組件:【相機】

    相機組件支持相機業務的開發開發者可以通過已開放的接口實現相機硬件的訪問、操作和新功能開發,最常見的操作如:預覽、拍照和錄像等。
    的頭像 發表于 03-08 16:20 ?687次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>實戰</b><b class='flag-5'>開發</b>Camera<b class='flag-5'>組件</b>:【相機】

    鴻蒙實戰項目開發:【短信服務】

    、OpenHarmony 多媒體技術、Napi組件、OpenHarmony內核、Harmony南向開發鴻蒙項目實戰等等)鴻蒙(Harmon
    發表于 03-03 21:29
    主站蜘蛛池模板: 亚洲国产在线精品国| 月夜直播免费看| 欧美男男网站免费观看videos| 两个客户一起吃我的奶| 欧美 亚洲 中文字幕 高清| 色橹橹欧美在线观看视频高清| 无码国产精品高潮久久9| 亚洲精品久久无码AV片银杏 | 久久天天综合| 人人爽天天碰狠狠添| 午夜视频体内射.COM.COM| 中文字幕在线视频网站| 国产精品无码亚洲区艳妇| 久久久久久久免费| 色噜噜狠狠色综合欧洲| 波多结衣一区二区三区| 九九热精品视频在线观看| 强开乳罩摸双乳吃奶视频| 一本久道久久综合狠狠躁AV| 吃春药后的女教师| 久久偷拍国2017| 34g污奶绵uk甩奶| 国产欧美精品国产国产专区| 麻豆国产人妻欲求不满| 无码任你躁久久久久久久| 国产乱色伦影片在线观看| 亚洲欧美日韩精品自拍 | 日本黄色官网| 99精品视频在线观看re| 狠狠色狠狠色综合曰曰| 人妻无码AV中文系列| 夫妻性姿势真人做视频| 美女逼逼毛茸茸| WWW国产精品人妻一二三区| 久久综合色一综合色88| 亚洲视频在线看| 国产亚洲精品久久久久久白晶晶| 人妻兽虐曲| 国内九一激情白浆发布| 亚洲第一页视频| 国产欧美一区二区三区久久|