調(diào)試課(CPU篇)CPU平均負(fù)載深度解析)
文章目錄一、概述二、為什么需要負(fù)載平均值2.1 什么是 loadavg2.2 /proc/loadavg 格式三、基本概念與原理3.1 指數(shù)衰減算法(EMA)3.2 采樣機(jī)制3.3 嵌入式場(chǎng)景的四個(gè)誤區(qū)四、源碼解析4.1 全局變量與采樣入口4.2 calc_load_fold_active:本 CPU 的活躍任務(wù)變化量4.3 calc_global_load:全局負(fù)載更新4.4 負(fù)載計(jì)算流程五、RK3506 設(shè)備樹與負(fù)載參數(shù)5.1 CPU 節(jié)點(diǎn)5.2 RK3506 負(fù)載參數(shù)六、關(guān)鍵特性與約束七、調(diào)試命令與實(shí)戰(zhàn)案例7.1 調(diào)試命令7.2 實(shí)戰(zhàn)案例:高負(fù)載但 CPU 不忙?? 本節(jié)總結(jié)?? 課后練習(xí)各位好,上一章我們認(rèn)識(shí)了 Cortex-A7 這顆 CPU。這一章講一個(gè)現(xiàn)場(chǎng)調(diào)試用得最多的指標(biāo)–平均負(fù)載,也就是/proc/loadavg那三個(gè)數(shù)字。loadavg是運(yùn)維和調(diào)試?yán)镒畛S玫闹笜?biāo),也是現(xiàn)場(chǎng)報(bào)障時(shí)第一個(gè)看的數(shù)字,但絕大多數(shù)人對(duì)它的理解是錯(cuò)的–以為"負(fù)載高就是 CPU 不夠用"。本章的核心使命就是糾正這個(gè)誤解,講清楚"負(fù)載高但 CPU 不忙"是怎么回事。本章大概 35 分鐘,重點(diǎn)放在第三節(jié)的 EMA 算法和第七節(jié)的"高負(fù)載但 CPU 不忙"案例;源碼部分(第四節(jié))按自己的水平取舍,新手先講清采樣流程,衰減系數(shù)的定點(diǎn)數(shù)細(xì)節(jié)可以略過(guò)。開講前建議大家先在板子上cat /proc/loadavg看一眼,再top對(duì)比,直觀感受一下"loadavg 6.5 但 CPU idle 40%"的怪象。一、概述嵌入式設(shè)備在現(xiàn)場(chǎng)卡頓,運(yùn)維的第一反應(yīng)就是看"負(fù)載"。但這里有個(gè)特別普遍的誤解:很多人以為負(fù)載高就是 CPU 不夠用,然后去查 CPU 占用,結(jié)果發(fā)現(xiàn) CPU 還閑著一半,就懵了。其實(shí)/proc/loadavg統(tǒng)計(jì)的不只是"在跑"的任務(wù),還有"在等"的任務(wù)–具體說(shuō),是 R 狀態(tài)(運(yùn)行/就緒)和 D 狀態(tài)(不可中斷等待)的任務(wù)之和。D 狀態(tài)任務(wù)在等 IO,它不占 CPU 時(shí)間,但照樣計(jì)入負(fù)載。這就是"負(fù)載高但 CPU 不忙"的根源。RK3506 是三核,負(fù)載值超過(guò) 3.0 意味著平均每核滿負(fù)荷,超過(guò) 6.0(核數(shù)×2)就是任務(wù)堆積了。本章我們就把 loadavg 的指數(shù)衰減算法、R/D 狀態(tài)的統(tǒng)計(jì)規(guī)則、嵌入式場(chǎng)景的常見(jiàn)誤區(qū)、