<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    嵌入式/X86下linux系統死機及內存優化

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    一.  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中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全