go程序中使用pprof增加程序監控功能

1.什么是 pprof?
pprof 是 Go 內置的性能分析工具,用于生成程序運行時的性能分析數據。它可以幫助開發者分析:

CPU 使用情況
內存分配情況
Goroutine 狀況
系統調用分析等
2. 如何使用 pprof?
要使用 pprof,首先需要在 Go 代碼中引入 net/http/pprof 包,并啟動一個 HTTP 服務器以提供性能分析接口。

  1. 使用 pprof 分析 Go 程序
    啟動 Go 程序:

go run main.go
啟動程序后,訪問 http://localhost:6060/debug/pprof/,查看提供的接口。

假設你要分析 30 秒的 CPU 性能:

go tool pprof http://localhost:6060/debug/pprof/cpu?seconds=30
運行后,下載到本地的 CPU 分析數據文件為 cpu.pprof,然后可以使用 go tool pprof 進一步分析。

例如,使用以下命令查看分析結果:

go tool pprof cpu.pprof
在 pprof 的交互界面中,你可以輸入 top 查看 CPU 消耗最多的函數,或者使用 web 生成 SVG 圖形查看分析結果。

示例代碼如下:

package util
import (log "github.com/sirupsen/logrus""net/http""runtime""strconv""sync""github.com/gorilla/mux""net/http/pprof"
)// 定義全局 pprof 控制開關和互斥鎖
var (enablePprof   boolenablePprofMu sync.MutexblockRate     int        // 新增阻塞采樣率mutexFraction int        // 新增互斥鎖采樣比例configMu      sync.Mutex // 新增配置鎖
)func InitPprof() {// 初始化 pprof 狀態enablePprof = false// 創建路由器r := mux.NewRouter()// 注冊 pprof 相關路由//curl http://localhost:6060/debug/pprof/enbaler.HandleFunc("/debug/pprof/enable", pprofEnableHandler)//curl http://localhost:6060/debug/pprof/disabler.HandleFunc("/debug/pprof/disable", pprofDisableHandler)// 新增配置接口//curl http://localhost:6060/debug/pprof/set-block-rate?rate=1000r.HandleFunc("/debug/pprof/set-block-rate", setBlockRateHandler)//curl http://localhost:6060/debug/pprof/set-mutex-fraction?fraction=1r.HandleFunc("/debug/pprof/set-mutex-fraction", setMutexFractionHandler)// 啟動 pprof 服務go startPprofServer(r)
}// 新增阻塞采樣率設置處理器
//  rate值	實際采樣間隔	    適用場景
//    0	     完全禁用	    生產環境默認配置
//    1	  記錄所有阻塞事件	    精確調試但性能開銷最大
//   1000  約1微秒采樣一次    平衡精度與開銷的通用配置
//   1e6   約1毫秒采樣一次    高并發場景下的低開銷采樣配置
func setBlockRateHandler(w http.ResponseWriter, r *http.Request) {rate, err := strconv.Atoi(r.URL.Query().Get("rate"))if err != nil || rate < 0 {http.Error(w, "Invalid rate parameter", http.StatusBadRequest)return}configMu.Lock()defer configMu.Unlock()blockRate = rateruntime.SetBlockProfileRate(blockRate)if _, err := w.Write([]byte("Block profile rate updated")); err != nil {log.Errorf("Failed to write enable response: %v", err)}
}// 新增互斥鎖采樣設置處理器
//行為邏輯:
//當參數fraction ≤ 0 時:關閉互斥鎖采樣
//當參數fraction = 1 時:記錄所有互斥鎖爭用事件
//當參數fraction > 1 時:按比例采樣(例如設為4時,每4次爭用事件采樣1次)
func setMutexFractionHandler(w http.ResponseWriter, r *http.Request) {fraction, err := strconv.Atoi(r.URL.Query().Get("fraction"))if err != nil || fraction < 0 {http.Error(w, "Fraction must be 0 or 1", http.StatusBadRequest)return}configMu.Lock()defer configMu.Unlock()mutexFraction = fractionruntime.SetMutexProfileFraction(mutexFraction)if _, err := w.Write([]byte("Mutex profile fraction updated")); err != nil {log.Errorf("Failed to write enable response: %v", err)}
}// 啟動 pprof 服務
func startPprofServer(r *mux.Router) {pprofRouter := r.PathPrefix("/debug/pprof/").Subrouter()// 通用包裝函數wrapPprofHandler := func(handler http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {checkAndHandlePprof(w, r, handler)}}// 注冊標準路徑(經過包裝)pprofRouter.HandleFunc("/", wrapPprofHandler(pprof.Index))pprofRouter.HandleFunc("/cmdline", wrapPprofHandler(pprof.Cmdline))pprofRouter.HandleFunc("/profile", wrapPprofHandler(pprof.Profile))pprofRouter.HandleFunc("/symbol", wrapPprofHandler(pprof.Symbol))pprofRouter.HandleFunc("/trace", wrapPprofHandler(pprof.Trace))// 注冊特殊路徑(經過包裝)profiles := []string{"allocs", "heap", "goroutine", "block", "mutex", "threadcreate"}for _, profile := range profiles {pprofRouter.Handle("/"+profile,wrapPprofHandler(pprof.Handler(profile).ServeHTTP), // 關鍵修改)}// 啟動 pprof 監聽if err := http.ListenAndServe(":6060", r); err != nil {log.Errorf("pprof server failed: %v", err)}
}func pprofEnableHandler(w http.ResponseWriter, r *http.Request) {enablePprofMu.Lock()defer enablePprofMu.Unlock()enablePprof = trueif _, err := w.Write([]byte("pprof enabled")); err != nil {log.Errorf("Failed to write enable response: %v", err)}
}func pprofDisableHandler(w http.ResponseWriter, r *http.Request) {enablePprofMu.Lock()defer enablePprofMu.Unlock()enablePprof = false// 關閉互斥鎖以及阻塞采樣runtime.SetBlockProfileRate(0)runtime.SetMutexProfileFraction(0)if _, err := w.Write([]byte("pprof disabled")); err != nil {log.Errorf("Failed to write disable response: %v", err)}}// 檢查 pprof 啟用狀態并處理請求
func checkAndHandlePprof(w http.ResponseWriter, r *http.Request, handler func(http.ResponseWriter, *http.Request)) {enablePprofMu.Lock()defer enablePprofMu.Unlock()if !enablePprof {http.Error(w, "pprof is disabled", http.StatusForbidden)return}handler(w, r)
}

之后在main函數中啟動:

	util2.InitPprof()

其中github.com/gorilla/mux 是 Go 語言中的一個非常流行的路由(Router)包,它提供了一個強大的 HTTP 路由器,能夠幫助開發者更方便地定義 HTTP 路由規則,進行 URL 路由匹配、請求處理等操作
例如:

package mainimport ("fmt""log""net/http""github.com/gorilla/mux"
)// 處理根路由
func HomeHandler(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "Welcome to the Home Page!")
}// 處理帶有路徑變量的路由
func UserHandler(w http.ResponseWriter, r *http.Request) {vars := mux.Vars(r)userId := vars["id"]fmt.Fprintf(w, "User ID: %s\n", userId)
}// 處理查詢參數的路由
func ArticleHandler(w http.ResponseWriter, r *http.Request) {query := r.URL.Query().Get("query")fmt.Fprintf(w, "Article Search Query: %s\n", query)
}func main() {// 創建一個新的路由器r := mux.NewRouter()// 定義路由規則r.HandleFunc("/", HomeHandler)r.HandleFunc("/user/{id:[0-9]+}", UserHandler) // 路徑中帶有動態變量 idr.HandleFunc("/article", ArticleHandler)      // 路由匹配查詢參數// 啟動 HTTP 服務器log.Println("Starting server on :8080")log.Fatal(http.ListenAndServe(":8080", r))
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72518.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72518.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72518.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

javaweb自用筆記:Vue

Vue 什么是vue vue案例 1、引入vue.js文件 2、定義vue對象 3、定義vue接管的區域el 4、定義數據模型data 5、定義視圖div 6、通過標簽v-model來綁定數據模型 7、{{message}}直接將數據模型message展示出來 8、由于vue的雙向數據綁定&#xff0c;當視圖層標簽input里的…

376_C++_云透傳,板端負責處理透傳數據的API函數,用于實現客戶端對設備內部接口的訪問(VMS把數據直接傳給板端內部)

RsApi_PassThrough 云透傳,板端負責處理透傳數據的API函數,用于實現客戶端對設備內部接口的訪問(VMS把數據直接傳給板端內部) 我來分析一下 RsApi_PassThrough 函數的作用和實現邏輯: 1. 功能概述 RsApi_PassThrough 是一個透傳接口,用于處理 /API/Http/PassThrough 的…

基于eRDMA實測DeepSeek開源的3FS

DeepSeek昨天開源了3FS分布式文件系統, 通過180個存儲節點提供了 6.6TiB/s的存儲性能, 全面支持大模型的訓練和推理的KVCache轉存以及向量數據庫等能力, 每個客戶端節點支持40GB/s峰值吞吐用于KVCache查找. 發布后, 我們在阿里云ECS上進行了快速的復現, 并進行了性能測試, ECS…

計算機畢業設計SpringBoot+Vue.js醫院掛號就診系統(源碼+文檔+PPT+講解)

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

Linux的用戶與權限--第二天

認知root用戶&#xff08;超級管理員&#xff09; root用戶用于最大的系統操作權限 普通用戶的權限&#xff0c;一般在HOME目錄內部不受限制 su與exit命令 su命令&#xff1a; su [-] 用戶名 -符號是可選的&#xff0c;表示切換用戶后加載環境變量 參數為用戶名&#xff0c…

計算機網絡軟考

1.物理層 1.兩個主機之間發送數據的過程 自上而下的封裝數據&#xff0c;自下而上的解封裝數據&#xff0c;實現數據的傳輸 2.數據、信號、碼元 碼元就是數字通信里用來表示信息的基本信號單元。比如在二進制中&#xff0c;用高電平代表 “1”、低電平代表 “0”&#xff0c…

第四十一:Axios 模型的 get ,post請求

Axios 的 get 請求方式 9.雙向數據綁定 v-model - 鄧瑞編程 Axios 的 post 請求方式&#xff1a;

【JQuery—前端快速入門】JQuery 操作元素

JQuery 操作元素 1. 獲取/修改元素內容 三個簡單的獲取元素的方法&#xff1a; 這三個方法即可以獲取元素的內容&#xff0c;又可以設置元素的內容. 有參數時&#xff0c;就進行元素的值設置&#xff0c;沒有參數時&#xff0c;就進行元素內容的獲取. 接下來&#xff0c;我們需…

2025年4月1日-2日AutoCable 中國汽車線束線纜及連接技術創新峰會即將開幕

正如人體的心臟與四肢之間需要靠神經和血管連接&#xff0c;汽車的各個部件&#xff0c;也要靠各種電線、管道連接。線束&#xff0c;就是汽車的神經和血管&#xff0c;車主向汽車下達的每一個功能指令&#xff0c;都通過線束來傳遞&#xff0c;看似不起眼的線束&#xff0c;卻…

編程題 - 汽水瓶【JavaScript/Node.js解法】

目錄 題目描述 解題思路 代碼實現 復雜度分析 代碼解釋 輸入輸出處理 題目描述 有這樣一道經典的編程題&#xff1a;某商店規定&#xff1a;三個空汽水瓶可以換一瓶汽水。小張手上有 n 個空汽水瓶&#xff0c;他最多可以換多少瓶汽水喝&#xff1f; 解題思路 這是一個…

深度學習神經網絡分類原理

每一個神經元做的是一個類似回歸的操作 最后一層是softmax函數&#xff0c;每一個輸出就會變成一個0到1之間的數&#xff0c;也就是概率&#xff0c;然后他們之間的和加起來等于1&#xff0c;到底是哪一個分類就是看哪個神經元的這個值最大。 那么如何算損失呢&#xff1a; 加…

硬核技術組合!用 DeepSeek R1、Ollama、Docker、RAGFlow 打造專屬本地知識庫

文章目錄 一、引言二、安裝Ollama部署DeepSeekR1三、安裝Docker四、安裝使用RAGFlow4.1 系統架構4.2 部署流程4.3 使用RAGFlow4.4 在RAGFlow中新增模型4.5 創建知識庫4.6 創建私人助理使用RGA 一、引言 本地部署DeepSeek R1 Ollama RAGFlow構建個人知識庫&#xff0c;通過將…

前端實現OSS上傳圖片(Vue3+vant)

首先&#xff0c;下面這些信息從阿里云服務器OSS管理中獲取 aliyun:oss:file:endpoint: "oss-cn-beijing.aliyuncs.com"keyid: "xxxxxxxxx"keysecret: "xxxxxxxxxxxx"bucketname: "xxxx"一、安裝OSS npm install ali-oss 二、以下步…

huggingface NLP主要知識點以及超級詳解使用

1.安裝huggingface依賴庫 pip install transformers pip install datasets pip install pytorch pip install tokenizers pip install diffusers pip install accelerate pip install evaluate pip install optimum pip install pillow pip install requests pip install gr…

Spark核心之02:常用算子詳解

1、RDD操作詳解 # 啟動spark-shell spark-shell --master local[2] 1.1 基本轉換 1) map map是對RDD中的每個元素都執行一個指定的函數來產生一個新的RDD。 任何原RDD中的元素在新RDD中都有且只有一個元素與之對應。 舉例&#xff1a; scala> val a sc.parallelize(1 …

MySQL 8.X 報錯處理

1.重新加載配置 reload the configuration mysql> ALTER INSTANCE RELOAD KEYRING; ERROR 1227 (42000): Access denied; you need (at least one of) the ENCRYPTION_KEY_ADMIN privilege(s) for this operation 提示需要ENCRYPTION_KEY_ADMIN權限 重新授權 GRANT ENCR…

SQL注入練習場:PHPStudy+SQLI-LABS靶場搭建教程(零基礎友好版)

注意&#xff1a;文中涉及演示均為模擬測試&#xff0c;切勿用于真實環境&#xff0c;任何未授權測試都是違法行為&#xff01; 一、環境準備 下載PHPStudy 官網下載地址&#xff1a;https://www.xp.cn/php-study&#xff08;選擇Windows版&#xff09; 安裝時建議選擇自定…

現今大語言模型性能(準確率)比較

現今大語言模型性能(準確率)比較 表頭信息:表的標題為“大語言模型性能比較結果”(英文:Table 1: Large Language Model Performance Comparison Results),表明該表是用于對比不同大語言模型的性能。列信息: 模型:列出參與比較的不同大語言模型名稱,包括LLAMA3(70B)…

Docker創建自定義網橋并指定網段

前言 docker0是Docker默認網絡的核心組件, 通過虛擬網橋和NAT技術, 實現了容器間的通信以及容器與外部網絡的交互。然而, docker0網段是固定的(通常是172.17.0.0/16), 為了更靈活地管理容器網絡&#xff0c;Docker支持創建自定義網橋&#xff0c;允許用戶指定網段。 例如, 在…

【向量數據庫Weaviate】 和Elasticsearch的區別

Weaviate 和 Elasticsearch 是兩種不同類型的數據庫&#xff0c;設計目標和應用場景有顯著差異。以下是它們的核心區別和適用場景的詳細對比&#xff1a; 1. 設計目標與核心能力 維度WeaviateElasticsearch核心能力向量數據庫 圖數據庫&#xff08;語義搜索優先&#xff09;全…