一個非侵入式跟蹤分析程式

AiFly發表於2024-06-24

otel-profiling-agent為elastic開源專案,用於對生產環境中的應用程式進行效能分析,幫助開發者理解程式的執行情況,識別瓶頸,最佳化效能。用於包括CPU和記憶體使用情況的分析、呼叫跟蹤、效能指標收集等功能。它是一個用於Linux的全系統、跨語言的效能分析器,透過eBPF(Extended Berkeley Packet Filter)實現,eBPF 起初是為了網路資料包過濾而設計的,但其功能已經大幅擴充套件,現在它可以用於各種核心子系統,包括但不限於網路、安全、效能監控、系統跟蹤和診斷等。
根據官方描述其有如下特點:
1、CPU和記憶體佔用極低(測試中上限為1% CPU和250MB記憶體)。
2、支援原生C/C++程式,無需DWARF除錯資訊。
3、支援無框架指標和無主機除錯符號的系統庫分析。
4、支援混合堆疊跟蹤,從核心空間到高階語言。
5、支援多種語言的原生程式碼分析,無需主機上的除錯符號。
6、支援廣泛的高階語言(HLLs),如JVM、Python、Ruby、PHP、Node.js、V8、Perl等,.NET正在準備中。
7、100%非侵入性,無需在被分析的程序中載入代理或庫。
不需要重新配置、儀器化或重啟HLL直譯器和VM,代理支援在預設配置中展開每種支援的語言。
8、支援原生inline frames,提供編譯器最佳化的洞察並提供更高精確度的函式呼叫鏈。

現有實現

有了它在對Java程式進行效能分析時就可以在極低的效能損失下進行,目前的Java程式效能分析/跟蹤實現都是基於Java Agent方案實現的。基於Java Agent是在對的程式侵入性下進行的,侵入性意味著對程式可能會照成比較大影響程式碼邏輯、效能、系統資源等,還可能因為該程式的漏洞導致生產程式出現安全性問題。
在基於Java Agent的方案下分析/跟蹤Java程式的效能損失極端情況下可能達到10%或導致程式崩潰,這對生產環境下的程式影響比較大。
而otel-profiling-agent可以在極低資源佔用下實現對Java程式進行非侵入式的跟蹤分析。

使用

官方並沒有提供編譯好的otel-profiling-agent檔案,如想嘗試可自己編譯該專案生成二進位制檔案。除了原始碼編譯外官方還提供了基於Docker映象的編譯檔案,可使用Docker編譯減少編譯環境導致的問題。
編譯完成後可執行如下指令:

sudo ./otel-profiling-agent -collection-agent=127.0.0.1:11000 -disable-tls

1.png

注意,執行上面指令需要先開啟一個採集器代理用於接收otel-profiling-agent上報的監控資料,如沒有啟動代理該程式無法啟動。官方提供了devfiler桌面應用程式用於透過火焰圖視覺化採集資料。

2.png
collection-agent所接收的資料

3.png
devfiler視覺化

啟動程式即可透過採集器觀察到otel-profiling-agent所上報的資料。otel-profiling-agent為一個gRPC客戶端程式,採集器為一個gRPC服務端程式。
由於otel-profiling-agent剛開源,目前相關周邊生態支援還不夠完善,官方提供了一個devfiler桌面應用程式,用於本地視覺化代理輸出的工具。opentelemetry-collector對otel-profiling-agent也還沒有支援。目前官方正在籌備將其捐贈給OpenTelemetry基金會。

倉庫地址:https://github.com/elastic/otel-profiling-agent

相關文章