背景:
平臺(tái):stm32mp151平臺(tái)
什么是OTA?
說(shuō)起OTA我們應(yīng)該都不陌生,它是一種可以為設(shè)備無(wú)損失升級(jí)系統(tǒng)的方式,能將新功能遠(yuǎn)程部署到產(chǎn)品上。
我們不僅可以通過(guò)網(wǎng)絡(luò)下載OTA升級(jí)包,也可以通過(guò)下載OTA升級(jí)包到SD卡或U盤后再對(duì)設(shè)備升級(jí)。
OTA下載方式:
- 短信方式
- PUSH方式
- 網(wǎng)絡(luò)定制
本例網(wǎng)絡(luò)定制方式。
現(xiàn)象描述
本產(chǎn)品通過(guò)OTA升級(jí)測(cè)試,升級(jí)162次,死機(jī)重啟19次,如下圖所示:
死機(jī)重啟分析:
1. 為何oom會(huì)導(dǎo)致重啟?
當(dāng)需要申請(qǐng)物理頁(yè)面時(shí),首先使用快通道申請(qǐng)頁(yè)面,當(dāng)快通道申請(qǐng)不到將會(huì)進(jìn)入慢通道,當(dāng)慢通道也無(wú)法申請(qǐng)是將觸發(fā)oom-killer,正常情況下會(huì)殺死消耗物理頁(yè)面最多的進(jìn)程,而設(shè)備直接進(jìn)入PANIC然后重啟。當(dāng)申請(qǐng)物理頁(yè)面時(shí)free頁(yè)面很多情況也會(huì)存在頁(yè)面申請(qǐng)失敗的現(xiàn)象,一方面可能內(nèi)存外碎片化嚴(yán)重,另一方面可能是無(wú)法借用其他遷移類型內(nèi)存。因此盡量不要使能panic_on_oom,但設(shè)備使能該參數(shù),如下圖所示:
若去掉使能選項(xiàng),oom-killer將會(huì)殺掉物理頁(yè)最大進(jìn)程,因此應(yīng)該殺死藍(lán)牙進(jìn)程,在升級(jí)過(guò)程中,殺掉藍(lán)牙進(jìn)程對(duì)業(yè)務(wù)無(wú)任何影響。下圖為不開啟參數(shù)而殺掉最大物理頁(yè)進(jìn)程:
2. 為何free頁(yè)面很多但是還是會(huì)進(jìn)入oom?
當(dāng)前我們已經(jīng)知道因/proc/sys/vm/panic_on_oom=1 導(dǎo)致進(jìn)入oom后便會(huì)panic然后重啟,但為何內(nèi)存不足呢?我們的日志提示還有126M物理頁(yè)處于空閑可用,不應(yīng)該會(huì)進(jìn)入內(nèi)存申請(qǐng)失敗的情況。
細(xì)看可知gfp_mask=0x101cc0,則MIGRATE_MOVABLE未置1,導(dǎo)致ALLOC_CMA未置1,既不允許使用cma_pages,
當(dāng)CMA頁(yè)面不允許使用時(shí),實(shí)際所剩余可申請(qǐng)的頁(yè)面數(shù):free減去free_cma,free_cma提示120多M(高達(dá)實(shí)際物理內(nèi)存一半),所以剩余非遷移屬性的頁(yè)面只剩幾M:
解決措施:
因此除了關(guān)閉panic_on_oom,還應(yīng)該去查查為何free_cma為何可以分配的那么多,而不做最大值限制,通過(guò)啟動(dòng)日志可看出系統(tǒng)CMA的最大限制為128M,如下圖所示:
CMA我們分配竟然達(dá)到了50%物理內(nèi)存,因此將CMA降成64M大小,以釋放64M用于非遷移屬性頁(yè)面申請(qǐng)。通過(guò)uboot傳參cma=64M,可將cma最大值設(shè)置為64M。