做Linux開發(fā)或運維的你,是否常被這些問題困擾:服務(wù)突然卡頓卻找不到根源,CPU占用率飆升但查不到“罪魁禍首”,系統(tǒng)響應(yīng)變慢卻摸不清瓶頸?其實,Linux內(nèi)核早已為我們準備了“透視鏡”——trace跟蹤技術(shù),今天就手把手教你從生成trace文件到可視化分析,搞定性能難題!

一、先搞懂:trace分析的核心工具
在開始實操前,我們先理清幾個關(guān)鍵工具的作用,避免“知其然不知其所以然”:
?debugfs/tracefs:Linux內(nèi)核提供的調(diào)試文件系統(tǒng),是trace分析的“基礎(chǔ)設(shè)施”。debugfs用于暴露內(nèi)核調(diào)試信息,tracefs專門記錄內(nèi)核/應(yīng)用的事件(如CPU調(diào)度、系統(tǒng)調(diào)用),后續(xù)工具都依賴這兩個文件系統(tǒng)。
?atrace:Android團隊推出的跟蹤工具(也適用于Linux),能收集內(nèi)核事件(sched調(diào)度、syscalls系統(tǒng)調(diào)用)和應(yīng)用活動(如線程狀態(tài)),生成原始trace文件。
?catapult:Google開源的性能分析套件,其中trace2html工具能將原始trace文件轉(zhuǎn)成交互式HTML報告,讓我們用可視化方式快速定位問題。
?adb:跨設(shè)備傳輸工具,當(dāng)我們在嵌入式Linux(如開發(fā)板)或Android設(shè)備上分析時,用它實現(xiàn)本地電腦與目標設(shè)備的文件傳輸。
二、手把手實操:從0生成trace分析報告
接下來我們以“分析某Linux服務(wù)卡頓”為例,按步驟完成整個流程,所有命令都已標注細節(jié),新手也能跟著做!
步驟1:檢查核心文件系統(tǒng)是否掛載
首先要確認debugfs和tracefs已掛載——這是后續(xù)操作的前提,沒掛載的話工具會“罷工”。
在目標Linux設(shè)備(或通過adb連接的遠程設(shè)備)上執(zhí)行:
|
#檢查debugfs是否掛載
mount | grep debugfs
#檢查tracefs是否掛載
mount | grep trace
|
關(guān)鍵補充:
?如果執(zhí)行后無輸出(文件系統(tǒng)未掛載),手動掛載(需root權(quán)限):
|
#掛載debugfs到默認路徑
mount -t debugfs debugfs /sys/kernel/debug
#掛載tracefs到默認路徑
mount -t tracefs tracefs /sys/kernel/tracing
|
?不同Linux發(fā)行版路徑可能有差異(如部分嵌入式設(shè)備是/debug),可通過find / -name debugfs查找實際路徑。
步驟2:上傳工具到目標設(shè)備
我們需要將兩個關(guān)鍵文件傳到目標設(shè)備:atrace.sh(封裝atrace命令的腳本,簡化參數(shù)配置)和catapult-main.zip(可視化工具包)。
在本地電腦(Windows為例)打開命令行,執(zhí)行adb傳輸命令:
|
# 1.上傳atrace.sh腳本到目標設(shè)備的根目錄(/)
adb push C:Usersmdg_rDesktoppullatrace.sh /
# 2.上傳catapult工具壓縮包到根目錄
adb push C:Usersmdg_rDesktoppullcatapult-main.zip /
# 3.給atrace.sh添加可執(zhí)行權(quán)限(Linux文件默認無執(zhí)行權(quán))
adb shell chmod 777 /atrace.sh
|
小知識:
?chmod 777表示所有用戶(所有者、組、其他)都有讀、寫、執(zhí)行權(quán)限,測試環(huán)境用很方便;生產(chǎn)環(huán)境建議縮小權(quán)限(如chmod 700,僅所有者可執(zhí)行)。
?如果目標設(shè)備不是Android(如Ubuntu服務(wù)器),無需用adb,直接用scp傳輸文件:scp C:xxxatrace.sh user@服務(wù)器IP:/。
步驟3:生成原始trace文件
執(zhí)行atrace.sh腳本,收集系統(tǒng)運行數(shù)據(jù)。腳本參數(shù)my_trace是輸出文件名,3表示跟蹤3秒(根據(jù)需求調(diào)整,建議1-5秒,避免文件過大)。
在目標設(shè)備上執(zhí)行:
|
#進入根目錄
cd /
#運行腳本,跟蹤3秒,輸出到my_trace文件
./atrace.sh my_trace 3
|
深入理解:
?atrace.sh本質(zhì)是封裝了atrace命令,你也可以直接用原生命令自定義跟蹤內(nèi)容,比如只跟蹤CPU調(diào)度和系統(tǒng)調(diào)用:
|
#原生atrace命令:跟蹤sched(調(diào)度)、syscalls(系統(tǒng)調(diào)用),持續(xù)3秒
atrace --set_events sched,syscalls -o my_trace 3
|
?常見跟蹤事件類型:sched(CPU調(diào)度)、gfx(圖形渲染,適合UI場景)、disk(磁盤I/O)、mem(內(nèi)存活動),根據(jù)性能問題類型選擇。
步驟4:將trace文件轉(zhuǎn)成可視化HTML
原始trace文件是純文本,幾百行甚至幾十萬行數(shù)據(jù),直接看根本看不懂——這時候catapult的trace2html就派上用場了,能把數(shù)據(jù)轉(zhuǎn)成帶時間軸的交互式報告。
先解壓catapult工具包,再執(zhí)行轉(zhuǎn)換命令:
|
# 1.解壓catapult壓縮包(如果已解壓可跳過)
unzip catapult-main.zip
# 2.執(zhí)行trace2html,生成HTML報告
./catapult-main/tracing/bin/trace2html --config chrome --output my_trace.html my_trace
|
關(guān)鍵說明:
?--config chrome表示按Chrome瀏覽器的報告格式生成(最常用,支持豐富的視圖);
?執(zhí)行后會生成my_trace.html文件,這個就是我們最終要分析的“性能報告”。
步驟5:拉取報告到本地分析
目標設(shè)備(如開發(fā)板)可能沒有瀏覽器,把HTML文件拉回本地電腦,用Chrome、Edge等瀏覽器打開分析。
在本地電腦執(zhí)行adb拉取命令:
|
adb pull /my_trace.html C:Usersmdg_rDesktoppull
|
至此,我們就完成了從“收集數(shù)據(jù)”到“生成報告”的全流程,接下來就是最核心的——分析報告找問題!
三、核心技巧:怎么從HTML報告中揪出性能瓶頸?
打開my_trace.html后,主要關(guān)注3個核心視圖,90%的性能問題都能在這里找到答案:
1.時間軸視圖(Timeline):看“卡頓點”
這是最直觀的視圖,橫向是時間(從跟蹤開始到結(jié)束),縱向分3層:
?CPU核心層:每個CPU核心的運行狀態(tài)(綠色=運行,灰色=空閑,橙色=中斷);
?進程層:每個進程的活動時間線;
?線程層:每個線程的狀態(tài)(Running =運行,Waiting =等待,Sleeping =休眠)。
分析方法:
?找“異常等待”:如果某個業(yè)務(wù)線程長時間處于Waiting狀態(tài)(比如超過100ms),可能是CPU資源不足(被其他進程搶占)或鎖競爭(線程等鎖);
?看“時間斷層”:如果整個時間軸突然有一段無活動(灰色),可能是系統(tǒng)調(diào)用阻塞(如磁盤I/O卡住)。
2. CPU占用視圖(CPU Usage):找“吃CPU的進程”
這個視圖用柱狀圖或折線圖展示每個CPU核心的占用率,以及每個進程對CPU的消耗占比。
分析方法:
?看“峰值”:如果某進程的CPU占用率突然飆升到90%以上,且持續(xù)時間長,那它很可能是性能瓶頸;
?看“核心負載均衡”:如果只有1個CPU核心占用率高,其他核心空閑,可能是進程線程數(shù)太少,或存在單線程瓶頸。
3.事件詳情視圖(Event Details):查“耗時操作”
點擊時間軸上的任意事件(如sys_read系統(tǒng)調(diào)用、sched_switch調(diào)度事件),會彈出詳情面板,顯示:
?事件開始/結(jié)束時間、持續(xù)時長;
?關(guān)鍵參數(shù)(如sys_read的文件描述符、讀取字節(jié)數(shù));
?調(diào)用棧(如果開啟了棧跟蹤)。
分析方法:
?找“長耗時事件”:比如sys_write耗時超過50ms,可能是磁盤寫入速度慢;sched_switch頻繁,可能是進程切換太頻繁(上下文切換開銷大);
?看“調(diào)用棧”:如果某函數(shù)調(diào)用耗時久,可順著調(diào)用棧定位到具體代碼(需配合符號表)。
四、避坑指南:這些問題別踩!
1.trace有性能開銷,生產(chǎn)環(huán)境慎用
跟蹤過程會消耗CPU和內(nèi)存(尤其是跟蹤事件多、時長久時),生產(chǎn)環(huán)境建議:①縮短跟蹤時長(1-3秒);②只跟蹤關(guān)鍵事件(如只跟蹤sched+syscalls);③避開業(yè)務(wù)高峰期。
2.權(quán)限不夠?先提權(quán)!
掛載tracefs/debugfs、運行atrace都需要root權(quán)限,執(zhí)行命令前加sudo(如sudo ./atrace.sh),或切換到root用戶(su root)。
3.文件太大打不開?先篩選事件
如果trace文件超過100MB,HTML報告可能加載緩慢,建議在生成trace時用--set_events篩選事件,比如只跟蹤與業(yè)務(wù)相關(guān)的進程:atrace -p 1234(進程ID)-o my_trace 3。
4.工具兼容性問題
?atrace在非Android設(shè)備上需安裝依賴:Ubuntu/CentOS可執(zhí)行sudo apt install android-tools-adb(部分系統(tǒng)需手動編譯atrace);
?catapult需要Python環(huán)境(Python 2.7或3.x),如果執(zhí)行trace2html報錯,先檢查Python是否安裝:python --version。
五、總結(jié)
今天我們用“檢查文件系統(tǒng)→上傳工具→生成trace→轉(zhuǎn)HTML→分析報告”的流程,完整走了一遍Linux trace性能分析。這套方法的核心優(yōu)勢是:
?底層可見:能看到內(nèi)核級事件(如調(diào)度、系統(tǒng)調(diào)用),比top、ps等工具更深入;
?可視化直觀:HTML報告比純文本日志更容易定位問題;
?跨場景適用:嵌入式Linux、服務(wù)器、Android設(shè)備都能用。
如果你的項目中遇到了特殊的性能問題(比如內(nèi)存泄漏、網(wǎng)絡(luò)延遲),或者對trace分析有疑問,歡迎在評論區(qū)留言!需要atrace.sh腳本模板或catapult工具包的朋友,也可以私信我獲取~
-
內(nèi)核
+關(guān)注
關(guān)注
4文章
1467瀏覽量
42872 -
cpu
+關(guān)注
關(guān)注
68文章
11277瀏覽量
224952 -
Linux
+關(guān)注
關(guān)注
88文章
11758瀏覽量
219009
發(fā)布評論請先 登錄
Linux系統(tǒng)性能指南
Linux性能分析實戰(zhàn):用trace揪出卡頓、高CPU的“真兇”
評論