天天看點

Go實戰之常用指令行工具(下)3 環境變量4 邏輯和性能診斷工具

3 環境變量

====

go指令及其調用的工具用于配置參考環境變量。如果環境變量未設定,則go指令使用合理的預設設定。要檢視變量的有效設計可以運作

go env <NAME>

; 要更改變量的預設設計,運作指令

go env -w <NAME>=<VALUE>

通用環境變量

Go實戰之常用指令行工具(下)3 環境變量4 邏輯和性能診斷工具

go env general-purpose

用于cgo的環境變量

Go實戰之常用指令行工具(下)3 環境變量4 邏輯和性能診斷工具

go env cgo

特定于體系結構的環境變量

Go實戰之常用指令行工具(下)3 環境變量4 邏輯和性能診斷工具

go env arch

特殊用途的環境變量

Go實戰之常用指令行工具(下)3 環境變量4 邏輯和性能診斷工具

go env special

go env

中提供但未從環境中讀取的其他資訊

Go實戰之常用指令行工具(下)3 環境變量4 邏輯和性能診斷工具

go env additional

4 邏輯和性能診斷工具

go生态系統提供了大量的API和工具來診斷go程式中的邏輯和性能問題,這一節是對這些可用工具的總結

診斷解決方案可以分為以下幾類

性能分析 這類工具用于分析go程式的複雜性和成本,例如通過它的記憶體使用和頻繁調用的函數來辨別go程式的開銷部分

追蹤 是一種在調用或使用者請求的整個生命周期中檢測代碼以分析延遲的方法,它提供了每個元件對系統的總延遲概述,可以跨越多個go程序進行

調試 允許我們暫停go程式并檢查其執行。程式狀态和流程可以通過調試來驗證

運作時統計和事件 運作時統計和事件的收集和分析為go程式的健康提供了高層次的概述。尖峰/度量的監控名額有助于識别吞吐量、使用率和性能的變化

Tips 一些診斷工具可能互相幹擾。例如,精準記憶體剖析可能影響CPU性能分析的準确性、goroutine阻塞分析會影響排程器跟蹤。是以,單獨使用工具擷取更精确的資訊

性能分析 對于識别昂貴的或頻繁調用的代碼段非常有用。go運作時以pprof可視化工具提供所期望格式的性能分析資料。在測試期間,也可以通過go test或net/http/pprof包中提供的endpoints來收集性能分析資料

由runtime/pprof預定義配置檔案

cpu 決定了程式在actively狀态(而不是在sleeping或waiting I/O)時花費的cpu時間

heap 報告記憶體配置設定示例;用于監視目前和曆史記憶體使用情況,并檢查記憶體洩漏

threadcreate 報告程式中引導建立新線程的部分

goroutine 報告目前所有goroutine的堆棧跟蹤

block 顯示goroutine阻塞等待同步原語(包括timer channels),block profile預設為未啟用狀态,使用runtime.SetBlockProfileRate可以啟用它

mutex 報告鎖争用。當您認為由于互斥争用導緻CPU未充分利用時,請使用此profile。預設情況下mutex profile處于未啟用狀态,通過runtime.SetMutexProfileFraction可以啟用它

其他分析器 在Linux上,可以使用perf工具分析go程式,perf可以配置和解開cgo/SWIG代碼和核心,是以可以深入了解native/kernel性能瓶頸; 在MacOS上,可以使用Instruments分析go程式

生産服務性能分析 分析生産中的程式是安全的,但是啟用某些profile(例如CPU profile)會增加成本。您可能想要定期分析生産服務性能問題,特别是在具有單個程序的多個副本的系統中,周期性地随機挑選一個副本是安全的選擇。選擇一個生産程序,每隔Y秒分析并儲存它的結果以進行可視化分析;然後定期重複。可以手動和/或自動檢查結果以發現問題。性能收集可能互相幹擾,是以建議每次隻收集單個概要檔案

可視化資料分析方法 go使用go tool pprof工具提供text、graph和callgrind可視化

自定義profile go使用者可以通過運作時提供的pprof.Profile建立他們的自定義配置檔案,并使用現有的工具來檢查它們。如下示例将監聽7777端口并以 /custom_debug_path/profile endpoint,為pprof.Profile提供服務

package main

import (
    "log"
    "net/http"
    "net/http/pprof"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/custom_debug_path/profile", pprof.Profile)
    log.Fatal(http.ListenAndServe(":7777", mux))
}      

追蹤 這是一種在調用鍊的整個生命周期中檢測代碼以分析時延的方法,go提供golang.org/x/net/trace包作為每個go節點的最小跟蹤後端,并用一個簡單的dashboard提供一個最小的檢測庫,go還提供了一個可執行的Tracer來追蹤間隔期間内運作時事件。追蹤可以為我們提供

檢測并分析go程序中的應用程式延遲

在一個很長的調用鍊中測量特定調用的成本

找出使用率并改進性能。沒有跟蹤資料,瓶頸并不總是顯而易見

在單體系統中,從程式的建構塊收集診斷資料相對容易,所有子產品都在一個程序中,并共享公共資源來報告日志、錯誤和其他診斷資訊。一旦系統由單體程序擴充到分布式微服務,就很難定位從前端Web伺服器到所有背景的調用,以及響應傳回給使用者。這也是分布式追蹤在測試和分析生産系統方面發揮重要作用的地方

分布式追蹤是一種在使用者請求的整個生命周期中檢測代碼以分析延遲的方法。當系統是分布式的,并且傳統的分析和調試工具無法擴充時,您可能希望使用分布式跟蹤工具來分析使用者請求和RPC的性能。分布式追蹤系統是我們能夠

在大型系統中檢測并分析應用程式延遲

跟蹤使用者請求生命周期内的所有RPC,并檢視僅在生産中可見的內建問題

找出可以應用于我們系統的性能改進。在跟蹤資料收集之前,許多瓶頸是不明顯的

go生态系統為每個追蹤系統提供了不同的分布式跟蹤庫和對後端透明的庫

調試 調試是識别程式錯誤行為的過程,調試器允許我們了解程式的執行流程和目前狀态。go使用者主要使用以下調試器

**Delve ** 作為go程式設計語言的調試器,它支援go的運作時概念和内置類型。Delve正試圖成為一個功能齊全的可靠的go程式調試器

GDB go通過标準go編譯器和gccgo提供GDB支援。堆棧管理、線程和運作時包含不同于執行模型的方面,GDB可能混淆調試器,即使程式是用gccgo編譯的。盡管GDB可以用來調試go程式,但它并不理想,可能會造成混亂

運作時統計和事件 運作時提供使用者内部事件的統計和報告,以便在運作時級别診斷性能和使用問題。使用者可以監視這些統計資訊,以便更好地了解go程式的整體健康和性能。一些經常監視的統計資料和狀态

runtime.ReadMemStats 報告與堆配置設定和垃圾收集相關的度量名額。記憶體統計對于監視程序消耗多少記憶體資源、程序是否可以充分利用記憶體以及捕獲記憶體洩漏是有用的

debug.ReadGCStats 讀取垃圾收集的統計資訊。檢視gc暫停上花費了多少資源是很有用的。它還報告了垃圾收集器暫停和暫停時間百分比的時間線

debug.Stack 傳回目前堆棧跟蹤,堆棧跟蹤對于檢視目前正在運作的goroutine的數量、它們正在執行的操作以及它們是否被阻止非常有用

debug.WriteHeapDump 暫停所有goroutine的執行并允許您将堆轉儲到檔案。堆轉儲是在給定時間内go程序記憶體的快照。它包含所有配置設定的對象以及goroutine、finalizers等

runtime.NumGoroutine 傳回目前goroutine的數目。可以監視該值以檢視是否有足夠的goroutine供使用,或檢測goroutine洩漏

go附帶運作時Execution Tracer來捕獲大量運作時事件。排程、SysCall、垃圾回收、堆大小和其他事件由運作時收集,并可用于go工具跟蹤可視化。Tracer可用于

了解goroutine如何執行

了解一些核心運作時事件,例如GC

識别并行性差的執行

小結

go提供了豐富的指令行和工具,在日常運維開發中熟練使用指令/工具能夠大大提升效率。本文是關于指令行和常用工具的簡單總結,希望能對您有所幫助

參考

https://studygolang.com/articles/23764