一個非侵入式跟蹤分析程序
otel-profiling-agent為elastic開源項目,用于對生產(chǎn)環(huán)境中的應(yīng)用程序進行性能分析,幫助開發(fā)者理解程序的運行情況,識別瓶頸,優(yōu)化性能。用于包括CPU和內(nèi)存使用情況的分析、調(diào)用跟蹤、性能指標收集等功能。它是一個用于Linux的全系統(tǒng)、跨語言的性能分析器,通過eBPF(Extended Berkeley Packet Filter)實現(xiàn),eBPF 起初是為了網(wǎng)絡(luò)數(shù)據(jù)包過濾而設(shè)計的,但其功能已經(jīng)大幅擴展,現(xiàn)在它可以用于各種內(nèi)核子系統(tǒng),包括但不限于網(wǎng)絡(luò)、安全、性能監(jiān)控、系統(tǒng)跟蹤和診斷等。
根據(jù)官方描述其有如下特點:
1、CPU和內(nèi)存占用極低(測試中上限為1% CPU和250MB內(nèi)存)。
2、支持原生C/C++程序,無需DWARF調(diào)試信息。
3、支持無框架指針和無主機調(diào)試符號的系統(tǒng)庫分析。
4、支持混合堆棧跟蹤,從內(nèi)核空間到高級語言。
5、支持多種語言的原生代碼分析,無需主機上的調(diào)試符號。
6、支持廣泛的高級語言(HLLs),如JVM、Python、Ruby、PHP、Node.js、V8、Perl等,.NET正在準備中。
7、100%非侵入性,無需在被分析的進程中加載代理或庫。
不需要重新配置、儀器化或重啟HLL解釋器和VM,代理支持在默認配置中展開每種支持的語言。
8、支持原生inline frames,提供編譯器優(yōu)化的洞察并提供更高精確度的函數(shù)調(diào)用鏈。
現(xiàn)有實現(xiàn)
有了它在對Java程序進行性能分析時就可以在極低的性能損失下進行,目前的Java程序性能分析/跟蹤實現(xiàn)都是基于Java Agent方案實現(xiàn)的。基于Java Agent是在對的程序侵入性下進行的,侵入性意味著對程序可能會照成比較大影響代碼邏輯、性能、系統(tǒng)資源等,還可能因為該程序的漏洞導(dǎo)致生產(chǎn)程序出現(xiàn)安全性問題。
在基于Java Agent的方案下分析/跟蹤Java程序的性能損失極端情況下可能達到10%或?qū)е鲁绦虮罎ⅲ@對生產(chǎn)環(huán)境下的程序影響比較大。
而otel-profiling-agent可以在極低資源占用下實現(xiàn)對Java程序進行非侵入式的跟蹤分析。
使用
官方并沒有提供編譯好的otel-profiling-agent文件,如想嘗試可自己編譯該項目生成二進制文件。除了源碼編譯外官方還提供了基于Docker鏡像的編譯文件,可使用Docker編譯減少編譯環(huán)境導(dǎo)致的問題。
編譯完成后可運行如下指令:
sudo ./otel-profiling-agent -collection-agent=127.0.0.1:11000 -disable-tls

注意,運行上面指令需要先開啟一個采集器代理用于接收otel-profiling-agent上報的監(jiān)控數(shù)據(jù),如沒有啟動代理該程序無法啟動。官方提供了devfiler桌面應(yīng)用程序用于通過火焰圖可視化采集數(shù)據(jù)。

collection-agent所接收的數(shù)據(jù)

devfiler可視化
啟動程序即可通過采集器觀察到otel-profiling-agent所上報的數(shù)據(jù)。otel-profiling-agent為一個gRPC客戶端程序,采集器為一個gRPC服務(wù)端程序。
由于otel-profiling-agent剛開源,目前相關(guān)周邊生態(tài)支持還不夠完善,官方提供了一個devfiler桌面應(yīng)用程序,用于本地可視化代理輸出的工具。opentelemetry-collector對otel-profiling-agent也還沒有支持。目前官方正在籌備將其捐贈給OpenTelemetry基金會。
浙公網(wǎng)安備 33010602011771號