国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

    文章

    4787

    瀏覽量

    90056
  • 內存
    +關注

    關注

    9

    文章

    3209

    瀏覽量

    76357
  • 鴻蒙
    +關注

    關注

    60

    文章

    2963

    瀏覽量

    45883
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    解鎖Zephyr實時操作系統深度調能力

    可以說,代碼編寫只是項目開發的起點,而隨之而來的資源分析與性能調才是確保系統穩定可靠的關鍵環節。
    的頭像 發表于 01-30 09:16 ?5646次閱讀

    Linux系統內核參數調實戰指南

    Linux 內核參數調是系統性能優化的核心環節。隨著云原生架構的普及和硬件性能的飛速提升,默認的內核參數配置往往無法充分發揮系統潛力。在高并發 Web 服務、大數據處理、容器化部署等
    的頭像 發表于 01-28 14:27 ?425次閱讀

    實戰RK3568性能調:如何利用迅為資料壓榨NPU潛能-在Android系統中使用NPU

    實戰RK3568性能調:如何利用迅為資料壓榨NPU潛能-在Android系統中使用NPU》
    的頭像 發表于 11-07 13:42 ?641次閱讀
    <b class='flag-5'>實戰</b>RK3568<b class='flag-5'>性能</b><b class='flag-5'>調</b><b class='flag-5'>優</b>:如何利用迅為資料壓榨NPU潛能-在Android系統中使用NPU

    HarmonyOSAI編程智慧調

    DevEco Studio提供智慧調能力,支持通過自然語言交互,分析并解釋當前實例或項目中存在的性能問題,幫助開發者快速定位影響性能的具體
    發表于 09-01 15:15

    Linux服務器性能調的核心技巧和實戰經驗

    如果你正在為這些問題頭疼,那么這篇文章就是為你準備的!作為一名擁有10年經驗的運維工程師,我將毫無保留地分享Linux服務器性能調的核心技巧和實戰經驗。
    的頭像 發表于 08-27 14:36 ?1044次閱讀

    HarmonyOS AI輔助編程工具(CodeGenie)智慧調

    DevEco Studio提供智慧調能力,支持通過自然語言交互,分析并解釋當前實例或項目中存在的性能問題,幫助開發者快速定位影響性能的具體
    發表于 08-14 11:12

    Linux網絡性能調方案

    在當今高并發、大流量的互聯網環境下,網絡性能往往成為系統的瓶頸。作為一名資深運維工程師,我在生產環境中遇到過無數次因為TCP/IP參數配置不當導致的性能問題。今天分享一套完整的Linux網絡性能
    的頭像 發表于 08-06 18:01 ?1324次閱讀

    Linux系統性能調方案

    關鍵要點預覽:本文將深入解析Linux系統性能瓶頸的根本原因,提供可直接落地的調方案,讓你的系統性能提升30-50%!
    的頭像 發表于 08-06 17:49 ?873次閱讀

    【HarmonyOS 5】金融應用開發鴻蒙組件實踐

    【HarmonyOS 5】金融應用開發鴻蒙組件實踐 ##鴻蒙開發能力 ##HarmonyOS SDK應用服務##
    的頭像 發表于 07-11 18:20 ?954次閱讀
    【HarmonyOS 5】金融應用<b class='flag-5'>開發</b><b class='flag-5'>鴻蒙</b><b class='flag-5'>組件</b>實踐

    鴻蒙5開發寶藏案例分享---Swiper組件性能優化實戰

    鴻蒙寶藏:Swiper組件性能優化實戰,告別卡頓丟幀! 大家好!最近在鴻蒙開發時,偶然發現了官方
    發表于 06-12 17:53

    鴻蒙5開發寶藏案例分享---瀑布流優化實戰分享

    鴻蒙瀑布流性能優化實戰:告別卡頓的寶藏指南! 大家好!最近在鴻蒙文檔里挖到一個 性能優化寶藏庫 ,原來官方早就準備好了各種場景的最佳實踐!今
    發表于 06-12 17:41

    鴻蒙5開發寶藏案例分享---性能檢測工具揭秘

    鴻蒙性能檢測寶藏工具大揭秘!開發實戰避坑指南 大家好呀!我是HarmonyOS開發路上的探索者小明。今天挖到一個官方隱藏的
    發表于 06-12 16:52

    鴻蒙5開發寶藏案例分享---性能體驗設計

    ;性能優化\"關鍵詞! **如果大家在實戰中遇到卡頓難題,歡迎在評論區交流~ 也歡迎關注我,后續會持續分享鴻蒙開發實戰技巧! **? 希望這
    發表于 06-12 16:45

    鴻蒙5開發寶藏案例分享---性能優化案例解析

    鴻蒙性能優化寶藏指南:實戰工具與代碼案例解析 大家好呀!今天在翻鴻蒙開發者文檔時,意外挖到一個 性能
    發表于 06-12 16:36

    鴻蒙5開發寶藏案例分享---應用并發設計

    性能調,這些案例都是華為工程師的血淚經驗結晶。下面用最直白的語言+代碼示例,帶你玩轉HarmonyOS并發開發! ?一、ArkTS并發模型:顛覆傳統的設計 傳統模型痛點 graph
    發表于 06-12 16:19