"); //-->
Linux 的性能問題,依賴于各類性能工具,針對不同性能場景,選擇合適的工具,可以大大提高整個(gè)性能優(yōu)化的效率,下圖是性能問題和工具圖譜:

受限本文篇幅和側(cè)重,結(jié)合征程系列 SoC 調(diào)優(yōu)實(shí)踐,主要展開介紹下面的工具及使用。
1.1. toptop 命令可以動態(tài)地持續(xù)監(jiān)聽系統(tǒng)及進(jìn)程的運(yùn)行狀態(tài),為用戶提供 CPU 使用率、內(nèi)存使用情況、CPU 負(fù)載信息,除此之外,該命令還提供了一個(gè)交互界面,用戶可以根據(jù)需要進(jìn)行調(diào)整。
通過 top 命令分析內(nèi)存使用狀態(tài)比較簡單清晰,本文就不做贅述。
由于智能駕駛的應(yīng)用場景復(fù)雜,CPU 處于較高水平的邏輯和運(yùn)算占用,導(dǎo)致系統(tǒng)的負(fù)載和使用率長期處于較高水平,是性能優(yōu)化的主要方向之一。
注:
智能駕駛應(yīng)用場景中系統(tǒng)負(fù)載是和使用率同步升高,基本不存在 IO 或其他導(dǎo)致的負(fù)載提升,所以本文提到的負(fù)載和使用率的描述均可理解為使用率。
使用 top 命令監(jiān)控系統(tǒng)及各進(jìn)程的 CPU 使用率,是分析 CPU 占用高問題的主要方法,在使用前需要了解 top 的原理和限制,從而正確的使用和提取有效信息,進(jìn)行有效分析。
1.1.1. top 的原理top 命令的實(shí)現(xiàn)是通過采樣 proc 下系統(tǒng)和進(jìn)程的 stat 下的各類時(shí)間信息,經(jīng)過計(jì)算得出來的平均使用率等信息。
CPU 時(shí)間信息(單位為 jiffies):
/proc/stat
記錄了 CPU 從系統(tǒng)啟動開始累計(jì)到當(dāng)前時(shí)刻各類事件信息。
/proc/$PID/stat
記錄了進(jìn)程從啟動開始累計(jì)到當(dāng)前時(shí)刻各類事件信息。
使用率計(jì)算方法
stat 節(jié)點(diǎn)記錄了的是從開機(jī)/進(jìn)程啟動后累計(jì)的時(shí)間信息,但這不能體現(xiàn)在當(dāng)前時(shí)間段的實(shí)際負(fù)載情況,實(shí)際 CPU 使用率的計(jì)算方法如下(system、user、irq、softirq 等類似):
采樣的開始時(shí)間 T1,結(jié)束時(shí)刻 T2:
Total(T1-T2) = (user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1)
Idle(T1-T2) = (idle2 - idle1)
CPU Usage (T1-T2) = 1 - Idle / Total
不難理解,最終 CPU 使用率主要受到從 CPU 獲取到的時(shí)間信息,和采樣周期時(shí)間的影響。
1.1.2. top 的限制CPU 負(fù)載顯示模式
Linux 上 top 命令的 CPU 占用率顯示有兩種模式:
Irix 模式,按單個(gè) CPU 上的算力計(jì)算。
Solaris 模式,按所有 CPU 做平均計(jì)算。
例如一個(gè) 8 核系統(tǒng),CPU0 上一個(gè)進(jìn)程 CPU 占用率是 100%,其它 CPU 是 idle:
Irix 模式,CPU0 占用顯示 100%,進(jìn)程的 CPU 也是 100%。
Solaris 模式,CPU0 占用顯示 12.5%,進(jìn)程的 CPU 也是 12.5%。
當(dāng)前 Busybox 的 top 命令,PER CPU 的顯示默認(rèn)是 Irix 模式,進(jìn)程顯示是 Solaris 模式。
top 周期的選定
CPU 的使用率受到周期的影響,在 CPU 繁忙時(shí)使用“top -d1”和“top -d5”的結(jié)果差異是非常大的,周期越大,越接近實(shí)際平均負(fù)載。 考慮這樣的一種極端場景,在 1s 的時(shí)間內(nèi),前 100ms 負(fù)載 100%,后 900ms CPU 全部 idle,以 1s 為周期,負(fù)載就是 10%,以 100ms 為周期,負(fù)載就出現(xiàn)了 100% 的情況,基于以上情況考慮,我們一般建議以 5s 作為 top 的周期(“top -d5”)。
另外,需要特別注意的是,top 命令適用于長時(shí)間的負(fù)載檢測,對于一次性負(fù)載檢查(”top -n1”),top 實(shí)現(xiàn)中第一次 top 計(jì)算的周期是 200ms,以 200ms 周期計(jì)算出來的 CPU 使用率非常不準(zhǔn),會對整體分析產(chǎn)生誤導(dǎo)。
CPU 使用率中包含 iowait
一般理解中 CPU 使用率是指 CPU 忙占 CPU 總時(shí)間的比值,處于 iowait 的線程實(shí)際并不占用 CPU,但是目前幾乎所有的統(tǒng)計(jì)工具中,都把 iowait 統(tǒng)計(jì)到 CPU 使用率中。
1.1.3. top 的使用征程系列系統(tǒng)軟件默認(rèn)集成了 top 命令,使用方法如下:
Usage: top [options] Options: -b, --batch-mode run in non-interactive batch mode -c, --cmdline-toggle reverse last remembered 'c' state -d, --delay =SECS [.TENTHS] iterative delay as SECS [.TENTHS] -E, --scale-summary-mem =SCALE set mem as: k,m,g,t,p,e for SCALE -e, --scale-task-mem =SCALE set mem with: k,m,g,t,p for SCALE -H, --threads-show show tasks plus all their threads1.2. df
用于顯示系統(tǒng)磁盤使用情況,當(dāng)磁盤/文件系統(tǒng)快滿的時(shí)候,文件系統(tǒng)及磁盤硬件性能都會受到影響。
1.3. free&procrankfree 用于顯示系統(tǒng)級內(nèi)存使用情況,通過/proc/meminfo 可檢查系統(tǒng)內(nèi)存使用的細(xì)節(jié)。
procrank 用于顯示系統(tǒng)各進(jìn)程的內(nèi)存使用情況,查找內(nèi)存使用超載或泄漏進(jìn)程。
當(dāng)內(nèi)存緊張時(shí),系統(tǒng)性能表現(xiàn)將會受到較大影響,iowait 的提升也會導(dǎo)致 CPU 使用率也會明顯上升。
Perf 是內(nèi)置于 Linux 內(nèi)核源碼樹中的性能剖析(profiling)工具,作為一款強(qiáng)大的綜合性分析工具,能夠提供從硬件到軟件、從應(yīng)用到內(nèi)核的全棧性能分析方法,常用于性能瓶頸的查找與熱點(diǎn)代碼的定位。
1.4.1. Perf 原理Perf 工具功能強(qiáng)大,通過下面的軟、硬件能力實(shí)現(xiàn)性能 profiling。
Hardware Event 由 PMU 部件產(chǎn)生,在特定的條件下探測性能事件是否發(fā)生以及發(fā)生的次數(shù)。比如 cache 命中。
Software Event 是內(nèi)核產(chǎn)生的事件,分布在各個(gè)功能模塊中,統(tǒng)計(jì)和操作系統(tǒng)相關(guān)性能事件。比如進(jìn)程切換,tick 數(shù)等。
Tracepoint Event 是內(nèi)核中靜態(tài) tracepoint 所觸發(fā)的事件(ftrace),這些 tracepoint 用來判斷程序運(yùn)行期間內(nèi)核的行為細(xì)節(jié),perf 在這種應(yīng)用場景下,可理解為 ftrace 的一種前端工具。
Perf 命令非常多,每個(gè)命令下又有很多子命令,所以本文只針對性介紹一些常用命令。
1.4.2.1. perf list查看當(dāng)前系統(tǒng)軟、硬件支持的性能事件。
1.4.2.2. perf stat統(tǒng)計(jì) cache、branch、context-switches 等軟硬件底層性能指標(biāo)。
使用 ctrl+c 退出。
perf stat -p 追蹤指定進(jìn)程的性能指標(biāo):

實(shí)時(shí)查看當(dāng)前系統(tǒng)中所有(kernel,app)函數(shù)占用率情況,及 irq 統(tǒng)計(jì)。
“perf top -U”,U 統(tǒng)計(jì) kernel 中符號占用率。
“perf top -K”,K 統(tǒng)計(jì)應(yīng)用符號占用率。
“perf top -p ”,統(tǒng)計(jì)制定進(jìn)程的符號占用情況。
“perf top -g”,記錄占用率的同時(shí)保存函數(shù)調(diào)用棧情況。
“perf top -s dso”,以 library&executed 進(jìn)行占用排序。
“perf top -s pid”,以 pid 進(jìn)行占用排序。

perf sched 依賴開啟 ftrace,用于統(tǒng)計(jì)分析調(diào)度相關(guān)信息。
perf sched record -p ,可抓取指定進(jìn)程調(diào)度信息。
perf sched latency –sort max,對 record 的數(shù)據(jù)進(jìn)行 runtime、delay 等時(shí)間分析。
perf sched timehist -wM,對 record 的數(shù)據(jù)進(jìn)行調(diào)度時(shí)延的分析。
root@hobot:~# perf sched record -- sleep 1 [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 1.066 MB perf.data (7233 samples) ] root@hobot:~# root@hobot:~# perf sched latency --sort max ------------------------------------------------------------------------------------------------------------------------------------------- Task | Runtime ms | Switches | Avg delay ms | Max delay ms | Max delay start | Max delay end | ------------------------------------------------------------------------------------------------------------------------------------------- sleep:2329 | 1.120 ms | 1 | avg: 0.000 ms | max: 0.000 ms | max start: 0.000000 s | max end: 0.000000 s rcuc/9:92 | 0.002 ms | 1 | avg: 0.000 ms | max: 0.000 ms | max start: 0.000000 s | max end: 0.000000 s1.4.2.5. 火焰圖
火焰圖是分析系統(tǒng)、進(jìn)程熱點(diǎn)的強(qiáng)大工具,原理是通過 PMU 對 CPU 當(dāng)前運(yùn)行符號(PC)進(jìn)行采樣,再通過火焰圖工具還原整個(gè)調(diào)用棧。
通過火焰圖可以查看 kernel+app 的調(diào)用棧耗時(shí)狀態(tài),查找性能瓶頸。
perf record -g -p ,記錄系統(tǒng)/進(jìn)程的堆棧采樣數(shù)據(jù),默認(rèn) perf.data。
perf script > perf.unflod,對 record 的調(diào)用棧等信息進(jìn)行解析。
將 perf.unflod 導(dǎo)入 PC 機(jī),使用火焰圖工具出解析 perf.svg。
FlameGraph/stackcollapse-perf.pl perf.unflod FlameGraph/flamegraph.pl > perf.svg. FlameGraph 工具從 https://github.com/brendangregg/FlameGraph.git 獲取。
使用 chrome 瀏覽器打開。

Ftrace 功能的作用是幫助開發(fā)人員了解 Linux 內(nèi)核的運(yùn)行時(shí)行為,以便進(jìn)行故障調(diào)試或性能分析。
Ftrace 通過靜態(tài)和動態(tài)插裝,實(shí)現(xiàn)對內(nèi)核核心及熱點(diǎn)函數(shù)的 profiling,對于調(diào)度、io 等問題是最重要的分析手段。
Ftrace 需要使能內(nèi)核 CONFIG_FTRACE,當(dāng)前默認(rèn)打開。
Ftrace 使用 per-cpu 的 ring-buffer,內(nèi)容為二進(jìn)制格式,執(zhí)行效率高。設(shè)置 CONFIG_DYNAMIC_FTRACE 后,加入的 trace 功能在不使用時(shí)對運(yùn)行時(shí)系統(tǒng)性能幾乎沒有影響(初始化會對開機(jī)時(shí)間有一定影響),動態(tài)使能 ftrace 后,對運(yùn)行時(shí)性能會有一定副作用。
Ftrace 的調(diào)度 profiling 在內(nèi)核中對熱點(diǎn)函數(shù)大量埋點(diǎn),導(dǎo)致系統(tǒng)會在幾秒內(nèi)產(chǎn)生百兆以上的 log,通過 log 直接分析性能難度較大,所以一般會引入一些 ftrace 前端工具。
perf、trace-cmd、systemtap、bcc、kernelshark 都是優(yōu)秀的 ftrace 前端工具??梢酝ㄟ^這些工具去分析 ftrace 日志。
專欄文章內(nèi)容及配圖由作者撰寫發(fā)布,僅供工程師學(xué)習(xí)之用,如有侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 聯(lián)系我們
相關(guān)推薦
2035年自動駕駛出租車市場規(guī)模將達(dá)1680億美元
面向算法硬件加速的FPGA實(shí)現(xiàn)方法
vxwokrs下靜態(tài)圖像壓縮算法(上)
PID算法
賦能自動駕駛和機(jī)器人感知,讀懂二維可尋址VCSEL | 硬科技有點(diǎn)意思
ADI:傳感技術(shù)助力未來自動駕駛的發(fā)展
加快實(shí)現(xiàn)自動駕駛(完整小組討論)
實(shí)時(shí)訓(xùn)練駕駛?cè)斯ぶ悄?/a>
76-81GHz自動駕駛CMOS RADAR
自動駕駛正推動汽車行業(yè)加速布局人形機(jī)器人
恩智浦第三代雷達(dá)收發(fā)器助力高性能成像雷達(dá)規(guī)模量產(chǎn),賦能L2+至L4級自動駕駛
數(shù)字PID控制及其改進(jìn)算法的應(yīng)用
[轉(zhuǎn)帖]us/os就緒表的維護(hù)算法分析
目標(biāo)跟蹤算法在紅外熱成像跟蹤技術(shù)上的應(yīng)用
基于LPC2138的血壓測量算法開發(fā)平臺電路圖
CRC算法原理及C語言實(shí)現(xiàn)
數(shù)字PID控制算法之一
地平線HSD引領(lǐng)智能駕駛普惠新時(shí)代
攜手ADI贏得未來
自動駕駛的現(xiàn)狀與未來(節(jié)選)
英偉達(dá) “全天候” 芯片實(shí)現(xiàn)毫秒級人臉檢測
掘金自動駕駛,不要把大坑當(dāng)機(jī)會
無線傳感器網(wǎng)絡(luò)低功耗分簇路由算法設(shè)計(jì)
有關(guān)指紋算法
曲面顯示屏取代傳統(tǒng)汽車擋風(fēng)玻璃
求FSK信號的解調(diào)算法,主要是鐵路上的移頻信號!
計(jì)算機(jī)科學(xué)與技術(shù)反思錄(2)
采用Mean-Shift和Camshift算法相結(jié)合的火焰視頻圖像跟蹤設(shè)計(jì)
簡單實(shí)用的單片機(jī)CRC 快速算法
加密算法之MD5算法