首页/新闻资讯/正文详情

TEN Framework 的 PProf Go 應用程式:用 pprof 剖析 Go App 效能與堆積記憶體

发布时间:2026/9/25 6:00:33 来源:云帆数科 栏目:资讯中心
TEN Framework 的 PProf Go 應用程式:用 pprof 剖析 Go App 效能與堆積記憶體
人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载本篇指南以packages/example_apps/pprof_app_go套件為核心介紹如何在 TEN Framework 中直接以 Go 語言編寫支援 pprof 效能分析的應用程式App並說明如何透過環境變數啟動 pprof HTTP 伺服器、週期性傾印堆積heap設定檔以及使用tools/profiler/pprof下的分析腳本把傾印資料轉成文字檔、Excel 或互動式網頁來定位記憶體瓶頸。讀完後你將能建立一個可複製、可上線的 pprof 分析型 TEN App並掌握完整的「傾印 → 分析 → 可視化」工作流。套件概覽什麼是 PProf Go Apppprof_app_go是 TEN Framework 提供的一個app 類型的範例套件它本身是一個以 Go 寫成的 TEN 應用程式內建了基於 Go 標準庫runtime/pprof的效能分析支援。根據套件 manifest.json 的描述其定位是「具有 pprof 效能分析支援的 TEN Framework Go 應用程式」與一般 TEN App 相比它的特別之處在於不需要改寫業務程式碼就能做效能分析——只要設定對應的環境變數App 在啟動時就會自動決定是否要開啟 pprof 伺服器與堆積分析器這讓它特別適合用來觀察長時間運行的語音 Agent 場景中 Go 元件的記憶體變化趨勢。該套件同時是 TEN Framework 官方 pprof 分析流程的標準載體tools/profiler/pprof/README.md 中明確建議「分析 Go 程式效能最簡單的方式就是直接以 pprof_app_go 作為你的 TEN app」。套件結構與依賴關係先從套件佈局理解這是一個如何被組織與發佈的 app 套件packages/example_apps/pprof_app_go/ ├── docs/ # 多語言 READMEen-US / zh-CN / zh-TW / ja-JP / ko-KR ├── BUILD.gn # GN 建置定義打包為 app 套件 ├── LICENSE # Apache-2.0 ├── go.mod # 開發期模組定義 ├── go_release.mod # 發佈套件內使用的模組定義 ├── main.go # App 入口與 pprof 邏輯 ├── manifest.json # 套件清單名稱、版本、依賴 └── property.json # 執行期屬性此處為空物件manifest.json 中的依賴宣告manifest.json 定義了套件身份與必要的執行期依賴{ type: app, name: pprof_app_go, version: 0.11.73, display_name: { locales: { ... } }, description: { locales: { ... } }, tags: [go], dependencies: [ { type: system, name: ten_runtime, version: 0.11.73 }, { type: system, name: ten_runtime_go, version: 0.11.73 } ] }其中dependencies宣告了兩項必需相依ten_runtime與ten_runtime_go兩者皆為 system 型套件這就是文件「前置條件」中所謂「manifest.json 中指定的必需相依性」的實際內容。套件本身帶有go標籤type為app。Go 模組的開發發佈雙軌制Go 依賴採用開發期與發佈期分離的雙 mod 策略開發期的 go.mod 透過replace指令指向原始碼樹內的路徑方便在 monorepo 內直接編譯module app go 1.20 replace ten_framework ../../ten_runtime/binding/go/interface require ten_framework v0.0.0-00010101000000-000000000000發佈期的 go_release.mod 則改為指向套件安裝後本機的ten_packages/system/ten_runtime_go/interfacereplace ten_framework ./ten_packages/system/ten_runtime_go/interface而在 BUILD.gn 的打包資源清單中可以看到go_release.modgo.mod這條規則——發佈時go_release.mod會被改名為go.mod一起打包確保套件在獨立環境中也能正確解析 TEN 的 Go 介面。GN 打包方式BUILD.gn以ten_package模板宣告pprof_app_go為app型套件打包內容包含LICENSE、bin/start、main.go、manifest.json、property.json與docs/**全部文件deps依賴//core/src/ten_runtime/binding/go。若啟用了 ten_managerten_enable_ten_manager還會註冊upload_pprof_app_go_to_server目標用於發佈上傳。核心機制由環境變數驅動的雙模式分析pprof_app_go最關鍵的設計在於分析功能完全由三個環境變數控制不需要改任何程式碼。下表整理自 main.go 與官方分析文件 tools/profiler/pprof/README.md環境變數作用設定範例TEN_PROFILER_SERVER_PORT設定後啟動 pprof HTTP 伺服器監聽指定連接埠export TEN_PROFILER_SERVER_PORT6060TEN_HEAP_DUMP_DIR堆積傾印檔的存放目錄export TEN_HEAP_DUMP_DIR/data/profHEAP_PROFILE_TIME_INTERVAL週期性傾印堆積的時間間隔秒export HEAP_PROFILE_TIME_INTERVAL30三者的組合邏輯是只設定TEN_PROFILER_SERVER_PORT僅啟動 pprof HTTP 伺服器http.ListenAndServe(fmt.Sprintf(:%s, port), nil)可即時查詢各類 profile 資料。同時設定TEN_HEAP_DUMP_DIR與HEAP_PROFILE_TIME_INTERVAL啟動堆積傾印器啟動當下立即傾印一次之後以time.Ticker依設定間隔週期性傾印直到 App 停止。兩者皆未設定App 以一般模式運行不進行任何分析動作對執行效能影響最小。原始碼深度解析傾印與生命週期管理整個分析邏輯集中在 main.go 中僅約 120 行非常適合直接閱讀與修改。以下拆解其核心片段。App 啟動onInit 中啟動分析 goroutinedefaultApp內嵌ten.DefaultApp並額外持有一個stop chan struct{}用於通知分析 goroutine 退出type defaultApp struct { ten.DefaultApp stop chan struct{} }在OnInit中回呼tenEnv.OnInitDone()後立即以 goroutine 啟動分析邏輯main.gogo func(stop chan struct{}) { rtePprofServerPort : os.Getenv(TEN_PROFILER_SERVER_PORT) if rtePprofServerPort ! { fmt.Println(TEN_PROFILER_SERVER_PORT:, rtePprofServerPort) go http.ListenAndServe(fmt.Sprintf(:%s, rtePprofServerPort), nil) } heapDumpDir : os.Getenv(TEN_HEAP_DUMP_DIR) heapTimeInterval : os.Getenv(HEAP_PROFILE_TIME_INTERVAL) if heapDumpDir ! heapTimeInterval ! { interval : 0 fmt.Sscanf(heapTimeInterval, %d, interval) if interval 0 { fmt.Println(heapTimeInterval invalid.) return } // 建立 dir/go 子目錄 if os.MkdirAll(heapDumpDir/go, 0755) ! nil { fmt.Println(Failed to create heapDumpDir) } heapDumpDir heapDumpDir /go // 啟動時立即傾印一次 if err : dumpHeap(heapDumpDir); err ! nil { fmt.Println(dumpHeap failed:, err) } // 之後以 Ticker 週期性傾印 for { t : time.NewTicker(time.Duration(interval) * time.Second) select { case -stop: return case -t.C: if err : dumpHeap(heapDumpDir); err ! nil { fmt.Println(dumpHeap failed:, err) } } } } }(p.stop)幾個值得注意的實作細節間隔參數的合法性檢查HEAP_PROFILE_TIME_INTERVAL會被fmt.Sscanf轉為整數若小於等於 0 會直接印出heapTimeInterval invalid.並結束 goroutine。傾印目錄隔離堆積檔統一放在${TEN_HEAP_DUMP_DIR}/go子目錄中避免與其他語言如 C/C、Python的 profile 檔混淆——TEN 支援多語言元件此設計讓分析腳本可以按語言分開處理。使用runtime/pprof而非net/http/pprof程式的 heap 傾印直接呼叫pprof.WriteHeapProfile因此即使不開啟 HTTP 伺服器也能產生分析檔。堆積傾印dumpHeap傾印動作被封裝在dumpHeap函式main.gofunc dumpHeap(heapDumpDir string) error { timestamp : time.Now().Unix() heapFile, err : os.OpenFile( fmt.Sprintf(heapDumpDir/heap_%d.out, timestamp), os.O_CREATE|os.O_RDWR, 0644, ) if err nil { pprof.WriteHeapProfile(heapFile) heapFile.Close() } return err }每次傾印會以Unix 時間戳命名為heap_timestamp.out這正是後續分析腳本dump_heap_files_to_text.py預設掃描.out結尾檔案的依據。時間戳命名讓多個傾印檔可以依時間排序進而觀察記憶體隨時間的增長趨勢。優雅關閉onDeinit 發送停止訊號在OnDeinit中App 會先向stop通道送訊號讓分析 goroutine 的select分支觸發return退出然後才回呼tenEnv.OnDeinitDone()main.gofunc (p *defaultApp) OnDeinit(tenEnv ten.TenEnv) { fmt.Println(DefaultApp onDeinit) p.stop - struct{}{} tenEnv.OnDeinitDone() }入口標準 TEN App 啟動流程main函式遵循 TEN Framework Go App 的標準寫法——以ten.NewApp(new())建立實例再依序Run(true)與Wait()main.gofunc main() { appInstance, err : ten.NewApp(new()) if err ! nil { fmt.Println(Failed to create app.) } appInstance.Run(true) appInstance.Wait() }快速開始前置條件與安裝前置條件依照 manifest.json 的宣告安裝前需要確保下列 system 型套件可用ten_runtime版本 0.11.73ten_runtime_go版本 0.11.73此外建置需要 Go 1.20 以上的工具鏈見 go.mod 的go 1.20宣告。安裝此套件是標準的 TEN Framework app 套件遵循 TEN Framework 套件安裝指南即透過tman工具安裝安裝後它會作為可執行的 app 被整合進 TEN 應用中。若要在原始碼樹內建置可透過 GN 目標pprof_app_go完成打包見 BUILD.gn。使用方法設定環境變數並啟動分析依照 tools/profiler/pprof/README.md 的建議流程以 pprof_app_go 作為 TEN app 啟動前先設定分析環境變數# 堆積傾印檔將存放於 /data/prof export TEN_HEAP_DUMP_DIR/data/prof # 每 30 秒傾印一次堆積 export HEAP_PROFILE_TIME_INTERVAL30 # pprof 伺服器監聽 6060 連接埠 export TEN_PROFILER_SERVER_PORT6060啟動 App 後若需安裝分析工具 pprof可執行go install github.com/google/pproflatestpprof HTTP 伺服器啟動後此例為連接埠 6060可直接透過瀏覽器或go tool pprof查詢即時 profile。堆積傾印檔會以heap_timestamp.out的格式寫入${TEN_HEAP_DUMP_DIR}/go目錄供後續離線分析。分析傾印資料從 .out 到可讀報告TEN 倉庫在 tools/profiler/pprof 提供了完整的分析工具鏈位於倉庫tools/profiler/目錄下。轉換為文字格式將堆積傾印檔批次轉為go tool pprof -text的文字輸出python3 dump_heap_files_to_text.py -heap_dir/data/prof -text_dir/data/text對應的實作在 dump_heap_files_to_text.py它會以os.walk遞迴掃描heap_dir下所有.out檔逐一呼叫 pprof_cmd.py 中定義的轉換指令def convert_heap_to_text_cmd(heapFile, textFile): # run cmd: go tool pprof -text ${heapFile} ${textFile} return fgo tool pprof -text {heapFile} {textFile}若對應的.txt檔已存在則會跳過避免重複轉換。互動式瀏覽器分析同一個 pprof_cmd.py 也提供了在瀏覽器中以互動式圖形化介面檢視 profile 的指令封裝def show_heap_in_browser_cmd(port, heapFile): # run cmd: go tool pprof -http:${port} ${heapFile} return fgo tool pprof -http:{port} {heapFile}即執行go tool pprof -http:port heapFile可以檢視呼叫圖call graph、火焰圖與各函式的記憶體佔比。批次統計總量get_total_bytes.py 提供了從-text輸出中正規化解析「TOTAL」行、並在 B / KB / MB / GB 單位間換算的工具函式get_total_bytes_from_text方便寫入自訂的批次監控腳本。生成 Excel 報告官方文件亦記載了將所有堆積傾印分析後輸出為 Excel 檔的用法python3 dump_heap_info_to_excel.py -heap_dir/data/prof -output/data/heap.xlsx備註上述命令中的dump_heap_info_to_excel.py於本倉庫當前版本未包含在tools/profiler/pprof目錄中實際可用的腳本為dump_heap_files_to_text.py與utils/下的工具模組以倉庫現況為準執行即可。進階工具gperftools 堆積比對針對更細緻的記憶體趨勢分析倉庫另在 tools/profiler/gperftools 提供一組基於 gperftools 的輔助腳本compare_heaps.py、dump_heap_files_to_raw.py、dump_raw_files_to_text.py等用於把堆積檔轉為 raw 格式、轉成文字並比對多個傾印點之間的差異適合與 pprof 流程搭配交叉驗證。使用限制與注意事項分析模式是選配pprof_app_go只有在設定對應環境變數時才啟動分析TEN_HEAP_DUMP_DIR與HEAP_PROFILE_TIME_INTERVAL必須同時設定才會觸發堆積傾印只設定其中一個不會生效。間隔參數格式HEAP_PROFILE_TIME_INTERVAL需為正整數秒數解析失敗或 ≤ 0 會中止傾印 goroutine。傾印檔案位置heap 檔統一寫在${TEN_HEAP_DUMP_DIR}/go請確保該目錄有寫入權限程式使用0755建立目錄。版本對齊套件依賴ten_runtime/ten_runtime_go0.11.73安裝時需確保與 TEN Framework 執行期版本一致。發佈與開發模組不同自行修改本套件並重新打包時記得維持go.mod開發與go_release.mod發佈的replace指向差異。授權此套件為 TEN Framework 專案的一部分原始碼以 Apache License 2.0 授權見套件內 LICENSE 與main.go檔頭聲明。赞分享人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载相关推荐TEN Framework 性能剖析实践PProf Go App 应用详解与 Go pprof 集成指南TEN Framework 性能剖析实践PProf Go App 应用详解与 Go pprof 集成指南 导读 本文聚焦 TEN Framework 仓库中人工智能AI Agent多模态语音AI 应用OpenClaw Voice WakeGateway 统一管理的唤醒词与多节点同步机制OpenClaw Voice WakeGateway 统一管理的唤醒词与多节点同步机制 本文讲解 OpenClaw 的 Voice Wake语音唤醒词子系人工智能AI Agent多模态语音AI 应用终极指南使用Coil与Compose Multiplatform构建现代化macOS桌面应用终极指南使用Coil与Compose Multiplatform构建现代化macOS桌面应用 Coil是一个专为Android和Compose Multipl移动开发图像处理缓存抽象上一篇终极Go Clean Architecture模板构建高效微服务的最佳实践下一篇7个企业级浏览器自动化架构设计黄金法则基于Chromedp的最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

plannotator PR 描述文本标注(Phase 1)实现剖析:复用既有注释引擎,把 prose 批注送入 Agent 反馈管道
plannotator PR 描述文本标注(Phase 1)实现剖析:复用既有注释引擎,把 prose 批注送入 Agent 反馈管道

【免费下载链接】plannotator Annotate and review coding agent plans and code diffs visually, share with your team, send feedback to agents with one click. 项目地址: https://gitcode.com/gh_mirrors/pl/plannotator 点击查看 免费下载 本文基于仓库中的… · 2026/9/25 6:00:33

Slot _a is unbootable真相:A/B分区机制状态提示而非系统损坏
Slot _a is unbootable真相:A/B分区机制状态提示而非系统损坏

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:00:33

如何免费部署Magnet Player这样的P2P流媒体站点到GitHub Pages?Jekyll+HTTPS避坑指南
如何免费部署Magnet Player这样的P2P流媒体站点到GitHub Pages?Jekyll+HTTPS避坑指南

如何免费部署Magnet Player这样的P2P流媒体站点到GitHub Pages?JekyllHTTPS避坑指南 【免费下载链接】magnet-player Stream torrents directly from your browser using WebTorrent. Paste a magnet link or torrent URL and watch videos instantly with peer-to-… · 2026/9/25 6:00:33

DWG图纸乱码根源剖析:SHX字体替换与映射配置全指南
DWG图纸乱码根源剖析:SHX字体替换与映射配置全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:31:07

从幺蓝破解官网案例拆解软件分发与版本管理技术实践
从幺蓝破解官网案例拆解软件分发与版本管理技术实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:31:01

嵌入式C语言手搓UTF-8编解码与工具函数实战
嵌入式C语言手搓UTF-8编解码与工具函数实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:31:01

SUSCTF 2018线上赛实战复盘:从Web注入到Misc隐写的CTF解题全记录
SUSCTF 2018线上赛实战复盘:从Web注入到Misc隐写的CTF解题全记录

凌晨两点的房间里,我盯着终端上滚动的报错信息,整个人处于一种既兴奋又抓狂的状态。SUSCTF 2018线上赛已经进行了二十个小时,作为一支临时凑起来的三人小队,我们手头还有四道题没解出来,而最让我在意的,是那… · 2026/9/25 6:31:01

ESP32上WASM无法直接调用硬件的三大根本原因
ESP32上WASM无法直接调用硬件的三大根本原因

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 6:30:55

如何用treg做AI搜索?Tavily、Exa等搜索API在Agent中的终极用法
如何用treg做AI搜索?Tavily、Exa等搜索API在Agent中的终极用法

如何用treg做AI搜索?Tavily、Exa等搜索API在Agent中的终极用法 【免费下载链接】treg OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn 项目地址: https://gitcode.com/GitHub_Trending/treg/treg treg(开源的&… · 2026/9/25 6:30:55

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码