嵌入式/X86下linux系統死機及內存優化
一. CPU 過高或死鎖導致系統卡死
1. CPU占用過高
(1)開線程太多導致CPU占用過高,系統卡死
解決:優化應用層業務邏輯,有些業務不必開線程就不開
(2)頻繁清緩存導致讀spi-flash頻繁,引起CPU過高
解決:在內核中文件系統部分進行處理,不去清緩存,然后在應用層用后臺服務進程清緩存。這樣可能導致系統內存不夠用,這樣就需要再對系統內存進行優化
2. CPU死鎖
(1)Spinlock+死等導致死鎖
(2)應用層pthread_mutex_lock死鎖
3. CPU過熱導致系統啟動失敗
(1)CPU超過BIOS的設定閾值導致內核啟動失敗
(2)CPU確實太熱,加風扇、扇熱片,或者對結構進行優化
4. 灰塵太多、環境惡劣等因素導致電源異常
二. 內存問題導致系統死機
1. 虛擬內存耗盡
(1)線程開太多,導致虛擬內存到達3G,出現主程序掛死,但系統不會死機
確認方法:假如系統進程號為pid,那么查看/proc/pid/status可以看到開的線程數及虛擬、物理內存。另外用top也可以看到虛擬內存或物理內存,有的Busybox編譯問題,看不到物理內存占用情況,這樣就要根據/proc/pid/status,或者查看如下字段:
cat /proc/pid/stat | awk -F" " '{print "virt:"$23}'
cat /proc/pid/stat | awk -F" " '{print "rss:"$24}'
解決方法:調整應用層策略,可不開的線程就不開
2. 物理內存耗盡(OOM)
(1)這種一般都是內存泄露問題
確認方法:
A. 通過top確認物理內存增長情況
B. 通過/proc/pid/status統計物理內存增長情況,或者/proc/pid/stat
解決方法:
(1)通過review malloc/free來解決
(2)通過工具檢查valgrind、oprofile、perf等工具
(3)靜態檢查工具:flint、pclint
(2)確實物理內存不夠用
解決方法:內存優化
3. 內存碎片過多,伙伴系統大塊內存耗盡
這是系統會出現內存OOM,通過OOM或者/proc/sysrq-tigger可以看到伙伴系統、slab緩存的內存分布情況,根據使用地方進行優化。
我們出現過一個問題,CPU過高時產生大量內存碎片,而CPU過高是因為清緩存后CPU讀flash導致,CPU讀flash到內存會產生內存碎片,這樣可以通過CPU清緩存的時機來解決,或者就不去清緩存。
其他內存碎片處理方法:
三. 硬件問題
(1)外接串口一端懸空產生天線效應導致串口中斷過多
(2)SIO信號干擾導致大量中斷產生,系統卡住
四. 開機速度優化方法
(1)精簡內核業務,沒有用到的模塊可以不編譯進去,這種模塊還是很多的
(2)將可以開機后加載的驅動編譯成ko單獨加載
(3)通過編譯器編譯選項優化
(4)增加flash的讀取速度,調整flash時鐘
(5)使用非壓縮內核
(6)關閉串口打印輸出
(7)XIP技術(eXecute In Place)
內核XIP:直接在flash/ROM中運行內核,或者使用非壓縮內核vmlinux肯定比zImage、uImage快
文件系統XIP:比如cramfs文件系統,只把用到的部分讀取到RAM中,要比jiffs2節省時間
(8)圖形界面系統采用直接寫framebuff,而不用C++/QT的GUI
五. 內存優化方法
(1)物理內存實在不夠,即使沒有內存泄露也不夠,考慮交換內存
(2)優化數據結構,合理申請內存
(3)在適當的時間進行內存回收
(4)堆內存最小單位為16字節所以應盡量減少小塊內存的申請,避免內存浪費
(5)調整M_MMAP_THRESHOLD,降低mmap的門檻,會降低內存空洞的風險,但也會增加系統調用,降低性能。
(6)調整M_TRIM_THRESHOLD,減少堆頂連續內存門檻,釋放更多的堆頂內存。
(7)使用ptmalloc工具、oprofile、valgrind、perf等工具優化
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成