對于開發(fā)及運(yùn)維人員來講,火焰圖是一個經(jīng)典的定位性能問題的方法。利用火焰圖可以可視化系統(tǒng)資源(cpu占用、內(nèi)存占用、調(diào)度、IO等)的占用情況,從而幫助技術(shù)人員快速定位資源異常使用的代碼級根因,或者觀察潛在性能劣化趨勢,進(jìn)而優(yōu)化系統(tǒng)和應(yīng)用的性能。
然而,現(xiàn)有流行的火焰圖工具往往存在一個或多個局限性,實(shí)際應(yīng)用場景比較有限。因此,openEuler上的開源項(xiàng)目A-Ops中的gala-ops系列組件提供了適用于云原生的全棧持續(xù)性能監(jiān)測火焰圖。
傳統(tǒng)火焰圖在實(shí)際應(yīng)用中的痛點(diǎn)
1.傳統(tǒng)火焰圖工具相對獨(dú)立,難以對接第三方插件或集成到運(yùn)維系統(tǒng),在應(yīng)用中需要有經(jīng)驗(yàn)的開發(fā)人員手動結(jié)合其他調(diào)試工具分析定位。
2.由于開銷較大,火焰圖大多僅僅作為工具在開發(fā)和調(diào)試階段被使用,不能在生產(chǎn)環(huán)境中常態(tài)化部署。所以對于更常見的場景——即實(shí)際生產(chǎn)環(huán)境中的突發(fā)性的性能問題,火焰圖并不是定位問題的有效手段。
3.生產(chǎn)環(huán)境上中部署的應(yīng)用類型錯綜復(fù)雜,語言紛繁多樣,而且很多應(yīng)用是會調(diào)用不同語言的模塊。但是每種火焰圖工具往往只針對單一類型的語言。即使同時部署了不同語言的火焰圖觀測工具,所生成的火焰圖數(shù)據(jù)又難以統(tǒng)一,從系統(tǒng)角度難以觀測不同語言應(yīng)用的性能占比。
4.傳統(tǒng)火焰圖往往只能觀測進(jìn)程,線程粒度,是host時代的工具。對于云原生系統(tǒng)更關(guān)注的容器粒度,傳統(tǒng)火焰圖無法直觀區(qū)分。
gala-ops火焰圖的四大特性
1.易于部署和集成
gala-ops是針對云基礎(chǔ)設(shè)施灰度故障的應(yīng)用級/系統(tǒng)級在線診斷工具,火焰圖探針stackprobe集成在其中的gala-gopher組件內(nèi)。用戶只需一鍵安裝gala-gopher后,在配置文件中開啟或關(guān)閉火焰圖探針即可使用。具體的安裝部署說明可參考gala-gopher文檔。
gala-ops火焰圖默認(rèn)會在本地生成svg格式的火焰圖。另外它也支持pyroscope和grafana等第三方運(yùn)維平臺,僅需在配置文件中填上第三方插件的地址,火焰圖探針程序就會定期自動將火焰圖數(shù)據(jù)上傳到遠(yuǎn)端以方便后續(xù)分析和實(shí)時監(jiān)測。
以下是gala-ops cpu火焰圖對接pyroscope和grafana的示例。通過選擇特定時間段,可以查看到該時間段的火焰圖,函數(shù)cpu占比排序,配合其他系統(tǒng)或應(yīng)用指標(biāo)可以很方便地發(fā)現(xiàn)和定位問題。
2.容器支持
云原生系統(tǒng)中,應(yīng)用以容器形式部署。傳統(tǒng)火焰圖中在進(jìn)行系統(tǒng)級觀測時,最多體現(xiàn)線程名稱,若不同容器示例內(nèi)線程名相同,則調(diào)用棧會合并在一起無法區(qū)分,影響后續(xù)定位定界。gala-ops火焰圖探針能夠自動識別本機(jī)中的pod和container,并在圖里增加工作負(fù)載,容器和進(jìn)程號信息。
若進(jìn)程為工作負(fù)載/容器內(nèi)進(jìn)程,則分別以[Pod]和[Con]前綴標(biāo)記pod和container,進(jìn)程以[
效果圖參見下一段附圖,可見通過查看調(diào)用棧底部第一層,可以明顯區(qū)分主機(jī)進(jìn)程和容器進(jìn)程。
3.全棧支持
gala-ops火焰圖支持編譯型和解釋型語言的混合代碼調(diào)用棧解析。目前已支持的語言包括C,C++,GO,Rust,JAVA。不同語言的應(yīng)用,同一調(diào)用棧中不同語言的函數(shù)/方法,用戶態(tài)和內(nèi)核態(tài),均可在同一火焰圖中統(tǒng)一顯示。而且使用gala-ops火焰圖前不需要針對不同的語言做額外配置或重新部署應(yīng)用,即開即用。
下圖顯示了一個實(shí)測生成的gala-ops cpu火焰圖,以右側(cè)的一個tomcat容器調(diào)用棧為例,從底層往頂層看調(diào)用關(guān)系:tomcat pod內(nèi)包含一個container,containter中有一個pid為2434466的java進(jìn)程,進(jìn)程內(nèi)cpu占用最多的是名為http-nio-8080-e的JVM線程,JVM調(diào)用了C庫函數(shù)thread_native_entry,再往上進(jìn)入了Java方法java.lang.Thread::run,然后經(jīng)過一系列的Java方法調(diào)用,最終走到了ksys_write系統(tǒng)調(diào)用,然后進(jìn)入內(nèi)核態(tài)函數(shù)。
這樣一個Java進(jìn)程從k8s層->OS層->JVM底層實(shí)現(xiàn)->Java方法->內(nèi)核態(tài)函數(shù)——完整的調(diào)用過程就可以通過gala-ops火焰圖追溯到。
4.低開銷
gala-ops火焰圖基于ebpf技術(shù),精簡堆棧采樣邏輯,實(shí)現(xiàn)保持采樣精度(cpu采樣頻率10ms)的同時對被觀測應(yīng)用性能影響很?。ㄒ话阍?%左右)。因此,大規(guī)模生產(chǎn)環(huán)境中也可以持續(xù)開啟gala-ops火焰圖以實(shí)時觀測應(yīng)用性能,這樣即使出現(xiàn)應(yīng)用或系統(tǒng)故障,無需事后重現(xiàn)問題,通過gala-ops火焰圖可以回溯以往任意時刻的系統(tǒng)狀態(tài)。
我們測試了開關(guān)cpu火焰圖對不同應(yīng)用的性能影響:對于本身性能中等,吞吐量中等的應(yīng)用,例如tomcat,tps劣化在1%以下;對于本身性能較高,吞吐量大的應(yīng)用,例如kafka,tps劣化在2%以下。結(jié)果如下:
對比開關(guān)cpu火焰圖探針對tomcat性能的影響:
對比開關(guān)cpu火焰圖探針對kafka寫入MQ消息性能的影響:
gala-ops火焰圖具有易于部署和集成,容器支持,全棧支持,低開銷等特性,使得開發(fā)者和維護(hù)者無論在開發(fā)環(huán)境還是生產(chǎn)環(huán)境均可通過火焰圖的形式預(yù)測潛在問題和定位已發(fā)生問題。
功能的持續(xù)完善
目前gala-ops火焰圖已經(jīng)支持cpu占用,內(nèi)存泄漏兩種類型火焰圖,后續(xù)還會加入對其他系統(tǒng)資源的觀測,例如調(diào)度、網(wǎng)絡(luò)IO、磁盤IO等。此外,對其他語言應(yīng)用的支持也在持續(xù)開發(fā)中。
審核編輯:劉清
-
cpu
+關(guān)注
關(guān)注
68文章
10863瀏覽量
211779 -
JAVA
+關(guān)注
關(guān)注
19文章
2967瀏覽量
104758 -
SVG
+關(guān)注
關(guān)注
0文章
127瀏覽量
16423 -
OPS
+關(guān)注
關(guān)注
0文章
61瀏覽量
18165
原文標(biāo)題:A-Ops性能火焰圖——適用于云原生的全棧持續(xù)性能監(jiān)測工具
文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論