[問題] Out of memory (已爬文)

作者: kuangs (kuangs)   2014-12-27 11:33:18
想請問各位前輩
我在Linux(2.6.36) 上寫了一個"收UART資料 存到SD"的程式
在測試的時候發現擺了約1天後 就發生out of memory 死機
(確認沒有我的程式 不會out of mmemory死機)
使用過 mtrace 來抓程式碼memory leak
但結果並無 memory leak
只有一個link list 沒有free 是我來存設定檔的
我在 開機後一分鐘 和 擺了半天後 各抓了一份 /proc/slabinfo
發現有兩個值相差過大 而且都持續增加不會減少
開機
inode_cache 552 658 272 14 1 : tunables 54 27 0 : slabdata 47 47 0
size-32 7200 7260 128 30 1 : tunables 120 60 0 : slabdata 242 242 0
半天
inode_cache 36246 36246 272 14 1 : tunables 54 27 0 : slabdata 2589 2589 0
size-32 41010 41010 128 30 1 : tunables 120 60 0 : slabdata 1367 1367 0
這兩個項目代表 inode_cache(filesystem) size-32(malloc 使用這個)
網路上查了一下 可下 sync;echo 3 > /proc/sys/vm/drop_caches
手動清除 pagecache、dentry、inode
但用過之後情況並沒有改善
我也有檢查過我的程式 所以malloc 都有 free
想請問
1.inode_cache 除了 用 /proc/sys/vm/drop_caches 手動清除
還有甚麼方法可以清除?
5B
2.size-32 我已確定我的程式有malloc 的地方都有做free
有fopen 的地方 都有fclose
為甚麼 size-32 的 使用數 還是一直往上加??
3.使用thread 會是造成這個問題的原因嗎??
作者: kdjf (我抓得到什麼呢?)   2014-12-27 13:14:00
你寫的東西是driver?
作者: kuangs (kuangs)   2014-12-27 14:01:00
不是driver 純粹收uart(從/dev/ttyUSB) 存到sd卡
作者: kenduest (小州)   2014-12-27 16:30:00
感覺還是你的程式本身佔用太多記憶體所以 crash你可以簡單寫個 script 放在 crontab 內定期執行程式碼就是跑 ps aux | grep your_program > result.txt然後檢視一下記憶體佔用狀態,可以初步確認是否該問題
作者: readonly (唯讀)   2014-12-27 16:40:00
感覺是kernel mmc/sd driver 的問題。
作者: kuangs (kuangs)   2014-12-27 16:51:00
readonly 大大 請問會這樣認為 是因為inode_cache 的原因嗎?
作者: kenduest (小州)   2014-12-27 17:07:00
系統 cache 本身有管理機制,不大可能因為用太多而當掉
作者: danny8376 (釣到一隻猴子@_@)   2014-12-27 23:58:00
inode_cache不管怎長都無所謂 有需要系統會自己清....
作者: kdjf (我抓得到什麼呢?)   2014-12-28 17:15:00
會不會是跟driver要了什麼東西後沒有放掉? 軟體本身memeryleak頂多就被oom killer砍了,系統一般不會掛點
作者: bitlife (BIT一生)   2014-12-28 19:01:00
樓上指出重點,通常只有kernel和driver會搞死系統,user程式除非是用來專攻os漏洞的,不然幾乎只會死自己不死系統
作者: fourdollars (四元)   2014-12-29 13:48:00
感覺你是檔案打開後沒有做相對應的關閉動作,導致開啟的檔案數量太多,超過了系統上限,並不是記憶體洩漏的問題。
作者: kuangs (kuangs)   2014-12-29 14:28:00
to fourdollar: 寫檔案我採用 開檔>寫入>關閉每1hr 換一個檔案有考慮用 開檔 > 寫檔 (到達換檔案條件1hr)>關檔這兩種方法會有差別嗎??to kdjf : 是發生out of memory 然後開始砍程式 砍完memory 也沒釋放 最後沒東西砍 就死機了!!
作者: kenduest (小州)   2014-12-29 17:57:00
還是你要用 bash 的 ulimit 限制一下當下的資源環境限制一下 file handle 與 memory 使用最大限制超過使用量就可以限制住,資源也不會過度被耗費使用只是你程式可能最後會 crash,但是系統至少不會 crash
作者: kdjf (我抓得到什麼呢?)   2014-12-29 18:22:00
你怎麼讀uart的? 把code放上來吧
作者: fourdollars (四元)   2014-12-30 08:55:00
也許可以定期去檢查 /proc/<pid>/ 底下有多少個數字檔案來驗證是不是我所說的檔案數量過多的問題。
作者: kuangs (kuangs)   2014-12-30 11:11:00
https://github.com/choushane/serial.git GITHUBto fourdollars : 是看/proc/<pid>/limit 這檔案嗎??裡面 只有 max stack size = 2088960 Max open file=1024Max locked memory=65536 Max msgqueue size = 819200這四個有值 其他都是unlimitedto kenduest : 這是個辦法!但是我比較想正解.. 找出問題所在!

Links booklink

Contact Us: admin [ a t ] ucptt.com